@soprog_/cdwt 0.1.0 → 0.1.1
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.md +15 -6
- package/dist/cli.js +38 -7
- package/dist/cli.js.map +1 -1
- package/package.json +2 -2
- package/shell/cdwt.zsh +1 -1
package/README.md
CHANGED
|
@@ -23,9 +23,14 @@ Written in TypeScript, distributed as an `npx`-installable CLI plus a small
|
|
|
23
23
|
Try it once:
|
|
24
24
|
|
|
25
25
|
```sh
|
|
26
|
-
npx @soprog_/cdwt
|
|
26
|
+
npx @soprog_/cdwt root
|
|
27
|
+
npx @soprog_/cdwt new feature/awesome
|
|
28
|
+
npx @soprog_/cdwt
|
|
27
29
|
```
|
|
28
30
|
|
|
31
|
+
Without the shell wrapper, `npx` prints the destination path instead of
|
|
32
|
+
changing your current shell directory.
|
|
33
|
+
|
|
29
34
|
Install for daily use:
|
|
30
35
|
|
|
31
36
|
```sh
|
|
@@ -34,11 +39,14 @@ cdwt install # writes shell function + sources it from ~/.zshrc
|
|
|
34
39
|
exec zsh -l
|
|
35
40
|
```
|
|
36
41
|
|
|
42
|
+
`npm i -g` only installs the `cdwt` executable. Run `cdwt install` once so
|
|
43
|
+
`zsh` loads the shell function that performs the actual `cd`.
|
|
44
|
+
|
|
37
45
|
### From source
|
|
38
46
|
|
|
39
47
|
```sh
|
|
40
|
-
git clone https://github.com/souta0104/
|
|
41
|
-
cd
|
|
48
|
+
git clone https://github.com/souta0104/cdwt.git
|
|
49
|
+
cd cdwt
|
|
42
50
|
pnpm install
|
|
43
51
|
pnpm build
|
|
44
52
|
pnpm link --global
|
|
@@ -75,11 +83,12 @@ section also has its own color so worktrees and branches are visually distinct.
|
|
|
75
83
|
a `[worktree]` row deletes that worktree (with a confirmation prompt).
|
|
76
84
|
|
|
77
85
|
```sh
|
|
78
|
-
cdwt
|
|
86
|
+
cdwt root # skip the picker, jump to the main worktree
|
|
87
|
+
cdwt new feature/awesome # create a new worktree from the default branch
|
|
79
88
|
cdwt -h # show help (bypasses the shell wrapper)
|
|
80
89
|
```
|
|
81
90
|
|
|
82
|
-
|
|
91
|
+
`cdwt root` jumps to the main worktree (the one that holds the
|
|
83
92
|
non-bare `.git` directory), not literally to a worktree of `origin/HEAD`.
|
|
84
93
|
In a typical setup these are the same; if you've checked out a different
|
|
85
94
|
branch in the main worktree, that's what you'll land on.
|
|
@@ -161,7 +170,7 @@ pnpm typecheck # tsc --noEmit
|
|
|
161
170
|
pnpm lint # eslint
|
|
162
171
|
pnpm format # prettier --write .
|
|
163
172
|
pnpm build # tsup → dist/cli.js
|
|
164
|
-
pnpm dev --
|
|
173
|
+
pnpm dev -- root
|
|
165
174
|
```
|
|
166
175
|
|
|
167
176
|
Layout:
|
package/dist/cli.js
CHANGED
|
@@ -48,7 +48,7 @@ var SHELL_FUNCTION = `cdwt() {
|
|
|
48
48
|
return $?
|
|
49
49
|
;;
|
|
50
50
|
esac
|
|
51
|
-
if ! destination="$(command cdwt "$@")"; then
|
|
51
|
+
if ! destination="$(CDWT_SHELL_WRAPPER=1 command cdwt "$@")"; then
|
|
52
52
|
return $?
|
|
53
53
|
fi
|
|
54
54
|
if [[ -z "$destination" ]]; then
|
|
@@ -1375,6 +1375,15 @@ var EXIT_CANCELLED = 130;
|
|
|
1375
1375
|
var MAX_BRANCH_PROMPT_RETRIES = 5;
|
|
1376
1376
|
function printDestination(console, target) {
|
|
1377
1377
|
console.outln(target);
|
|
1378
|
+
warnIfShellWrapperMissing(console);
|
|
1379
|
+
}
|
|
1380
|
+
function warnIfShellWrapperMissing(console) {
|
|
1381
|
+
const stdoutIsTty = Boolean(process.stdout.isTTY);
|
|
1382
|
+
if (!stdoutIsTty || process.env["CDWT_SHELL_WRAPPER"] === "1") return;
|
|
1383
|
+
console.errln(
|
|
1384
|
+
"cdwt: shell integration is not loaded, so this command printed the destination path only."
|
|
1385
|
+
);
|
|
1386
|
+
console.errln("cdwt: run `cdwt install`, then `source ~/.zshrc` or restart your shell.");
|
|
1378
1387
|
}
|
|
1379
1388
|
async function deleteWorktreeAction(ctx, target) {
|
|
1380
1389
|
if (target === ctx.repo.mainWorktree) {
|
|
@@ -1734,19 +1743,41 @@ function buildProgram(consoleFactory) {
|
|
|
1734
1743
|
program.name("cdwt").description(
|
|
1735
1744
|
"Interactive git worktree switcher. Prints the destination path on stdout; use the bundled zsh wrapper (installed via `cdwt install`) so the shell can `cd` into it."
|
|
1736
1745
|
).version("0.1.0").option("-v, --verbose", "write timestamped diagnostic logs to stderr");
|
|
1737
|
-
program.option("--
|
|
1738
|
-
"--new [branch]",
|
|
1739
|
-
"create a new worktree from the default branch and cd into it (prompts for name if omitted)"
|
|
1740
|
-
).option(
|
|
1746
|
+
program.option("--pr", "open the picker pre-filtered to PRs (loads `gh pr list` immediately)").option(
|
|
1741
1747
|
"--config <file>",
|
|
1742
1748
|
"use only the given settings file (overrides .cdwt/settings.json discovery)"
|
|
1743
1749
|
).action(async (opts) => {
|
|
1744
1750
|
const verbose = Boolean(opts.verbose ?? program.opts().verbose);
|
|
1745
1751
|
const console = consoleFactory(verbose);
|
|
1746
1752
|
state.exitCode = await runSelect({
|
|
1747
|
-
defaultBranchOnly:
|
|
1753
|
+
defaultBranchOnly: false,
|
|
1748
1754
|
prFilter: Boolean(opts.pr),
|
|
1749
|
-
|
|
1755
|
+
cwd: process.cwd(),
|
|
1756
|
+
configOverride: opts.config ?? process.env["CDWT_CONFIG"],
|
|
1757
|
+
home: defaultHome2(),
|
|
1758
|
+
console
|
|
1759
|
+
});
|
|
1760
|
+
});
|
|
1761
|
+
program.command("root").description("print the path of the default branch worktree and exit").action(async () => {
|
|
1762
|
+
const verbose = Boolean(program.opts().verbose);
|
|
1763
|
+
const console = consoleFactory(verbose);
|
|
1764
|
+
state.exitCode = await runSelect({
|
|
1765
|
+
defaultBranchOnly: true,
|
|
1766
|
+
cwd: process.cwd(),
|
|
1767
|
+
configOverride: process.env["CDWT_CONFIG"],
|
|
1768
|
+
home: defaultHome2(),
|
|
1769
|
+
console
|
|
1770
|
+
});
|
|
1771
|
+
});
|
|
1772
|
+
program.command("new").description("create a new worktree from the default branch and cd into it").argument("[branch]", "branch name (prompts when omitted)").option(
|
|
1773
|
+
"--config <file>",
|
|
1774
|
+
"use only the given settings file (overrides .cdwt/settings.json discovery)"
|
|
1775
|
+
).action(async (branch, opts) => {
|
|
1776
|
+
const verbose = Boolean(opts.verbose ?? program.opts().verbose);
|
|
1777
|
+
const console = consoleFactory(verbose);
|
|
1778
|
+
state.exitCode = await runSelect({
|
|
1779
|
+
defaultBranchOnly: false,
|
|
1780
|
+
newBranch: branch ?? true,
|
|
1750
1781
|
cwd: process.cwd(),
|
|
1751
1782
|
configOverride: opts.config ?? process.env["CDWT_CONFIG"],
|
|
1752
1783
|
home: defaultHome2(),
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/errors.ts","../src/commands/install.ts","../src/core/rc-file.ts","../src/commands/select.ts","../src/core/paths.ts","../src/core/sections.ts","../src/io/config-loader.ts","../src/core/config.ts","../src/io/exec.ts","../src/io/gh.ts","../src/io/git.ts","../src/core/git-parse.ts","../src/io/repo-context.ts","../src/core/default-branch.ts","../src/ui/fzf.ts","../src/ui/format.ts","../src/ui/selector.ts","../src/commands/slash-commands.ts","../src/ui/command-mode.ts","../src/commands/actions.ts","../src/io/copy-files.ts","../src/core/copy.ts","../src/io/console.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport { CdwtError } from \"./errors.js\";\nimport { runInstall, defaultHome as installHome } from \"./commands/install.js\";\nimport { runSelect, defaultHome as selectHome } from \"./commands/select.js\";\nimport { createDefaultConsole, type ConsoleIO } from \"./io/console.js\";\n\ninterface GlobalFlags {\n verbose?: boolean;\n}\n\ninterface SelectFlags extends GlobalFlags {\n defaultBranch?: boolean;\n pr?: boolean;\n new?: boolean | string;\n config?: string;\n}\n\ninterface InstallFlags extends GlobalFlags {\n rc?: string;\n}\n\n/**\n * Build the commander program. Exit codes flow back through `state.exitCode`\n * so the entry point can call `process.exit` exactly once. Keeping that out\n * of `runSelect` / `runInstall` keeps them testable from unit tests.\n */\nexport function buildProgram(consoleFactory: (verbose: boolean) => ConsoleIO): {\n program: Command;\n state: { exitCode: number };\n} {\n const program = new Command();\n const state = { exitCode: 0 };\n\n program\n .name(\"cdwt\")\n .description(\n \"Interactive git worktree switcher. Prints the destination path on stdout; \" +\n \"use the bundled zsh wrapper (installed via `cdwt install`) so the \" +\n \"shell can `cd` into it.\",\n )\n .version(\"0.1.0\")\n .option(\"-v, --verbose\", \"write timestamped diagnostic logs to stderr\");\n\n program\n .option(\"--default-branch\", \"print the path of the default branch worktree and exit\")\n .option(\"--pr\", \"open the picker pre-filtered to PRs (loads `gh pr list` immediately)\")\n .option(\n \"--new [branch]\",\n \"create a new worktree from the default branch and cd into it (prompts for name if omitted)\",\n )\n .option(\n \"--config <file>\",\n \"use only the given settings file (overrides .cdwt/settings.json discovery)\",\n )\n .action(async (opts: SelectFlags) => {\n const verbose = Boolean(opts.verbose ?? program.opts<GlobalFlags>().verbose);\n const console = consoleFactory(verbose);\n state.exitCode = await runSelect({\n defaultBranchOnly: Boolean(opts.defaultBranch),\n prFilter: Boolean(opts.pr),\n ...(opts.new !== undefined ? { newBranch: opts.new as string | true } : {}),\n cwd: process.cwd(),\n configOverride: opts.config ?? process.env[\"CDWT_CONFIG\"],\n home: selectHome(),\n console,\n });\n });\n\n program\n .command(\"install\")\n .description(\"install the zsh shell wrapper to ~/.local/share/cdwt and update ~/.zshrc\")\n .option(\"--rc <file>\", \"rc file to update (default: $HOME/.zshrc)\")\n .action(async (opts: InstallFlags) => {\n const verbose = Boolean(opts.verbose ?? program.opts<GlobalFlags>().verbose);\n const console = consoleFactory(verbose);\n state.exitCode = await runInstall({\n home: installHome(),\n rcFile: opts.rc,\n console,\n });\n });\n\n return { program, state };\n}\n\nasync function main(): Promise<number> {\n const { program, state } = buildProgram((verbose) => createDefaultConsole({ verbose }));\n // We need a console for error reporting before parsing; use non-verbose default.\n const errorConsole = createDefaultConsole();\n try {\n await program.parseAsync(process.argv);\n return state.exitCode;\n } catch (error) {\n if (error instanceof CdwtError) {\n errorConsole.errln(`${pc.red(\"cdwt:\")} ${error.message}`);\n return error.code;\n }\n errorConsole.errln(`${pc.red(\"cdwt:\")} ${(error as Error).message}`);\n return 1;\n }\n}\n\nconst exitCode = await main();\nprocess.exit(exitCode);\n","/** Thrown when the user-facing message should be printed and the process exited with `code`. */\nexport class CdwtError extends Error {\n constructor(\n message: string,\n public readonly code: number = 1,\n ) {\n super(message);\n this.name = \"CdwtError\";\n }\n}\n","import { mkdir, readFile, stat, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport path from \"node:path\";\nimport pc from \"picocolors\";\nimport { appendLineIfMissing } from \"../core/rc-file.js\";\nimport type { ConsoleIO } from \"../io/console.js\";\n\nconst SHELL_FILE = \"cdwt.zsh\";\nconst SHELL_FUNCTION = `cdwt() {\n local destination\n case \"\\${1-}\" in\n -h|--help)\n command cdwt \"$@\"\n return $?\n ;;\n esac\n if ! destination=\"$(command cdwt \"$@\")\"; then\n return $?\n fi\n if [[ -z \"$destination\" ]]; then\n return 1\n fi\n cd \"$destination\" || return $?\n}\n`;\n\nconst RC_LINE = 'source \"$HOME/.local/share/cdwt/cdwt.zsh\"';\n\nexport interface InstallOptions {\n home: string;\n rcFile?: string | undefined;\n console: ConsoleIO;\n}\n\nexport async function runInstall(options: InstallOptions): Promise<number> {\n const { console } = options;\n const shareDir = path.join(options.home, \".local\", \"share\", \"cdwt\");\n const shellFile = path.join(shareDir, SHELL_FILE);\n await mkdir(shareDir, { recursive: true });\n await writeFile(shellFile, SHELL_FUNCTION, { mode: 0o644 });\n\n const rcFile = options.rcFile ?? path.join(options.home, \".zshrc\");\n const existing = (await fileExists(rcFile)) ? await readFile(rcFile, \"utf8\") : \"\";\n const result = appendLineIfMissing(existing, RC_LINE);\n if (result.changed) {\n await writeFile(rcFile, result.contents);\n }\n\n console.outln(`${pc.green(\"✓\")} installed shell wrapper to ${shellFile}`);\n console.outln(\n `${pc.green(\"✓\")} ${result.changed ? \"added\" : \"kept\"} \\`source\\` line in ${rcFile}`,\n );\n console.outln(\"\");\n console.outln(\"Reload your shell with one of:\");\n console.outln(` exec zsh -l`);\n console.outln(` source \"${rcFile}\"`);\n return 0;\n}\n\nasync function fileExists(file: string): Promise<boolean> {\n try {\n const s = await stat(file);\n return s.isFile();\n } catch {\n return false;\n }\n}\n\nexport function defaultHome(): string {\n return process.env[\"HOME\"] ?? homedir();\n}\n","/**\n * Pure helper that decides what an rc file (e.g. ~/.zshrc) should look like\n * after we ensure `line` is sourced exactly once. Centralised so we can\n * unit-test the idempotency and trimming rules without touching the FS.\n */\nexport interface RcAppendResult {\n /** New file contents to write. Equals `existing` when no change is needed. */\n contents: string;\n /** Whether the file actually changed. */\n changed: boolean;\n}\n\nexport function appendLineIfMissing(existing: string, line: string): RcAppendResult {\n const target = line.trim();\n if (target === \"\") return { contents: existing, changed: false };\n\n for (const rawLine of existing.split(\"\\n\")) {\n if (rawLine.trim() === target) {\n return { contents: existing, changed: false };\n }\n }\n\n if (existing === \"\") {\n return { contents: `${target}\\n`, changed: true };\n }\n const separator = existing.endsWith(\"\\n\") ? \"\" : \"\\n\";\n return { contents: `${existing}${separator}${target}\\n`, changed: true };\n}\n","import { homedir } from \"node:os\";\nimport { CdwtError } from \"../errors.js\";\nimport { buildSections, deriveBranchesWithWorktree } from \"../core/sections.js\";\nimport { discoverConfigFiles, readMergedConfig } from \"../io/config-loader.js\";\nimport type { ConsoleIO } from \"../io/console.js\";\nimport { isGhAvailable, listPullRequests } from \"../io/gh.js\";\nimport { listLocalBranches, setGitDebug } from \"../io/git.js\";\nimport { loadRepoContext } from \"../io/repo-context.js\";\nimport { selectInteractive, type SelectorOptions } from \"../ui/selector.js\";\nimport { runCommandMode, type CommandModeOutcome } from \"../ui/command-mode.js\";\nimport { sectionLabel } from \"../ui/format.js\";\nimport type { DisplayLine, PullRequest, RepoContext } from \"../types.js\";\nimport {\n EXIT_CANCELLED,\n createNewWorktreeAction,\n createPrWorktreeAction,\n createWorktreeForBranchAction,\n deleteWorktreeAction,\n printDestination,\n type ActionContext,\n} from \"./actions.js\";\nimport {\n SLASH_COMMANDS,\n type CommandHost,\n type CommandResult,\n type SlashCommand,\n} from \"./slash-commands.js\";\n\nexport interface SelectOptions {\n defaultBranchOnly: boolean;\n /** Start with the PR filter enabled and PR list pre-fetched. */\n prFilter?: boolean;\n /**\n * `true` → prompt for branch name, `string` → use as branch name.\n * Skips the interactive picker and creates a new worktree directly.\n */\n newBranch?: string | true;\n cwd: string;\n configOverride: string | undefined;\n home: string;\n console: ConsoleIO;\n /**\n * Options forwarded to `selectInteractive`. Useful in tests to force\n * the prompt (non-fzf) path via `{ useFzf: false }`.\n */\n selectorOptions?: Omit<SelectorOptions, \"console\">;\n}\n\ninterface State {\n repo: RepoContext;\n prs: PullRequest[];\n prsLoaded: boolean;\n localBranches: string[];\n lines: DisplayLine[];\n}\n\nexport async function runSelect(options: SelectOptions): Promise<number> {\n const { console } = options;\n setGitDebug((msg) => console.debug(msg));\n console.debug(`runSelect start cwd=${options.cwd}`);\n\n const repo = await loadRepoContext(options.cwd);\n console.debug(\n `repo context: mainWorktree=${repo.mainWorktree} defaultBranchRef=${repo.defaultBranchRef ?? \"null\"} worktrees=${repo.worktrees.length}`,\n );\n\n if (options.defaultBranchOnly) {\n printDestination(console, repo.mainWorktree);\n return 0;\n }\n\n const configFiles = await discoverConfigFiles({\n cwd: repo.cwd,\n mainWorktree: repo.mainWorktree,\n home: options.home,\n override: options.configOverride,\n debug: (msg) => console.debug(msg),\n });\n\n const config = await readMergedConfig(configFiles);\n console.debug(\n `merged config: patterns=[${config.copyIgnored.patterns.join(\",\")}] paths=[${config.copyIgnored.paths.join(\",\")}]`,\n );\n\n if (options.newBranch !== undefined) {\n const ctx: ActionContext = {\n repo,\n config,\n branchesWithWorktree: deriveBranchesWithWorktree(repo),\n console,\n };\n const branchArg = options.newBranch === true ? undefined : options.newBranch;\n return createNewWorktreeAction(ctx, branchArg);\n }\n\n const localBranches = await listLocalBranches(repo.cwd);\n console.debug(`localBranches=${localBranches.length}`);\n\n let prs: PullRequest[] = [];\n let prsLoaded = false;\n if (options.prFilter) {\n prs = await loadPrs(options.cwd, console);\n prsLoaded = true;\n }\n\n const state: State = {\n repo,\n prs,\n prsLoaded,\n localBranches,\n lines: buildSections({ repo, prs, localBranches, home: options.home }),\n };\n\n if (state.lines.length === 0) {\n throw new CdwtError(\"no worktree or branch candidates found\");\n }\n\n let initialFilter: SelectorOptions[\"initialFilter\"] = options.prFilter ? \"pr\" : undefined;\n\n while (true) {\n const ctx: ActionContext = {\n repo: state.repo,\n config,\n branchesWithWorktree: deriveBranchesWithWorktree(state.repo),\n console,\n };\n\n const outcome = await selectInteractive(state.lines, {\n console,\n ...(initialFilter ? { initialFilter } : {}),\n ...options.selectorOptions,\n });\n initialFilter = undefined;\n\n switch (outcome.kind) {\n case \"cancelled\":\n return EXIT_CANCELLED;\n case \"command-mode\": {\n const code = await enterCommandMode(state, ctx, options, outcome.initialInput);\n if (code !== undefined) return code;\n continue;\n }\n case \"delete-target\": {\n const code = await handleDeleteTarget(state, ctx, options, outcome.line);\n if (code !== undefined) return code;\n continue;\n }\n case \"selected\":\n return dispatchSelected(state, ctx, options, outcome.line);\n }\n }\n}\n\nasync function dispatchSelected(\n _state: State,\n ctx: ActionContext,\n options: SelectOptions,\n selected: DisplayLine,\n): Promise<number> {\n options.console.debug(\n `selected: kind=${selected.kind} branch=\"${selected.branch}\" destination=\"${selected.destination}\"`,\n );\n switch (selected.kind) {\n case \"worktree\":\n printDestination(options.console, selected.destination);\n return 0;\n case \"branch\":\n return createWorktreeForBranchAction(ctx, selected.branch, selected.destination);\n case \"pr\": {\n if (selected.prNumber === null) throw new CdwtError(\"missing PR number\");\n if (ctx.branchesWithWorktree.has(selected.branch)) {\n printDestination(options.console, selected.destination);\n return 0;\n }\n return createPrWorktreeAction(ctx, selected.prNumber, selected.destination);\n }\n }\n}\n\n/**\n * Drive the slash-command UI. Returns an exit code to terminate `runSelect`,\n * or `undefined` to re-open the picker.\n */\nasync function enterCommandMode(\n state: State,\n ctx: ActionContext,\n options: SelectOptions,\n initialInput: string | undefined,\n): Promise<number | undefined> {\n const cmdOptions = {\n console: options.console,\n registry: SLASH_COMMANDS,\n ...(options.selectorOptions?.useFzf !== undefined\n ? { useFzf: options.selectorOptions.useFzf }\n : {}),\n ...(options.selectorOptions?.fzfRunner\n ? { fzfRunner: options.selectorOptions.fzfRunner }\n : {}),\n ...(initialInput !== undefined ? { initialInput } : {}),\n };\n const picked: CommandModeOutcome = await runCommandMode(cmdOptions);\n if (picked.kind === \"cancelled\") return undefined;\n\n const host = makeCommandHost(state, ctx, options);\n const result: CommandResult = await picked.command.execute(picked.args, host);\n if (result.kind === \"exit\") return result.code;\n return undefined;\n}\n\nfunction makeCommandHost(\n state: State,\n ctx: ActionContext,\n options: SelectOptions,\n): CommandHost {\n return {\n console: options.console,\n printMainDestination() {\n printDestination(options.console, state.repo.mainWorktree);\n },\n createNewWorktree(branch: string | undefined) {\n return createNewWorktreeAction(ctx, branch);\n },\n async loadPrs() {\n if (state.prsLoaded) return;\n state.prs = await loadPrs(options.cwd, options.console);\n state.prsLoaded = true;\n rebuildLines(state, options.home);\n },\n async refresh() {\n await refresh(state, options);\n },\n };\n}\n\n/**\n * Handle ctrl-d (or `d <num>` in prompt fallback) on a highlighted entry.\n * Only acts on `wt` rows; other sections are rejected with a message and the\n * picker re-opens. After a successful delete, refresh state and return to the\n * picker — except when no worktree is left, in which case jump to main.\n */\nasync function handleDeleteTarget(\n state: State,\n ctx: ActionContext,\n options: SelectOptions,\n target: DisplayLine,\n): Promise<number | undefined> {\n if (target.section === \"main\") {\n options.console.errln(\"cdwt: refusing to delete the default branch worktree\");\n return undefined;\n }\n if (target.section !== \"wt\") {\n options.console.errln(\n `cdwt: ctrl-d only deletes worktree entries (got [${sectionLabel(target.section)}])`,\n );\n return undefined;\n }\n const result = await deleteWorktreeAction(ctx, target.destination);\n if (result.kind === \"cancelled\") return undefined;\n await refresh(state, options);\n if (state.lines.filter((l) => l.section === \"wt\").length === 0) {\n printDestination(options.console, state.repo.mainWorktree);\n return 0;\n }\n return undefined;\n}\n\nasync function refresh(state: State, options: SelectOptions): Promise<void> {\n state.repo = await loadRepoContext(options.cwd);\n state.localBranches = await listLocalBranches(state.repo.cwd);\n if (state.prsLoaded) {\n state.prs = await loadPrs(options.cwd, options.console);\n }\n rebuildLines(state, options.home);\n}\n\nfunction rebuildLines(state: State, home: string): void {\n state.lines = buildSections({\n repo: state.repo,\n prs: state.prs,\n localBranches: state.localBranches,\n home,\n });\n}\n\nasync function loadPrs(cwd: string, console: ConsoleIO): Promise<PullRequest[]> {\n const t0 = Date.now();\n const ghAvailable = await isGhAvailable();\n console.debug(`gh available=${ghAvailable}`);\n if (!ghAvailable) return [];\n const prs = await listPullRequests(cwd);\n console.debug(`listed ${prs.length} PRs in ${Date.now() - t0}ms`);\n return prs;\n}\n\n// Re-exported so existing callers that imported it from select.ts keep working.\nexport type { SlashCommand };\n\nexport function defaultHome(): string {\n return process.env[\"HOME\"] ?? homedir();\n}\n","import path from \"node:path\";\n\nexport interface DisplayPathOptions {\n path: string;\n mainWorktree: string;\n mainParent: string;\n home: string;\n}\n\n/**\n * Mirrors the bash `display_path` helper.\n * Collapses paths into `.`, `./...`, `../...`, or `~/...` when possible.\n */\nexport function displayPath({\n path: target,\n mainWorktree,\n mainParent,\n home,\n}: DisplayPathOptions): string {\n if (target === mainWorktree) return \".\";\n if (mainWorktree && target.startsWith(`${mainWorktree}/`)) {\n return `./${target.slice(mainWorktree.length + 1)}`;\n }\n if (mainParent && target.startsWith(`${mainParent}/`)) {\n return `../${target.slice(mainParent.length + 1)}`;\n }\n if (home && target.startsWith(`${home}/`)) {\n return `~/${target.slice(home.length + 1)}`;\n }\n return target;\n}\n\n/**\n * Mirrors the bash branch-to-slug logic used to derive worktree directory names.\n * Replaces `/`, spaces, and any non-[A-Za-z0-9._-] character with `-`,\n * then trims leading/trailing dashes. Empty results fall back to `worktree`.\n */\nexport function slugifyBranch(branch: string): string {\n let slug = branch.replace(/[/ ]/g, \"-\").replace(/[^A-Za-z0-9._-]/g, \"-\");\n slug = slug.replace(/^-+/, \"\").replace(/-+$/, \"\");\n if (slug === \"\") return \"worktree\";\n return slug;\n}\n\nexport function makeBranchPath(branch: string, mainWorktree: string, repoName: string): string {\n const parent = path.dirname(mainWorktree);\n return `${parent}/${repoName}-${slugifyBranch(branch)}`;\n}\n\nexport function makePrPath(prNumber: number, mainWorktree: string, repoName: string): string {\n const parent = path.dirname(mainWorktree);\n return `${parent}/${repoName}-pr-${prNumber}`;\n}\n","import type { DisplayLine, PullRequest, RepoContext, SectionKey, Worktree } from \"../types.js\";\nimport { displayPath, makeBranchPath, makePrPath } from \"./paths.js\";\n\nexport interface BuildSectionsInput {\n repo: RepoContext;\n prs: readonly PullRequest[];\n /** Local branches (refs/heads/*) - excluded if already a worktree or PR head. */\n localBranches: readonly string[];\n home: string;\n}\n\n/**\n * Branches already checked out in a non-main worktree.\n *\n * The main worktree's branch is intentionally NOT included so the local\n * branch section still surfaces the default branch (lets the user create\n * another worktree of it if they want).\n */\nexport function deriveBranchesWithWorktree(repo: RepoContext): Set<string> {\n const set = new Set<string>();\n for (const wt of repo.worktrees) {\n if (wt.branch && wt.path !== repo.mainWorktree) {\n set.add(wt.branch);\n }\n }\n return set;\n}\n\n/**\n * Build the unified picker line list. Order:\n * 1. main worktree\n * 2. linked worktrees\n * 3. PRs (if loaded)\n * 4. local branches without a worktree\n *\n * Slash commands (`/new`, `/delete`) handle creation and deletion, so this\n * list contains entities only - no synthetic action rows.\n */\nexport function buildSections({\n repo,\n prs,\n localBranches,\n home,\n}: BuildSectionsInput): DisplayLine[] {\n const lines: DisplayLine[] = [];\n const branchesWithWorktree = deriveBranchesWithWorktree(repo);\n const prBranches = new Set<string>();\n\n const rootMarker = repo.mainWorktree === repo.currentPath ? \" [current]\" : \"\";\n lines.push(\n line({\n kind: \"worktree\",\n section: \"main\",\n name: `${repo.repoName}${rootMarker}`,\n shortPath: \".\",\n fullPath: repo.mainWorktree,\n destination: repo.mainWorktree,\n branch: repo.mainWorktreeBranch ?? \"\",\n }),\n );\n\n for (const wt of repo.worktrees) {\n if (wt.path === repo.mainWorktree) continue;\n const label = worktreeLabel(wt, repo.currentPath);\n lines.push(\n line({\n kind: \"worktree\",\n section: \"wt\",\n name: label,\n shortPath: displayPath({\n path: wt.path,\n mainWorktree: repo.mainWorktree,\n mainParent: repo.mainParent,\n home,\n }),\n fullPath: wt.path,\n destination: wt.path,\n branch: wt.branch ?? \"\",\n }),\n );\n }\n\n for (const pr of prs) {\n prBranches.add(pr.branch);\n const existingWorktreePath = findNonMainWorktreePathForBranch(\n repo.worktrees,\n pr.branch,\n repo.mainWorktree,\n );\n const targetPath =\n existingWorktreePath ?? makePrPath(pr.number, repo.mainWorktree, repo.repoName);\n lines.push(\n line({\n kind: \"pr\",\n section: \"pr\",\n name: `#${pr.number} ${pr.title}`,\n shortPath: displayPath({\n path: targetPath,\n mainWorktree: repo.mainWorktree,\n mainParent: repo.mainParent,\n home,\n }),\n fullPath: targetPath,\n destination: targetPath,\n branch: pr.branch,\n prNumber: pr.number,\n }),\n );\n }\n\n for (const branch of localBranches) {\n if (branchesWithWorktree.has(branch)) continue;\n if (prBranches.has(branch)) continue;\n const targetPath = makeBranchPath(branch, repo.mainWorktree, repo.repoName);\n lines.push(\n line({\n kind: \"branch\",\n section: \"br\",\n name: branch,\n shortPath: displayPath({\n path: targetPath,\n mainWorktree: repo.mainWorktree,\n mainParent: repo.mainParent,\n home,\n }),\n fullPath: targetPath,\n destination: targetPath,\n branch,\n }),\n );\n }\n\n return lines;\n}\n\nexport function sectionCounts(lines: readonly DisplayLine[]): Map<SectionKey, number> {\n const counts = new Map<SectionKey, number>();\n for (const l of lines) {\n counts.set(l.section, (counts.get(l.section) ?? 0) + 1);\n }\n return counts;\n}\n\ninterface BuildLineInput {\n kind: DisplayLine[\"kind\"];\n section: DisplayLine[\"section\"];\n name: string;\n shortPath: string;\n fullPath: string;\n destination: string;\n branch: string;\n prNumber?: number;\n}\n\nfunction line(input: BuildLineInput): DisplayLine {\n return {\n kind: input.kind,\n section: input.section,\n name: input.name,\n shortPath: input.shortPath,\n fullPath: input.fullPath,\n destination: input.destination,\n branch: input.branch,\n prNumber: input.prNumber ?? null,\n };\n}\n\nfunction worktreeLabel(wt: Worktree, currentPath: string): string {\n const baseLabel = wt.branch\n ? wt.branch\n : wt.head\n ? `detached@${wt.head.slice(0, 7)}`\n : \"detached\";\n const marker = wt.path === currentPath ? \" [current]\" : \"\";\n return `${baseLabel}${marker}`;\n}\n\n/**\n * Skip the main worktree on purpose: a PR whose head branch matches the\n * default branch should still create a fresh `repo-pr-<n>` directory rather\n * than overwrite the main worktree with a detached checkout.\n */\nfunction findNonMainWorktreePathForBranch(\n worktrees: readonly Worktree[],\n branch: string,\n mainWorktree: string,\n): string | null {\n for (const wt of worktrees) {\n if (wt.path === mainWorktree) continue;\n if (wt.branch === branch) return wt.path;\n }\n return null;\n}\n","import { readFile, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { CdwtError } from \"../errors.js\";\nimport { ConfigError, mergeConfigs, parseConfig, type ParsedConfig } from \"../core/config.js\";\nimport type { CdwtConfig } from \"../types.js\";\n\nexport interface DiscoverConfigsInput {\n /** Real (resolved) cwd. */\n cwd: string;\n mainWorktree: string;\n /** Process HOME directory. */\n home: string;\n /** Optional CDWT_CONFIG env override. */\n override?: string | undefined;\n /** Optional debug callback; called for each path checked (hit/miss). */\n debug?: (msg: string) => void;\n}\n\n/**\n * Locate config files in weak-to-strong order. The list returned is suitable\n * to feed into `parseConfig` + `mergeConfigs`. Mirrors the bash discovery rules:\n * - if CDWT_CONFIG is set, only that file is read (and its absence is a hard\n * error)\n * - otherwise: $HOME/.cdwt/settings.json, then `.cdwt/settings.json` files\n * walking from filesystem root down to the cwd (or the main worktree, when\n * cwd is outside the main worktree).\n */\nexport async function discoverConfigFiles({\n cwd,\n mainWorktree,\n home,\n override,\n debug,\n}: DiscoverConfigsInput): Promise<string[]> {\n if (override !== undefined) {\n const exists = await fileExists(override);\n debug?.(`config override path=${override} exists=${exists}`);\n if (!exists) {\n throw new CdwtError(`config file not found: ${override}`);\n }\n return [override];\n }\n\n const seen = new Set<string>();\n const files: string[] = [];\n\n const homeFile = path.join(home, \".cdwt\", \"settings.json\");\n const homeExists = await fileExists(homeFile);\n debug?.(`config check path=${homeFile} hit=${homeExists}`);\n if (homeExists) {\n seen.add(homeFile);\n files.push(homeFile);\n }\n\n let scan = cwd;\n if (scan !== mainWorktree && !scan.startsWith(`${mainWorktree}/`)) {\n scan = mainWorktree;\n }\n const dirs: string[] = [];\n while (true) {\n dirs.push(scan);\n if (scan === \"/\" || scan === \"\") break;\n scan = path.dirname(scan);\n }\n // bash walks from root → cwd (weak → strong)\n for (let i = dirs.length - 1; i >= 0; i--) {\n const file = path.join(dirs[i]!, \".cdwt\", \"settings.json\");\n if (seen.has(file)) continue;\n const exists = await fileExists(file);\n debug?.(`config check path=${file} hit=${exists}`);\n if (exists) {\n seen.add(file);\n files.push(file);\n }\n }\n debug?.(`config discovery complete: found ${files.length} file(s): [${files.join(\", \")}]`);\n return files;\n}\n\nexport async function readMergedConfig(files: readonly string[]): Promise<CdwtConfig> {\n const parsed: ParsedConfig[] = [];\n for (const file of files) {\n let raw: string;\n try {\n raw = await readFile(file, \"utf8\");\n } catch (err) {\n throw new CdwtError(`failed to read config: ${file} (${(err as Error).message})`);\n }\n let json: unknown;\n try {\n json = JSON.parse(raw);\n } catch (err) {\n throw new CdwtError(`invalid JSON in ${file}: ${(err as Error).message}`);\n }\n try {\n parsed.push(parseConfig(json, file));\n } catch (err) {\n if (err instanceof ConfigError) {\n throw new CdwtError(`invalid config: ${file} (${err.message})`);\n }\n throw err;\n }\n }\n return mergeConfigs(parsed);\n}\n\nasync function fileExists(file: string): Promise<boolean> {\n try {\n const s = await stat(file);\n return s.isFile();\n } catch {\n return false;\n }\n}\n","import type { CdwtConfig } from \"../types.js\";\n\nexport class ConfigError extends Error {\n constructor(\n message: string,\n public readonly file?: string,\n ) {\n super(message);\n this.name = \"ConfigError\";\n }\n}\n\n/**\n * A parsed config preserves the distinction between \"key absent\" (don't override)\n * and \"key present with empty array\" (clear the inherited value), which the bash\n * version inherits from jq's `*` (recursive merge) operator.\n */\nexport interface ParsedConfig {\n copyIgnored: {\n paths?: string[];\n patterns?: string[];\n };\n}\n\nexport function emptyConfig(): CdwtConfig {\n return { copyIgnored: { paths: [], patterns: [] } };\n}\n\n/**\n * Parse and validate the JSON contents of a single `.cdwt/settings.json` file.\n * Mirrors the bash jq schema check.\n */\nexport function parseConfig(json: unknown, file?: string): ParsedConfig {\n if (json === null || typeof json !== \"object\" || Array.isArray(json)) {\n throw new ConfigError(\"config root must be an object\", file);\n }\n const root = json as Record<string, unknown>;\n const copyRaw = root[\"copyIgnored\"];\n if (copyRaw === undefined) {\n return { copyIgnored: {} };\n }\n if (copyRaw === null || typeof copyRaw !== \"object\" || Array.isArray(copyRaw)) {\n throw new ConfigError(\"copyIgnored must be an object\", file);\n }\n const copy = copyRaw as Record<string, unknown>;\n const out: ParsedConfig = { copyIgnored: {} };\n if (\"paths\" in copy) {\n out.copyIgnored.paths = readStringArray(copy[\"paths\"], \"copyIgnored.paths\", file);\n }\n if (\"patterns\" in copy) {\n out.copyIgnored.patterns = readStringArray(copy[\"patterns\"], \"copyIgnored.patterns\", file);\n }\n return out;\n}\n\nfunction readStringArray(value: unknown, key: string, file: string | undefined): string[] {\n if (!Array.isArray(value)) {\n throw new ConfigError(`${key} must be an array`, file);\n }\n for (const item of value) {\n if (typeof item !== \"string\") {\n throw new ConfigError(`${key} must contain only strings`, file);\n }\n }\n return [...(value as string[])];\n}\n\n/**\n * Merge configs in weak-to-strong order, mirroring jq's `*` (recursive merge):\n * later arrays REPLACE earlier ones; missing keys leave the earlier value intact.\n */\nexport function mergeConfigs(configs: readonly ParsedConfig[]): CdwtConfig {\n const merged = emptyConfig();\n for (const config of configs) {\n if (config.copyIgnored.paths !== undefined) {\n merged.copyIgnored.paths = [...config.copyIgnored.paths];\n }\n if (config.copyIgnored.patterns !== undefined) {\n merged.copyIgnored.patterns = [...config.copyIgnored.patterns];\n }\n }\n return merged;\n}\n","import { spawn, type SpawnOptions } from \"node:child_process\";\n\nexport interface RunResult {\n stdout: string;\n stderr: string;\n exitCode: number;\n}\n\nexport interface RunOptions {\n cwd?: string;\n env?: Record<string, string | undefined>;\n /**\n * When true, child stdio inherits the parent's terminal (for git worktree, gh checkout, ...).\n * The child's stdout is redirected to the parent's stderr so the wrapper's\n * `destination=$(command cdwt)` capture stays clean — git writes \"HEAD is now at ...\" to\n * stdout and would otherwise pollute the destination path. The user still sees the\n * message because parent stderr is the terminal.\n */\n inheritStdio?: boolean;\n /** Optional input to write on stdin. */\n input?: string;\n /**\n * When provided, called with a timing message after the child exits.\n * Receives: command args, exit code, wall time, stdout/stderr byte counts.\n */\n onDebug?: (msg: string) => void;\n}\n\n/**\n * Spawn a process and capture stdout/stderr.\n * Never throws on a non-zero exit; the caller decides what to do with `exitCode`.\n */\nexport function run(\n command: string,\n args: readonly string[],\n options: RunOptions = {},\n): Promise<RunResult> {\n return new Promise((resolve, reject) => {\n const t0 = Date.now();\n const stdio: SpawnOptions[\"stdio\"] = options.inheritStdio\n ? [\"inherit\", process.stderr, \"inherit\"]\n : [\"pipe\", \"pipe\", \"pipe\"];\n const child = spawn(command, args, {\n cwd: options.cwd,\n env: options.env,\n stdio,\n });\n\n if (options.inheritStdio) {\n child.on(\"error\", reject);\n child.on(\"close\", (exitCode) => {\n const code = exitCode ?? 0;\n const elapsed = Date.now() - t0;\n options.onDebug?.(\n `exec [inherited] ${command} ${args.join(\" \")} cwd=${options.cwd ?? \".\"} exit=${code} +${elapsed}ms`,\n );\n resolve({ stdout: \"\", stderr: \"\", exitCode: code });\n });\n return;\n }\n\n let stdout = \"\";\n let stderr = \"\";\n child.stdout?.on(\"data\", (chunk: Buffer) => {\n stdout += chunk.toString(\"utf8\");\n });\n child.stderr?.on(\"data\", (chunk: Buffer) => {\n stderr += chunk.toString(\"utf8\");\n });\n child.on(\"error\", reject);\n child.on(\"close\", (exitCode) => {\n const code = exitCode ?? 0;\n const elapsed = Date.now() - t0;\n options.onDebug?.(\n `exec ${command} ${args.join(\" \")} cwd=${options.cwd ?? \".\"} exit=${code} stdout=${stdout.length}B stderr=${stderr.length}B +${elapsed}ms`,\n );\n resolve({ stdout, stderr, exitCode: code });\n });\n\n if (options.input !== undefined) {\n child.stdin?.write(options.input);\n child.stdin?.end();\n }\n });\n}\n","import type { PullRequest } from \"../types.js\";\nimport { run } from \"./exec.js\";\n\nexport async function isGhAvailable(): Promise<boolean> {\n const result = await run(\"which\", [\"gh\"]);\n return result.exitCode === 0;\n}\n\ninterface GhPrItem {\n number: number;\n title: string;\n headRefName: string;\n}\n\n/**\n * List open PRs for the current repository. Returns an empty list if `gh`\n * exits with a non-zero status (which is what the bash version did via\n * `2>/dev/null`).\n */\nexport async function listPullRequests(cwd: string, limit = 100): Promise<PullRequest[]> {\n const result = await run(\n \"gh\",\n [\"pr\", \"list\", \"--limit\", String(limit), \"--json\", \"number,title,headRefName\"],\n { cwd },\n );\n if (result.exitCode !== 0) return [];\n let parsed: unknown;\n try {\n parsed = JSON.parse(result.stdout);\n } catch {\n return [];\n }\n if (!Array.isArray(parsed)) return [];\n const out: PullRequest[] = [];\n for (const item of parsed) {\n if (!isGhPrItem(item)) continue;\n out.push({ number: item.number, branch: item.headRefName, title: item.title });\n }\n return out;\n}\n\nexport async function checkoutPr(cwd: string, prNumber: number): Promise<boolean> {\n const result = await run(\"gh\", [\"pr\", \"checkout\", String(prNumber)], {\n cwd,\n inheritStdio: true,\n });\n return result.exitCode === 0;\n}\n\nfunction isGhPrItem(value: unknown): value is GhPrItem {\n if (!value || typeof value !== \"object\") return false;\n const v = value as Record<string, unknown>;\n return (\n typeof v[\"number\"] === \"number\" &&\n typeof v[\"title\"] === \"string\" &&\n typeof v[\"headRefName\"] === \"string\"\n );\n}\n","import path from \"node:path\";\nimport { realpath } from \"node:fs/promises\";\nimport { CdwtError } from \"../errors.js\";\nimport { parseWorktreeList } from \"../core/git-parse.js\";\nimport type { Worktree } from \"../types.js\";\nimport type { ConsoleIO } from \"./console.js\";\nimport { run } from \"./exec.js\";\n\n/**\n * Module-level debug hook. Set once at startup via `setGitDebug` when\n * verbose mode is enabled. This avoids threading a console through every\n * git helper signature.\n */\nlet _gitDebug: ((msg: string) => void) | undefined;\n\nexport function setGitDebug(fn: (msg: string) => void): void {\n _gitDebug = fn;\n}\n\nexport interface GitContext {\n cwd: string;\n gitRoot: string;\n gitCommonDir: string;\n expectedMainWorktree: string;\n}\n\nexport async function loadGitContext(cwd: string): Promise<GitContext> {\n let realCwd: string;\n try {\n realCwd = await realpath(cwd);\n } catch {\n throw new CdwtError(`invalid working directory: ${cwd}`);\n }\n const root = await runGit([\"rev-parse\", \"--show-toplevel\"], { cwd: realCwd });\n if (root.exitCode !== 0) {\n throw new CdwtError(\"not inside a git worktree\");\n }\n const commonDirResult = await runGit([\"rev-parse\", \"--git-common-dir\"], { cwd: realCwd });\n if (commonDirResult.exitCode !== 0) {\n throw new CdwtError(\"failed to resolve git common dir\");\n }\n let commonDir = commonDirResult.stdout.trim();\n if (!path.isAbsolute(commonDir)) {\n commonDir = await realpath(path.resolve(realCwd, commonDir));\n }\n return {\n cwd: realCwd,\n gitRoot: root.stdout.trim(),\n gitCommonDir: commonDir,\n expectedMainWorktree: path.dirname(commonDir),\n };\n}\n\nexport async function listWorktrees(cwd: string): Promise<Worktree[]> {\n const result = await runGit([\"worktree\", \"list\", \"--porcelain\"], { cwd });\n if (result.exitCode !== 0) {\n throw new CdwtError(\"failed to list git worktrees\");\n }\n return parseWorktreeList(result.stdout);\n}\n\nexport async function symbolicRef(cwd: string, ref: string): Promise<string | null> {\n const result = await runGit([\"symbolic-ref\", \"--quiet\", \"--short\", ref], { cwd });\n return result.exitCode === 0 ? result.stdout.trim() : null;\n}\n\nexport async function listLocalBranches(cwd: string): Promise<string[]> {\n const result = await runGit([\"for-each-ref\", \"--format=%(refname:short)\", \"refs/heads\"], {\n cwd,\n });\n if (result.exitCode !== 0) return [];\n return result.stdout.split(\"\\n\").filter((line) => line.length > 0);\n}\n\nexport async function listRemoteBranches(cwd: string): Promise<string[]> {\n const result = await runGit(\n [\"for-each-ref\", \"--format=%(refname:short)\", \"refs/remotes/origin\"],\n { cwd },\n );\n if (result.exitCode !== 0) return [];\n return result.stdout\n .split(\"\\n\")\n .filter((line) => line.length > 0 && line !== \"origin/HEAD\")\n .map((line) => line.replace(/^origin\\//, \"\"));\n}\n\nexport async function branchExists(cwd: string, branch: string): Promise<boolean> {\n const result = await runGit([\"show-ref\", \"--verify\", \"--quiet\", `refs/heads/${branch}`], {\n cwd,\n });\n return result.exitCode === 0;\n}\n\nexport async function checkRefFormat(cwd: string, branch: string): Promise<boolean> {\n const result = await runGit([\"check-ref-format\", \"--branch\", branch], { cwd });\n return result.exitCode === 0;\n}\n\nexport async function isGitIgnored(cwd: string, relativePath: string): Promise<boolean> {\n const result = await runGit([\"check-ignore\", \"-q\", \"--\", relativePath], { cwd });\n return result.exitCode === 0;\n}\n\nexport async function listIgnoredFiles(cwd: string): Promise<string[]> {\n const result = await runGit([\"ls-files\", \"--others\", \"--ignored\", \"--exclude-standard\", \"-z\"], {\n cwd,\n });\n if (result.exitCode !== 0) return [];\n return result.stdout.split(\"\\0\").filter((p) => p.length > 0);\n}\n\nexport async function listIgnoredFilesMatching(\n cwd: string,\n pathspecs: readonly string[],\n): Promise<string[]> {\n if (pathspecs.length === 0) return [];\n const result = await runGit(\n [\"ls-files\", \"--others\", \"--ignored\", \"--exclude-standard\", \"-z\", \"--\", ...pathspecs],\n { cwd },\n );\n if (result.exitCode !== 0) return [];\n return result.stdout.split(\"\\0\").filter((p) => p.length > 0);\n}\n\n/**\n * For commands that produce useful progress output (worktree add / remove),\n * we let git own the user's terminal. That way the output is identical to\n * `git worktree add` invoked by hand and we never duplicate it.\n */\nasync function runGitInherited(args: readonly string[], cwd: string): Promise<number> {\n const result = await run(\"git\", args, { cwd, inheritStdio: true, ...(_gitDebug && { onDebug: _gitDebug }) });\n return result.exitCode;\n}\n\nexport async function addWorktreeForBranch(\n cwd: string,\n destination: string,\n branch: string,\n): Promise<void> {\n const code = await runGitInherited([\"worktree\", \"add\", destination, branch], cwd);\n if (code !== 0) {\n throw new CdwtError(`git worktree add failed for ${branch} (exit ${code})`);\n }\n}\n\nexport async function addWorktreeNewBranch(\n cwd: string,\n destination: string,\n branch: string,\n baseRef: string,\n): Promise<void> {\n const code = await runGitInherited([\"worktree\", \"add\", \"-b\", branch, destination, baseRef], cwd);\n if (code !== 0) {\n throw new CdwtError(`git worktree add -b ${branch} from ${baseRef} failed (exit ${code})`);\n }\n}\n\nexport async function addWorktreeDetached(cwd: string, destination: string): Promise<void> {\n const code = await runGitInherited([\"worktree\", \"add\", \"--detach\", destination], cwd);\n if (code !== 0) {\n throw new CdwtError(`git worktree add --detach failed at ${destination} (exit ${code})`);\n }\n}\n\nexport interface RemoveWorktreeResult {\n exitCode: number;\n stderr: string;\n}\n\n/**\n * Attempt `git worktree remove` without force. Returns `{ exitCode, stderr }`\n * rather than throwing so the caller can decide how to handle dirty-worktree failures.\n */\nexport async function removeWorktree(\n cwd: string,\n target: string,\n): Promise<RemoveWorktreeResult> {\n const result = await run(\"git\", [\"worktree\", \"remove\", target], { cwd, ...(_gitDebug && { onDebug: _gitDebug }) });\n return { exitCode: result.exitCode, stderr: result.stderr };\n}\n\n/**\n * `git worktree remove --force`. Returns `{ exitCode, stderr }` so the caller\n * can surface git's message and decide whether to throw.\n */\nexport async function removeWorktreeForceRaw(\n cwd: string,\n target: string,\n): Promise<RemoveWorktreeResult> {\n const result = await run(\"git\", [\"worktree\", \"remove\", \"--force\", target], {\n cwd,\n ...(_gitDebug && { onDebug: _gitDebug }),\n });\n return { exitCode: result.exitCode, stderr: result.stderr };\n}\n\n/**\n * Best-effort cleanup used by rollback paths. Does not throw; instead reports\n * a clear remediation hint on the supplied console, so a leaked worktree can\n * be cleaned up by the user.\n */\nexport async function removeWorktreeForce(\n cwd: string,\n target: string,\n console: ConsoleIO,\n): Promise<void> {\n const result = await removeWorktreeForceRaw(cwd, target);\n if (result.exitCode === 0) return;\n if (result.stderr) console.err(result.stderr);\n console.errln(\n `cdwt: warning: failed to remove orphan worktree at ${target}; clean up with: git worktree remove --force \"${target}\"`,\n );\n}\n\nasync function runGit(args: readonly string[], options: { cwd: string }) {\n return run(\"git\", args, { cwd: options.cwd, ...(_gitDebug && { onDebug: _gitDebug }) });\n}\n","import type { Worktree } from \"../types.js\";\n\n/**\n * Parse the output of `git worktree list --porcelain` into a structured list.\n * The porcelain format places one attribute per line and separates worktrees\n * with blank lines. Lines we recognise: `worktree <path>`, `branch <ref>`,\n * `HEAD <sha>`, `detached`. Other lines (locked, prunable, ...) are ignored.\n */\nexport function parseWorktreeList(output: string): Worktree[] {\n const worktrees: Worktree[] = [];\n let current: { path: string; branch: string | null; head: string | null } | null = null;\n\n const flush = () => {\n if (current && current.path) {\n worktrees.push({ ...current });\n }\n current = null;\n };\n\n for (const rawLine of output.split(\"\\n\")) {\n const line = rawLine.replace(/\\r$/, \"\");\n if (line === \"\") {\n flush();\n continue;\n }\n if (line.startsWith(\"worktree \")) {\n flush();\n current = { path: line.slice(\"worktree \".length), branch: null, head: null };\n continue;\n }\n if (!current) continue;\n if (line.startsWith(\"branch \")) {\n const ref = line.slice(\"branch \".length);\n current.branch = ref.startsWith(\"refs/heads/\") ? ref.slice(\"refs/heads/\".length) : ref;\n } else if (line.startsWith(\"HEAD \")) {\n current.head = line.slice(\"HEAD \".length);\n }\n }\n flush();\n return worktrees;\n}\n","import path from \"node:path\";\nimport { CdwtError } from \"../errors.js\";\nimport { resolveDefaultBranch } from \"../core/default-branch.js\";\nimport type { RepoContext } from \"../types.js\";\nimport {\n listLocalBranches,\n listRemoteBranches,\n listWorktrees,\n loadGitContext,\n symbolicRef,\n} from \"./git.js\";\n\nexport async function loadRepoContext(cwd: string): Promise<RepoContext> {\n const git = await loadGitContext(cwd);\n const worktrees = await listWorktrees(git.cwd);\n const main = worktrees.find((wt) => wt.path === git.expectedMainWorktree);\n if (!main) {\n throw new CdwtError(\"failed to detect the main worktree\");\n }\n const mainParent = path.dirname(main.path);\n const repoName = path.basename(main.path);\n\n const [remoteHead, localBranches, remoteBranches] = await Promise.all([\n symbolicRef(git.cwd, \"refs/remotes/origin/HEAD\"),\n listLocalBranches(git.cwd),\n listRemoteBranches(git.cwd),\n ]);\n const worktreeBranches = new Set<string>();\n for (const wt of worktrees) {\n if (wt.branch) worktreeBranches.add(wt.branch);\n }\n\n const { branch, ref } = resolveDefaultBranch({\n remoteHead,\n mainWorktreeBranch: main.branch,\n localBranches: new Set(localBranches),\n remoteBranches: new Set(remoteBranches),\n worktreeBranches,\n });\n\n return {\n mainWorktree: main.path,\n mainParent,\n repoName,\n defaultBranch: branch,\n defaultBranchRef: ref,\n mainWorktreeBranch: main.branch,\n worktrees,\n cwd: git.cwd,\n currentPath: git.gitRoot,\n };\n}\n","export interface ResolveDefaultBranchInput {\n /** Result of `git symbolic-ref --short refs/remotes/origin/HEAD`, or null. */\n remoteHead: string | null;\n /** Branch checked out on the main worktree (if any). */\n mainWorktreeBranch: string | null;\n /** Local branches that exist (refs/heads/*). */\n localBranches: ReadonlySet<string>;\n /** Remote branches under origin/* (without the leading `origin/`). */\n remoteBranches: ReadonlySet<string>;\n /** Branches checked out across worktrees. */\n worktreeBranches: ReadonlySet<string>;\n}\n\nexport interface ResolvedDefaultBranch {\n branch: string | null;\n ref: string | null;\n}\n\nconst FALLBACK_CANDIDATES = [\"main\", \"master\"] as const;\n\n/**\n * Pure version of the bash `resolve_default_branch` helper.\n * Returns the inferred default branch name and a usable ref for `git worktree add`.\n */\nexport function resolveDefaultBranch(input: ResolveDefaultBranchInput): ResolvedDefaultBranch {\n let branch: string | null = null;\n\n if (input.remoteHead) {\n branch = input.remoteHead.startsWith(\"origin/\")\n ? input.remoteHead.slice(\"origin/\".length)\n : input.remoteHead;\n }\n\n if (!branch && input.mainWorktreeBranch) {\n branch = input.mainWorktreeBranch;\n }\n\n if (!branch) {\n for (const candidate of FALLBACK_CANDIDATES) {\n if (input.localBranches.has(candidate) || input.remoteBranches.has(candidate)) {\n branch = candidate;\n break;\n }\n }\n }\n\n if (!branch) {\n return { branch: null, ref: null };\n }\n\n if (input.localBranches.has(branch)) {\n return { branch, ref: branch };\n }\n if (input.remoteBranches.has(branch)) {\n return { branch, ref: `origin/${branch}` };\n }\n if (input.worktreeBranches.has(branch)) {\n return { branch, ref: branch };\n }\n return { branch, ref: null };\n}\n","import { spawn } from \"node:child_process\";\nimport { run } from \"../io/exec.js\";\n\nexport interface FzfOptions {\n args: string[];\n input: string;\n}\n\nexport interface FzfResult {\n exitCode: number;\n stdout: string;\n}\n\nexport async function isFzfAvailable(): Promise<boolean> {\n const result = await run(\"which\", [\"fzf\"]);\n return result.exitCode === 0;\n}\n\n/**\n * Spawn fzf with stdout captured but stdin/stderr connected to the user's TTY,\n * so the picker can render to the terminal while we still receive the choice.\n */\nexport function runFzf({ args, input }: FzfOptions): Promise<FzfResult> {\n return new Promise((resolve, reject) => {\n const child = spawn(\"fzf\", args, {\n stdio: [\"pipe\", \"pipe\", \"inherit\"],\n });\n let stdout = \"\";\n child.stdout.setEncoding(\"utf8\");\n child.stdout.on(\"data\", (chunk: string) => {\n stdout += chunk;\n });\n child.on(\"error\", reject);\n child.on(\"close\", (code) => resolve({ exitCode: code ?? 0, stdout }));\n child.stdin.write(input);\n child.stdin.end();\n });\n}\n","import type { DisplayLine, SectionKey } from \"../types.js\";\n\nexport const FIELD_SEP = \"\\x1f\";\nconst TAG_WIDTH = 11;\nconst NAME_WIDTH = 44;\n\nconst ESC = \"\\x1b[\";\nconst RESET = `${ESC}0m`;\nconst BOLD = `${ESC}1m`;\nconst FG_GREEN = `${ESC}32m`;\nconst FG_YELLOW = `${ESC}33m`;\nconst FG_CYAN = `${ESC}36m`;\nconst FG_MAGENTA = `${ESC}35m`;\nconst FG_GRAY = `${ESC}90m`;\n\ninterface SectionStyle {\n /** Human-readable label shown in brackets, e.g. `[worktree]`. */\n label: string;\n /** Single-cell glyph that hints at the row's \"kind\". */\n glyph: string;\n /** ANSI sequence applied to glyph + tag + name. */\n color: string;\n}\n\n/**\n * Visual identity per section.\n * - main / worktree: the worktree exists; enter = jump.\n * Filled glyph + vivid color.\n * - branch / PR: the worktree does NOT exist yet; enter = create.\n * Open glyph and a softer color so it contrasts with worktrees.\n */\nconst STYLES: Record<SectionKey, SectionStyle> = {\n main: { label: \"main\", glyph: \"★\", color: `${BOLD}${FG_GREEN}` },\n wt: { label: \"worktree\", glyph: \"●\", color: FG_CYAN },\n br: { label: \"branch\", glyph: \"○\", color: FG_YELLOW },\n pr: { label: \"PR\", glyph: \"◆\", color: FG_MAGENTA },\n};\n\n/**\n * Render a display line as\n * `<glyph> [label] name <dim shortPath><FS>shortPath<FS>fullPath`.\n *\n * Field 1 is the visible row. Field 2 carries the short path so fzf's\n * preview window can pull it; field 3 carries the absolute path used for\n * the final `cd` target.\n *\n * fzf is invoked with `--with-nth=1` so only field 1 is rendered, and\n * with `--nth=1` so matching is restricted to that field. Section labels\n * (e.g. `[worktree]`) appear as literal text so users can fzf-filter by\n * typing `worktree`, `branch`, `pr`, etc.\n */\nexport function renderLine(line: DisplayLine): string {\n const style = STYLES[line.section];\n const tag = pad(`[${style.label}]`, TAG_WIDTH);\n const paddedName = pad(line.name, NAME_WIDTH);\n const head = `${style.color}${style.glyph} ${tag} ${paddedName}${RESET}`;\n const pathHint = `${FG_GRAY}${line.shortPath}${RESET}`;\n const visible = `${head} ${pathHint}`;\n return `${visible}${FIELD_SEP}${line.shortPath}${FIELD_SEP}${line.fullPath}`;\n}\n\n// eslint-disable-next-line no-control-regex\nconst ANSI_RE = /\\x1b\\[[0-9;]*m/g;\n\nexport function stripAnsi(s: string): string {\n return s.replace(ANSI_RE, \"\");\n}\n\nexport function sectionLabel(section: SectionKey): string {\n return STYLES[section].label;\n}\n\nexport function tagOf(section: SectionKey): string {\n return `[${STYLES[section].label}]`;\n}\n\nfunction pad(value: string, width: number): string {\n return value.length >= width ? value : value + \" \".repeat(width - value.length);\n}\n","import type { ConsoleIO } from \"../io/console.js\";\nimport type { DisplayLine, SectionKey } from \"../types.js\";\nimport { isFzfAvailable, runFzf as runFzfDefault, type FzfOptions, type FzfResult } from \"./fzf.js\";\nimport { FIELD_SEP, renderLine, sectionLabel, stripAnsi } from \"./format.js\";\n\nexport type FzfRunner = (options: FzfOptions) => Promise<FzfResult>;\n\nconst FILTER_ORDER: readonly Filter[] = [\"all\", \"wt\", \"br\", \"pr\"];\ntype Filter = \"all\" | \"wt\" | \"br\" | \"pr\";\n\nfunction filterLabel(filter: Filter): string {\n return filter === \"all\" ? \"all\" : sectionLabel(filter);\n}\n\nconst FILTER_CYCLE_LABEL = `${FILTER_ORDER.map(filterLabel).join(\" / \")}`;\n\n/**\n * The fzf `/` key emits this sentinel via `become(...)`. `become` replaces\n * fzf with a `printf` that writes the sentinel and exits 0, which is the\n * cleanest way to signal \"user wants command mode\" out of fzf — `print(...)`\n * is suppressed on abort, and `accept` requires a match. Picking the sentinel\n * up in stdout is what tells `runSelect` to switch into command mode.\n */\nexport const COMMAND_SENTINEL = \"__CDWT_CMD__\";\n\nconst FOOTER = \"↵ go esc cancel tab filter ctrl-d delete / commands ? help\";\n\nconst HELP_BODY = [\n \"shortcuts\",\n \" enter go to highlighted entry\",\n \" esc cancel\",\n ` tab / shift-tab cycle filter (${FILTER_CYCLE_LABEL})`,\n \" ctrl-d delete the highlighted worktree\",\n \" / open the slash command palette\",\n \" ? this help\",\n \"\",\n \"row legend\",\n \" ★ [main] default-branch worktree (enter = jump)\",\n \" ● [worktree] existing linked worktree (enter = jump)\",\n \" ○ [branch] local branch without a worktree (enter = create then jump)\",\n \" ◆ [PR] GitHub PR (enter = checkout into a worktree then jump)\",\n];\n\nexport type SelectOutcome =\n | { kind: \"selected\"; line: DisplayLine }\n | { kind: \"delete-target\"; line: DisplayLine }\n | { kind: \"command-mode\"; initialInput?: string }\n | { kind: \"cancelled\" };\n\nexport interface SelectorOptions {\n console: ConsoleIO;\n /**\n * Override fzf detection. `true` forces fzf, `false` forces the numbered\n * fallback. Omit for auto-detect via PATH lookup.\n */\n useFzf?: boolean;\n /** Inject a custom runner for fzf. Defaults to spawning the real binary. */\n fzfRunner?: FzfRunner;\n /** Initial filter (used by `/pr` etc.). */\n initialFilter?: Filter;\n /** Prompt label override (e.g. \"delete> \"). */\n prompt?: string;\n /** Footer override. */\n footer?: string;\n}\n\nexport async function selectInteractive(\n allLines: readonly DisplayLine[],\n options: SelectorOptions,\n): Promise<SelectOutcome> {\n if (allLines.length === 0) return { kind: \"cancelled\" };\n\n const useFzf = options.useFzf ?? (await isFzfAvailable());\n options.console.debug(\n `selector mode=${useFzf ? \"fzf\" : \"prompt\"} totalLines=${allLines.length} initialFilter=${options.initialFilter ?? \"all\"}`,\n );\n\n if (useFzf) {\n return selectWithFzf(allLines, options);\n }\n return selectWithPrompt(allLines, options);\n}\n\nasync function selectWithFzf(\n allLines: readonly DisplayLine[],\n options: SelectorOptions,\n): Promise<SelectOutcome> {\n const runFzf = options.fzfRunner ?? runFzfDefault;\n let filter: Filter = options.initialFilter ?? \"all\";\n const prompt = options.prompt ?? \"> \";\n const footer = options.footer ?? FOOTER;\n\n while (true) {\n const visible = applyFilter(allLines, filter);\n if (visible.length === 0) {\n filter = \"all\";\n continue;\n }\n const inputLines = visible.map((line) => renderLine(line));\n // fzf --ansi strips ANSI escape codes from its output, so the lookup\n // keys must also be stripped to match.\n const lookup = new Map(visible.map((line) => [stripAnsi(renderLine(line)), line]));\n const header = filter === \"all\" ? \"\" : `filter: ${filterLabel(filter)}`;\n const result = await runFzf({\n args: [\n `--prompt=${prompt}`,\n \"--print-query\",\n `--delimiter=${FIELD_SEP}`,\n \"--nth=1\",\n // Field 1 carries the colored \"glyph + [tag] + name + dim path\" row,\n // fields 2/3 are data-only (preview / cd target). --with-nth=1 keeps\n // the visible row tidy; --ansi makes fzf interpret the color codes\n // and strip them when matching/printing.\n \"--with-nth=1\",\n \"--ansi\",\n \"--expect=tab,btab,?,ctrl-d\",\n \"--height=70%\",\n \"--reverse\",\n \"--layout=reverse\",\n \"--info=inline-right\",\n \"--header-first\",\n `--header=${header}`,\n `--footer=${footer}`,\n \"--preview\",\n 'if [ -n \"{3}\" ]; then printf \"%s\\\\n\" {3}; fi',\n \"--preview-window=down:3:wrap\",\n // `/` leaves the picker. `become` replaces fzf with a printf that\n // writes the sentinel; we dispatch into command-mode from the caller.\n `--bind=/:become(printf '%s\\\\n' '${COMMAND_SENTINEL}')`,\n ],\n input: inputLines.join(\"\\n\"),\n });\n options.console.debug(\n `fzf returned exit=${result.exitCode} stdoutBytes=${result.stdout.length}`,\n );\n\n if (containsCommandSentinel(result.stdout)) {\n return { kind: \"command-mode\" };\n }\n\n const outcome = parsePickerOutput(result.stdout, result.exitCode);\n options.console.debug(\n `fzf parsed key=${JSON.stringify(outcome.key)} query=${JSON.stringify(outcome.query)} selected=${outcome.selected ? \"yes\" : \"no\"}`,\n );\n if (outcome.cancelled) return { kind: \"cancelled\" };\n\n if (outcome.key === \"tab\") {\n filter = nextFilter(filter, +1);\n continue;\n }\n if (outcome.key === \"btab\") {\n filter = nextFilter(filter, -1);\n continue;\n }\n if (outcome.key === \"?\") {\n await runHelpOverlay(runFzf);\n continue;\n }\n if (outcome.key === \"ctrl-d\") {\n if (outcome.selected) {\n const line = lookup.get(stripAnsi(outcome.selected));\n if (line) return { kind: \"delete-target\", line };\n }\n continue;\n }\n\n if (outcome.selected) {\n const line = lookup.get(stripAnsi(outcome.selected));\n if (line) return { kind: \"selected\", line };\n }\n return { kind: \"cancelled\" };\n }\n}\n\ninterface PickerOutput {\n cancelled: boolean;\n query: string;\n key: string;\n selected: string;\n}\n\nfunction containsCommandSentinel(stdout: string): boolean {\n return stdout.split(\"\\n\").some((line) => line === COMMAND_SENTINEL);\n}\n\nfunction parsePickerOutput(stdout: string, exitCode: number): PickerOutput {\n if (exitCode !== 0 && stdout === \"\") {\n return { cancelled: true, query: \"\", key: \"\", selected: \"\" };\n }\n const lines = stdout.replace(/\\n$/, \"\").split(\"\\n\");\n return {\n cancelled: false,\n query: lines[0] ?? \"\",\n key: lines[1] ?? \"\",\n selected: lines[2] ?? \"\",\n };\n}\n\nfunction applyFilter(lines: readonly DisplayLine[], filter: Filter): DisplayLine[] {\n if (filter === \"all\") return [...lines];\n return lines.filter((l) => sectionMatches(l.section, filter));\n}\n\nfunction sectionMatches(section: SectionKey, filter: Filter): boolean {\n return section === filter;\n}\n\nfunction nextFilter(current: Filter, step: number): Filter {\n const idx = FILTER_ORDER.indexOf(current);\n const next = (idx + step + FILTER_ORDER.length) % FILTER_ORDER.length;\n return FILTER_ORDER[next]!;\n}\n\nasync function runHelpOverlay(runFzf: FzfRunner): Promise<void> {\n await runFzf({\n args: [\n \"--prompt=help> \",\n \"--height=70%\",\n \"--reverse\",\n \"--layout=reverse\",\n \"--info=hidden\",\n \"--header-first\",\n \"--header=press esc to close\",\n \"--no-sort\",\n \"--disabled\",\n ],\n input: HELP_BODY.join(\"\\n\"),\n });\n}\n\nconst MAX_PROMPT_RETRIES = 5;\n\nasync function selectWithPrompt(\n allLines: readonly DisplayLine[],\n options: SelectorOptions,\n): Promise<SelectOutcome> {\n const console = options.console;\n let filter: Filter = options.initialFilter ?? \"all\";\n\n for (let attempt = 0; attempt < MAX_PROMPT_RETRIES; attempt++) {\n const visible = applyFilter(allLines, filter);\n if (visible.length === 0) {\n filter = \"all\";\n continue;\n }\n console.errln(\"\");\n if (filter !== \"all\") console.errln(`(filter: ${filterLabel(filter)})`);\n visible.forEach((line, idx) =>\n console.errln(\n `${String(idx + 1).padStart(2)}) ${renderLine(line).split(FIELD_SEP)[0] ?? line.name}`,\n ),\n );\n console.errln(\n \"type number to go, d <number> to delete, /<command> for slash mode, blank to cancel\",\n );\n const answer = await console.ask(\"> \");\n if (answer === null) return { kind: \"cancelled\" };\n const trimmed = answer.trim();\n if (trimmed === \"\") return { kind: \"cancelled\" };\n\n if (trimmed.startsWith(\"/\")) {\n return { kind: \"command-mode\", initialInput: trimmed };\n }\n\n if (trimmed === \"tab\") {\n filter = nextFilter(filter, +1);\n continue;\n }\n if (trimmed === \"?\") {\n console.errln(HELP_BODY.join(\"\\n\"));\n continue;\n }\n\n const deleteMatch = /^d\\s+(\\d+)$/i.exec(trimmed);\n if (deleteMatch) {\n const n = Number.parseInt(deleteMatch[1]!, 10);\n if (!Number.isFinite(n) || n < 1 || n > visible.length) {\n console.errln(\"cdwt: invalid selection\");\n continue;\n }\n return { kind: \"delete-target\", line: visible[n - 1]! };\n }\n\n const n = Number.parseInt(trimmed, 10);\n if (!Number.isFinite(n) || n < 1 || n > visible.length) {\n console.errln(\"cdwt: invalid selection\");\n continue;\n }\n return { kind: \"selected\", line: visible[n - 1]! };\n }\n console.errln(\"cdwt: too many invalid attempts; aborting\");\n return { kind: \"cancelled\" };\n}\n","import type { ConsoleIO } from \"../io/console.js\";\n\n/**\n * Surface that slash-command executors call into. select.ts implements this\n * over its mutable state. Adding a new command that needs novel behaviour =\n * extend this interface and provide the implementation in select.ts.\n */\nexport interface CommandHost {\n console: ConsoleIO;\n /** Print the main worktree path on stdout (jumps via the zsh wrapper). */\n printMainDestination(): void;\n /**\n * Run the create-new-worktree action. Returns the exit code that should\n * propagate out of `runSelect` (0 on success, EXIT_CANCELLED on abort, ...).\n */\n createNewWorktree(branch: string | undefined): Promise<number>;\n /** Load PRs via `gh` and rebuild the picker rows. */\n loadPrs(): Promise<void>;\n /** Reload worktrees, branches, and (if already loaded) PRs. */\n refresh(): Promise<void>;\n}\n\nexport type CommandResult =\n | { kind: \"exit\"; code: number }\n | { kind: \"continue\" };\n\nexport interface SlashCommand {\n name: string;\n aliases: readonly string[];\n description: string;\n /**\n * Hint shown next to the command in the palette / help text. e.g.\n * `<branch>` for `/new <branch>`. Omit for commands that take no arg.\n */\n argHint?: string;\n execute(rawArgs: string, host: CommandHost): Promise<CommandResult>;\n}\n\nconst NEW_CMD: SlashCommand = {\n name: \"new\",\n aliases: [\"n\"],\n description: \"create a worktree from the default branch\",\n argHint: \"<branch>\",\n async execute(rawArgs, host) {\n const branch = rawArgs.trim() === \"\" ? undefined : rawArgs.trim();\n const code = await host.createNewWorktree(branch);\n return { kind: \"exit\", code };\n },\n};\n\nconst MAIN_CMD: SlashCommand = {\n name: \"main\",\n aliases: [\"home\"],\n description: \"jump to the main worktree\",\n execute(_rawArgs, host) {\n host.printMainDestination();\n return Promise.resolve({ kind: \"exit\", code: 0 });\n },\n};\n\nconst PR_CMD: SlashCommand = {\n name: \"pr\",\n aliases: [],\n description: \"load and filter pull requests\",\n async execute(_rawArgs, host) {\n await host.loadPrs();\n return { kind: \"continue\" };\n },\n};\n\nconst REFRESH_CMD: SlashCommand = {\n name: \"refresh\",\n aliases: [\"reload\", \"r\"],\n description: \"reload worktrees, branches, and PRs\",\n async execute(_rawArgs, host) {\n await host.refresh();\n return { kind: \"continue\" };\n },\n};\n\nconst HELP_CMD: SlashCommand = {\n name: \"help\",\n aliases: [\"h\", \"?\"],\n description: \"show command help\",\n execute(_rawArgs, host) {\n host.console.errln(buildHelpText(SLASH_COMMANDS));\n return Promise.resolve({ kind: \"continue\" });\n },\n};\n\nexport const SLASH_COMMANDS: readonly SlashCommand[] = [\n NEW_CMD,\n MAIN_CMD,\n PR_CMD,\n REFRESH_CMD,\n HELP_CMD,\n];\n\nexport function findCommand(name: string): SlashCommand | null {\n if (name === \"\") return null;\n return (\n SLASH_COMMANDS.find((c) => c.name === name || c.aliases.includes(name)) ?? null\n );\n}\n\nexport interface ParsedCommandLine {\n command: SlashCommand;\n args: string;\n}\n\n/**\n * Parse a raw line typed by the user (with or without leading slash). Returns\n * null when the input isn't a slash command or the command name is unknown.\n */\nexport function parseCommandLine(input: string): ParsedCommandLine | null {\n const trimmed = input.trim();\n if (!trimmed.startsWith(\"/\")) return null;\n const body = trimmed.slice(1).trim();\n if (body === \"\") return null;\n const [head, ...rest] = body.split(/\\s+/);\n if (head === undefined || head === \"\") return null;\n const command = findCommand(head);\n if (!command) return null;\n return { command, args: rest.join(\" \") };\n}\n\nexport function buildHelpText(commands: readonly SlashCommand[]): string {\n const rows = commands.map((cmd) => {\n const aliases = cmd.aliases.map((a) => `/${a}`).join(\", \");\n const left = `/${cmd.name}${cmd.argHint ? ` ${cmd.argHint}` : \"\"}`;\n const aliasPart = aliases ? ` (${aliases})` : \"\";\n return ` ${left.padEnd(20)} ${cmd.description}${aliasPart}`;\n });\n return [\"slash commands\", ...rows].join(\"\\n\");\n}\n","import {\n buildHelpText,\n parseCommandLine,\n type SlashCommand,\n} from \"../commands/slash-commands.js\";\nimport type { ConsoleIO } from \"../io/console.js\";\nimport {\n isFzfAvailable,\n runFzf as runFzfDefault,\n type FzfOptions,\n type FzfResult,\n} from \"./fzf.js\";\nimport { FIELD_SEP } from \"./format.js\";\n\nexport type FzfRunner = (options: FzfOptions) => Promise<FzfResult>;\n\nexport type CommandModeOutcome =\n | { kind: \"command\"; command: SlashCommand; args: string }\n | { kind: \"cancelled\" };\n\nexport interface CommandModeOptions {\n console: ConsoleIO;\n registry: readonly SlashCommand[];\n useFzf?: boolean;\n fzfRunner?: FzfRunner;\n /**\n * If set, parsed first as a `/<name> [args]` line. On a hit, the command is\n * returned without showing the palette. This lets the picker pass through\n * full lines typed in the numbered fallback (e.g. `/main`, `/new feat/x`).\n */\n initialInput?: string;\n}\n\nconst PROMPT = \"cmd> \";\n\n/**\n * Read-eval-loop for slash commands.\n *\n * fzf path: a palette of available commands. fzf is the discovery surface;\n * picking an entry that has an `argHint` triggers a follow-up `console.ask`.\n *\n * Prompt fallback: a numbered list. Either type the number, or type the\n * full `/<name> [args]` line directly.\n */\nexport async function runCommandMode(\n options: CommandModeOptions,\n): Promise<CommandModeOutcome> {\n if (options.initialInput !== undefined) {\n const parsed = parseCommandLine(options.initialInput);\n if (parsed) {\n return resolveArgs(parsed.command, parsed.args, options);\n }\n options.console.errln(`cdwt: unknown command: ${options.initialInput.trim()}`);\n }\n\n const useFzf = options.useFzf ?? (await isFzfAvailable());\n if (useFzf) return runWithFzf(options);\n return runWithPrompt(options);\n}\n\nconst MAX_PROMPT_RETRIES = 5;\n\nasync function runWithPrompt(options: CommandModeOptions): Promise<CommandModeOutcome> {\n const { console, registry } = options;\n\n for (let attempt = 0; attempt < MAX_PROMPT_RETRIES; attempt++) {\n console.errln(\"\");\n registry.forEach((cmd, idx) => console.errln(formatPaletteRow(cmd, idx + 1)));\n console.errln(\n \"type number to pick, /<name> [args] to dispatch directly, blank to cancel\",\n );\n const answer = await console.ask(PROMPT);\n if (answer === null) return { kind: \"cancelled\" };\n const trimmed = answer.trim();\n if (trimmed === \"\") return { kind: \"cancelled\" };\n\n if (trimmed.startsWith(\"/\")) {\n const parsed = parseCommandLine(trimmed);\n if (parsed) return resolveArgs(parsed.command, parsed.args, options);\n console.errln(`cdwt: unknown command: ${trimmed}`);\n continue;\n }\n\n const n = Number.parseInt(trimmed, 10);\n if (!Number.isFinite(n) || n < 1 || n > registry.length) {\n console.errln(\"cdwt: invalid selection\");\n continue;\n }\n const command = registry[n - 1]!;\n return resolveArgs(command, \"\", options);\n }\n console.errln(\"cdwt: too many invalid attempts; aborting\");\n return { kind: \"cancelled\" };\n}\n\nasync function runWithFzf(options: CommandModeOptions): Promise<CommandModeOutcome> {\n const runFzf = options.fzfRunner ?? runFzfDefault;\n const { registry, console } = options;\n\n const inputLines = registry.map((cmd) => renderPaletteLine(cmd));\n const lookup = new Map(inputLines.map((line, idx) => [line, registry[idx]!]));\n\n const result = await runFzf({\n args: [\n `--prompt=${PROMPT}`,\n \"--print-query\",\n `--delimiter=${FIELD_SEP}`,\n \"--nth=1\",\n \"--height=40%\",\n \"--reverse\",\n \"--layout=reverse\",\n \"--info=inline-right\",\n \"--header=pick a command\",\n ],\n input: inputLines.join(\"\\n\"),\n });\n\n if (result.exitCode !== 0 && result.stdout === \"\") {\n return { kind: \"cancelled\" };\n }\n\n const lines = result.stdout.replace(/\\n$/, \"\").split(\"\\n\");\n const query = lines[0] ?? \"\";\n const selected = lines[1] ?? \"\";\n\n // If user typed a freeform `/<name> [args]` query, dispatch on Enter.\n if (query.startsWith(\"/\")) {\n const parsed = parseCommandLine(query);\n if (parsed) return resolveArgs(parsed.command, parsed.args, options);\n console.errln(`cdwt: unknown command: ${query.trim()}`);\n return { kind: \"cancelled\" };\n }\n\n const command = selected ? lookup.get(selected) : undefined;\n if (!command) return { kind: \"cancelled\" };\n return resolveArgs(command, \"\", options);\n}\n\nasync function resolveArgs(\n command: SlashCommand,\n rawArgs: string,\n options: CommandModeOptions,\n): Promise<CommandModeOutcome> {\n if (command.argHint && rawArgs.trim() === \"\") {\n const answer = await options.console.ask(`/${command.name} ${command.argHint}> `);\n if (answer === null || answer.trim() === \"\") return { kind: \"cancelled\" };\n return { kind: \"command\", command, args: answer.trim() };\n }\n return { kind: \"command\", command, args: rawArgs };\n}\n\nfunction renderPaletteLine(cmd: SlashCommand): string {\n const left = `/${cmd.name}${cmd.argHint ? ` ${cmd.argHint}` : \"\"}`;\n return `${left.padEnd(20)}${FIELD_SEP}${cmd.description}`;\n}\n\nfunction formatPaletteRow(cmd: SlashCommand, n: number): string {\n const left = `/${cmd.name}${cmd.argHint ? ` ${cmd.argHint}` : \"\"}`;\n return `${String(n).padStart(2)}) ${left.padEnd(20)} ${cmd.description}`;\n}\n\n// Used in tests to assert help can be derived from the registry.\nexport { buildHelpText };\n","import { stat } from \"node:fs/promises\";\nimport { CdwtError } from \"../errors.js\";\nimport { copyConfiguredIgnoredPaths } from \"../io/copy-files.js\";\nimport {\n addWorktreeDetached,\n addWorktreeForBranch,\n addWorktreeNewBranch,\n branchExists,\n checkRefFormat,\n removeWorktree,\n removeWorktreeForce,\n removeWorktreeForceRaw,\n} from \"../io/git.js\";\nimport { checkoutPr } from \"../io/gh.js\";\nimport type { ConsoleIO } from \"../io/console.js\";\nimport type { CdwtConfig, RepoContext } from \"../types.js\";\nimport { makeBranchPath } from \"../core/paths.js\";\n\nexport const EXIT_CANCELLED = 130;\nconst MAX_BRANCH_PROMPT_RETRIES = 5;\n\nexport interface ActionContext {\n repo: RepoContext;\n config: CdwtConfig;\n branchesWithWorktree: ReadonlySet<string>;\n console: ConsoleIO;\n}\n\nexport type DeleteOutcome = { kind: \"deleted\" } | { kind: \"cancelled\" };\n\n/** Print the destination path so the shell wrapper can `cd` into it. */\nexport function printDestination(console: ConsoleIO, target: string): void {\n console.outln(target);\n}\n\nexport async function deleteWorktreeAction(\n ctx: ActionContext,\n target: string,\n): Promise<DeleteOutcome> {\n if (target === ctx.repo.mainWorktree) {\n throw new CdwtError(\"refusing to delete the default branch worktree\");\n }\n if (!(await ctx.console.confirm(`Delete worktree at \"${target}\"? [y/N] `))) {\n ctx.console.debug(`delete cancelled by user for ${target}`);\n return { kind: \"cancelled\" };\n }\n\n ctx.console.debug(`attempting git worktree remove for ${target}`);\n const result = await removeWorktree(ctx.repo.mainWorktree, target);\n ctx.console.debug(\n `git worktree remove exit=${result.exitCode} stderr=${result.stderr.length}B`,\n );\n\n if (result.exitCode === 0) {\n ctx.console.debug(`delete succeeded (clean) for ${target}`);\n return { kind: \"deleted\" };\n }\n\n if (result.stderr) ctx.console.errln(result.stderr.trimEnd());\n ctx.console.debug(`worktree is dirty, prompting for force delete`);\n\n if (!(await ctx.console.confirm(`Worktree has uncommitted changes. Force delete? [y/N] `))) {\n ctx.console.debug(`force delete cancelled by user for ${target}`);\n return { kind: \"cancelled\" };\n }\n\n ctx.console.debug(`attempting force remove for ${target}`);\n const force = await removeWorktreeForceRaw(ctx.repo.mainWorktree, target);\n ctx.console.debug(`force remove exit=${force.exitCode} stderr=${force.stderr.length}B`);\n\n if (force.exitCode !== 0) {\n if (force.stderr) ctx.console.errln(force.stderr.trimEnd());\n throw new CdwtError(\n `git worktree remove --force failed for ${target} (exit ${force.exitCode})`,\n );\n }\n\n ctx.console.debug(`force delete succeeded for ${target}`);\n return { kind: \"deleted\" };\n}\n\nexport async function createWorktreeForBranchAction(\n ctx: ActionContext,\n branch: string,\n target: string,\n): Promise<number> {\n await assertDestinationFree(target);\n await addWorktreeForBranch(ctx.repo.cwd, target, branch);\n await copyConfiguredIgnoredPaths({\n source: ctx.repo.mainWorktree,\n destination: target,\n config: ctx.config,\n console: ctx.console,\n });\n printDestination(ctx.console, target);\n return 0;\n}\n\nexport async function createNewWorktreeAction(\n ctx: ActionContext,\n branchArg?: string,\n): Promise<number> {\n const ref = ctx.repo.defaultBranchRef;\n if (!ref) throw new CdwtError(\"failed to detect the default branch\");\n\n const branch =\n branchArg !== undefined && branchArg !== \"\"\n ? await validateNewBranch(ctx, branchArg)\n : await readNewBranchName(ctx);\n if (branch === null) return EXIT_CANCELLED;\n const target = makeBranchPath(branch, ctx.repo.mainWorktree, ctx.repo.repoName);\n await assertDestinationFree(target);\n await addWorktreeNewBranch(ctx.repo.cwd, target, branch, ref);\n await copyConfiguredIgnoredPaths({\n source: ctx.repo.mainWorktree,\n destination: target,\n config: ctx.config,\n console: ctx.console,\n });\n printDestination(ctx.console, target);\n return 0;\n}\n\nexport async function createPrWorktreeAction(\n ctx: ActionContext,\n prNumber: number,\n target: string,\n): Promise<number> {\n await assertDestinationFree(target);\n await addWorktreeDetached(ctx.repo.cwd, target);\n const ok = await checkoutPr(target, prNumber);\n if (!ok) {\n await removeWorktreeForce(ctx.repo.cwd, target, ctx.console);\n throw new CdwtError(`failed to checkout PR #${prNumber}`);\n }\n await copyConfiguredIgnoredPaths({\n source: ctx.repo.mainWorktree,\n destination: target,\n config: ctx.config,\n console: ctx.console,\n });\n printDestination(ctx.console, target);\n return 0;\n}\n\nasync function validateNewBranch(ctx: ActionContext, raw: string): Promise<string | null> {\n const branch = raw.trim();\n if (branch === \"\") return null;\n if (!(await checkRefFormat(ctx.repo.cwd, branch))) {\n ctx.console.errln(`cdwt: invalid branch name: ${branch}`);\n return null;\n }\n if (await branchExists(ctx.repo.cwd, branch)) {\n ctx.console.errln(`cdwt: branch already exists: ${branch}`);\n return null;\n }\n if (ctx.branchesWithWorktree.has(branch)) {\n ctx.console.errln(`cdwt: branch already has a worktree: ${branch}`);\n return null;\n }\n return branch;\n}\n\nasync function readNewBranchName(ctx: ActionContext): Promise<string | null> {\n for (let attempt = 0; attempt < MAX_BRANCH_PROMPT_RETRIES; attempt++) {\n const raw = await ctx.console.ask(\"New branch name: \");\n if (raw === null) return null;\n const branch = raw.trim();\n if (branch === \"\") return null;\n const validated = await validateNewBranch(ctx, branch);\n if (validated !== null) return validated;\n }\n ctx.console.errln(`cdwt: too many invalid branch name attempts; aborting`);\n return null;\n}\n\nasync function assertDestinationFree(target: string): Promise<void> {\n try {\n await stat(target);\n } catch {\n return;\n }\n throw new CdwtError(`destination already exists: ${target}`);\n}\n","import { cp, mkdir, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { copyPatternMatchesPath, patternsToPathspecs, validateCopyPath } from \"../core/copy.js\";\nimport type { CdwtConfig } from \"../types.js\";\nimport type { ConsoleIO } from \"./console.js\";\nimport { isGitIgnored, listIgnoredFilesMatching } from \"./git.js\";\n\nexport interface CopyIgnoredOptions {\n source: string;\n destination: string;\n config: CdwtConfig;\n console: ConsoleIO;\n}\n\n/**\n * Copy ignored files from `source` to `destination` according to the merged\n * `copyIgnored` rules. Mirrors the bash `copy_configured_ignored_paths` flow:\n * explicit paths first, then pattern-matched ignored files.\n */\nexport async function copyConfiguredIgnoredPaths(options: CopyIgnoredOptions): Promise<void> {\n const { source, destination, config, console } = options;\n const t0Total = Date.now();\n\n console.debug(\n `copyConfiguredIgnoredPaths start source=${source} destination=${destination} paths=[${config.copyIgnored.paths.join(\",\")}] patterns=[${config.copyIgnored.patterns.join(\",\")}]`,\n );\n\n let timeInIsIgnored = 0;\n let timeInCp = 0;\n let copiedCount = 0;\n let skippedCount = 0;\n\n for (const relative of config.copyIgnored.paths) {\n validateCopyPath(relative);\n await copyOneIgnoredPath(source, destination, relative, console, {\n onTimeIgnored: (ms) => { timeInIsIgnored += ms; },\n onTimeCp: (ms) => { timeInCp += ms; },\n onCopied: () => { copiedCount++; },\n onSkipped: () => { skippedCount++; },\n });\n }\n\n if (config.copyIgnored.patterns.length === 0) {\n console.debug(\n `copyConfiguredIgnoredPaths done (no patterns) elapsed=${Date.now() - t0Total}ms copied=${copiedCount} skipped=${skippedCount}`,\n );\n return;\n }\n\n const pathspecs = patternsToPathspecs(config.copyIgnored.patterns);\n const t0Ls = Date.now();\n const ignored = await listIgnoredFilesMatching(source, pathspecs);\n const lsElapsed = Date.now() - t0Ls;\n console.debug(`git ls-files (targeted) returned ${ignored.length} entries in ${lsElapsed}ms`);\n\n const matched = ignored.filter((f) => copyPatternMatchesPath(f, config.copyIgnored.patterns));\n console.debug(`pattern filter: ${matched.length} of ${ignored.length} entries matched`);\n\n for (const relative of matched) {\n await copyOnePath(source, destination, relative, console, {\n onTimeCp: (ms) => { timeInCp += ms; },\n onCopied: () => { copiedCount++; },\n });\n }\n\n const totalElapsed = Date.now() - t0Total;\n console.debug(\n `copyConfiguredIgnoredPaths done elapsed=${totalElapsed}ms copied=${copiedCount} skipped=${skippedCount} timeInIsIgnored=${timeInIsIgnored}ms timeInCp=${timeInCp}ms other=${totalElapsed - timeInIsIgnored - timeInCp}ms`,\n );\n}\n\ninterface CopyTimers {\n onTimeIgnored: (ms: number) => void;\n onTimeCp: (ms: number) => void;\n onCopied: () => void;\n onSkipped: () => void;\n}\n\nasync function copyOneIgnoredPath(\n source: string,\n destination: string,\n relative: string,\n console: ConsoleIO,\n timers: CopyTimers,\n): Promise<void> {\n validateCopyPath(relative);\n const sourceItem = path.join(source, relative);\n const destinationItem = path.join(destination, relative);\n\n const sourceStat = await safeStat(sourceItem);\n if (!sourceStat) {\n console.debug(`copy skip (not found): ${relative}`);\n return;\n }\n\n const t0Ignored = Date.now();\n const ignored = await isGitIgnored(source, relative);\n const ignoredElapsed = Date.now() - t0Ignored;\n timers.onTimeIgnored(ignoredElapsed);\n\n if (!ignored) {\n console.debug(`copy skip (not git-ignored, isGitIgnored took ${ignoredElapsed}ms): ${relative}`);\n timers.onSkipped();\n console.errln(`cdwt: copy path is not ignored by git, skipping: ${relative}`);\n return;\n }\n\n const sizeInfo = sourceStat.isDirectory() ? \"dir\" : `${sourceStat.size}B`;\n console.debug(\n `copy ${relative} (${sizeInfo}) isGitIgnored=${ignoredElapsed}ms`,\n );\n\n // `cp` with recursive: true creates the destination root itself, so we\n // only need to ensure the *parent* directory exists for both file and\n // directory copies. Defaults: force overwrites, errorOnExist false,\n // verbatimSymlinks true (Node 22), which matches `cp -pR` closely enough\n // for our \"carry .env / .claude across worktrees\" use case.\n await mkdir(path.dirname(destinationItem), { recursive: true });\n\n const t0Cp = Date.now();\n await cp(sourceItem, destinationItem, {\n recursive: sourceStat.isDirectory(),\n preserveTimestamps: true,\n force: true,\n });\n const cpElapsed = Date.now() - t0Cp;\n timers.onTimeCp(cpElapsed);\n timers.onCopied();\n console.debug(`copy done ${relative} cp=${cpElapsed}ms`);\n}\n\ninterface CopyOneTimers {\n onTimeCp: (ms: number) => void;\n onCopied: () => void;\n}\n\nasync function copyOnePath(\n source: string,\n destination: string,\n relative: string,\n console: ConsoleIO,\n timers: CopyOneTimers,\n): Promise<void> {\n validateCopyPath(relative);\n const sourceItem = path.join(source, relative);\n const destinationItem = path.join(destination, relative);\n\n const sourceStat = await safeStat(sourceItem);\n if (!sourceStat) {\n console.debug(`copy skip (not found): ${relative}`);\n return;\n }\n\n const sizeInfo = sourceStat.isDirectory() ? \"dir\" : `${sourceStat.size}B`;\n console.debug(`copy ${relative} (${sizeInfo})`);\n\n await mkdir(path.dirname(destinationItem), { recursive: true });\n\n const t0Cp = Date.now();\n await cp(sourceItem, destinationItem, {\n recursive: sourceStat.isDirectory(),\n preserveTimestamps: true,\n force: true,\n });\n const cpElapsed = Date.now() - t0Cp;\n timers.onTimeCp(cpElapsed);\n timers.onCopied();\n console.debug(`copy done ${relative} cp=${cpElapsed}ms`);\n}\n\nasync function safeStat(target: string) {\n try {\n return await stat(target);\n } catch {\n return null;\n }\n}\n","import path from \"node:path\";\n\nexport class UnsafeCopyPathError extends Error {\n constructor(public readonly value: string) {\n super(`refusing unsafe copy path: ${value}`);\n this.name = \"UnsafeCopyPathError\";\n }\n}\n\n/**\n * Reject paths that are empty, absolute, or escape the worktree.\n * Mirrors the bash `validate_copy_path` helper.\n */\nexport function validateCopyPath(relativePath: string): void {\n if (\n relativePath === \"\" ||\n relativePath.startsWith(\"/\") ||\n relativePath.includes(\"/../\") ||\n relativePath.startsWith(\"../\") ||\n relativePath === \"..\"\n ) {\n throw new UnsafeCopyPathError(relativePath);\n }\n}\n\n/**\n * Convert user-facing copy patterns into git pathspecs suitable for\n * `git ls-files --others --ignored --exclude-standard -- <pathspecs>`.\n *\n * The result intentionally over-matches — callers should apply\n * `copyPatternMatchesPath` as a secondary filter to enforce exact semantics.\n */\nexport function patternsToPathspecs(patterns: readonly string[]): string[] {\n const specs: string[] = [];\n for (const p of patterns) {\n if (p.includes(\"/\")) {\n specs.push(`:(glob)${p}`);\n } else {\n specs.push(`:(glob)**/${p}`);\n }\n }\n return specs;\n}\n\n/**\n * Glob-ish pattern matcher that mirrors the bash `copy_pattern_matches_path` rules:\n * - patterns containing `/` are matched as full repo-relative paths via fnmatch\n * - patterns without `/` match the basename anywhere in the path, the path itself,\n * any directory prefix (`pattern/...`), or any suffix (`.../pattern` / `.../pattern/...`)\n */\nexport function copyPatternMatchesPath(relativePath: string, patterns: readonly string[]): boolean {\n const base = path.basename(relativePath);\n for (const pattern of patterns) {\n validateCopyPath(pattern);\n if (pattern.includes(\"/\")) {\n if (fnmatch(relativePath, pattern)) return true;\n continue;\n }\n if (fnmatch(base, pattern)) return true;\n if (relativePath === pattern) return true;\n if (relativePath.startsWith(`${pattern}/`)) return true;\n if (relativePath.endsWith(`/${pattern}`)) return true;\n if (relativePath.includes(`/${pattern}/`)) return true;\n }\n return false;\n}\n\n/**\n * Translate a bash `[[ str == pattern ]]`-style glob into a RegExp and test it.\n * Without `shopt -s globstar` (bash default), `*` matches any character\n * including `/`. `**` collapses to the same thing. We therefore use `.*` for\n * both. `?` matches any single character (including `/`). Bracket expressions\n * `[..]` are passed through.\n */\nfunction fnmatch(input: string, pattern: string): boolean {\n let regex = \"^\";\n for (let i = 0; i < pattern.length; i++) {\n const ch = pattern[i]!;\n if (ch === \"*\") {\n regex += \".*\";\n while (pattern[i + 1] === \"*\") i++;\n } else if (ch === \"?\") {\n regex += \".\";\n } else if (ch === \"[\") {\n const close = pattern.indexOf(\"]\", i + 1);\n if (close === -1) {\n regex += \"\\\\[\";\n } else {\n regex += pattern.slice(i, close + 1);\n i = close;\n }\n } else if (/[.+^${}()|\\\\]/.test(ch)) {\n regex += `\\\\${ch}`;\n } else {\n regex += ch;\n }\n }\n regex += \"$\";\n return new RegExp(regex).test(input);\n}\n","import { createInterface } from \"node:readline/promises\";\nimport type { Readable, Writable } from \"node:stream\";\n\n/**\n * Façade over stdin / stdout / stderr that the rest of the codebase depends on\n * instead of touching `process.*` directly. Lets us:\n * - swap in a fake during tests (see TestConsole)\n * - centralise EOF / non-TTY handling so callers never block CI pipelines\n */\nexport interface ConsoleIO {\n /** Write to stdout, no implicit newline. */\n out(chunk: string): void;\n /** Write to stdout followed by a newline. */\n outln(message?: string): void;\n /** Write to stderr, no implicit newline. */\n err(chunk: string): void;\n /** Write to stderr followed by a newline. */\n errln(message?: string): void;\n /**\n * Write a timestamped diagnostic line to stderr.\n * No-op when verbose mode is disabled.\n * Format: [cdwt verbose +NNNms] message\n */\n debug(message: string): void;\n /**\n * Read one line from stdin, prompting on stderr.\n * Returns null on EOF or when stdin is not a TTY (so callers can fail\n * fast in non-interactive contexts instead of hanging forever).\n */\n ask(prompt: string): Promise<string | null>;\n /** Yes / no confirmation. EOF or non-TTY is treated as \"no\". */\n confirm(prompt: string): Promise<boolean>;\n /** True when stdin is connected to a TTY. */\n readonly isInteractive: boolean;\n}\n\nconst YES = /^y(es)?$/i;\n\nexport interface DefaultConsoleStreams {\n stdin?: Readable;\n stdout?: Writable;\n stderr?: Writable;\n /** When true, debug() writes timestamped lines to stderr. */\n verbose?: boolean;\n}\n\nconst _startTime = Date.now();\n\nexport function createDefaultConsole(streams: DefaultConsoleStreams = {}): ConsoleIO {\n const stdin = streams.stdin ?? process.stdin;\n const stdout = streams.stdout ?? process.stdout;\n const stderr = streams.stderr ?? process.stderr;\n const isInteractive = Boolean((stdin as { isTTY?: boolean }).isTTY);\n const verbose = streams.verbose ?? false;\n\n const console: ConsoleIO = {\n out: (chunk) => stdout.write(chunk),\n outln: (message = \"\") => stdout.write(`${message}\\n`),\n err: (chunk) => stderr.write(chunk),\n errln: (message = \"\") => stderr.write(`${message}\\n`),\n debug(message) {\n if (!verbose) return;\n const elapsed = Date.now() - _startTime;\n stderr.write(`[cdwt verbose +${elapsed}ms] ${message}\\n`);\n },\n isInteractive,\n async ask(prompt) {\n if (!isInteractive) return null;\n const rl = createInterface({ input: stdin, output: stderr, terminal: true });\n try {\n return await rl.question(prompt);\n } catch {\n return null;\n } finally {\n rl.close();\n }\n },\n async confirm(prompt) {\n const answer = await this.ask(prompt);\n if (answer === null) return false;\n return YES.test(answer.trim());\n },\n };\n return console;\n}\n"],"mappings":"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","names":["pc","line","homedir","path","readFile","stat","path","fileExists","path","readFile","stat","exitCode","path","line","path","line","path","main","path","spawn","spawn","line","runFzf","line","exitCode","n","MAX_PROMPT_RETRIES","runFzf","line","stat","mkdir","stat","path","path","path","mkdir","stat","stat","defaultHome","homedir","defaultHome","pc"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/errors.ts","../src/commands/install.ts","../src/core/rc-file.ts","../src/commands/select.ts","../src/core/paths.ts","../src/core/sections.ts","../src/io/config-loader.ts","../src/core/config.ts","../src/io/exec.ts","../src/io/gh.ts","../src/io/git.ts","../src/core/git-parse.ts","../src/io/repo-context.ts","../src/core/default-branch.ts","../src/ui/fzf.ts","../src/ui/format.ts","../src/ui/selector.ts","../src/commands/slash-commands.ts","../src/ui/command-mode.ts","../src/commands/actions.ts","../src/io/copy-files.ts","../src/core/copy.ts","../src/io/console.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport { CdwtError } from \"./errors.js\";\nimport { runInstall, defaultHome as installHome } from \"./commands/install.js\";\nimport { runSelect, defaultHome as selectHome } from \"./commands/select.js\";\nimport { createDefaultConsole, type ConsoleIO } from \"./io/console.js\";\n\ninterface GlobalFlags {\n verbose?: boolean;\n}\n\ninterface SelectFlags extends GlobalFlags {\n pr?: boolean;\n config?: string;\n}\n\ninterface InstallFlags extends GlobalFlags {\n rc?: string;\n}\n\ninterface NewFlags extends GlobalFlags {\n config?: string;\n}\n\n/**\n * Build the commander program. Exit codes flow back through `state.exitCode`\n * so the entry point can call `process.exit` exactly once. Keeping that out\n * of `runSelect` / `runInstall` keeps them testable from unit tests.\n */\nexport function buildProgram(consoleFactory: (verbose: boolean) => ConsoleIO): {\n program: Command;\n state: { exitCode: number };\n} {\n const program = new Command();\n const state = { exitCode: 0 };\n\n program\n .name(\"cdwt\")\n .description(\n \"Interactive git worktree switcher. Prints the destination path on stdout; \" +\n \"use the bundled zsh wrapper (installed via `cdwt install`) so the \" +\n \"shell can `cd` into it.\",\n )\n .version(\"0.1.0\")\n .option(\"-v, --verbose\", \"write timestamped diagnostic logs to stderr\");\n\n program\n .option(\"--pr\", \"open the picker pre-filtered to PRs (loads `gh pr list` immediately)\")\n .option(\n \"--config <file>\",\n \"use only the given settings file (overrides .cdwt/settings.json discovery)\",\n )\n .action(async (opts: SelectFlags) => {\n const verbose = Boolean(opts.verbose ?? program.opts<GlobalFlags>().verbose);\n const console = consoleFactory(verbose);\n state.exitCode = await runSelect({\n defaultBranchOnly: false,\n prFilter: Boolean(opts.pr),\n cwd: process.cwd(),\n configOverride: opts.config ?? process.env[\"CDWT_CONFIG\"],\n home: selectHome(),\n console,\n });\n });\n\n program\n .command(\"root\")\n .description(\"print the path of the default branch worktree and exit\")\n .action(async () => {\n const verbose = Boolean(program.opts<GlobalFlags>().verbose);\n const console = consoleFactory(verbose);\n state.exitCode = await runSelect({\n defaultBranchOnly: true,\n cwd: process.cwd(),\n configOverride: process.env[\"CDWT_CONFIG\"],\n home: selectHome(),\n console,\n });\n });\n\n program\n .command(\"new\")\n .description(\"create a new worktree from the default branch and cd into it\")\n .argument(\"[branch]\", \"branch name (prompts when omitted)\")\n .option(\n \"--config <file>\",\n \"use only the given settings file (overrides .cdwt/settings.json discovery)\",\n )\n .action(async (branch: string | undefined, opts: NewFlags) => {\n const verbose = Boolean(opts.verbose ?? program.opts<GlobalFlags>().verbose);\n const console = consoleFactory(verbose);\n state.exitCode = await runSelect({\n defaultBranchOnly: false,\n newBranch: branch ?? true,\n cwd: process.cwd(),\n configOverride: opts.config ?? process.env[\"CDWT_CONFIG\"],\n home: selectHome(),\n console,\n });\n });\n\n program\n .command(\"install\")\n .description(\"install the zsh shell wrapper to ~/.local/share/cdwt and update ~/.zshrc\")\n .option(\"--rc <file>\", \"rc file to update (default: $HOME/.zshrc)\")\n .action(async (opts: InstallFlags) => {\n const verbose = Boolean(opts.verbose ?? program.opts<GlobalFlags>().verbose);\n const console = consoleFactory(verbose);\n state.exitCode = await runInstall({\n home: installHome(),\n rcFile: opts.rc,\n console,\n });\n });\n\n return { program, state };\n}\n\nasync function main(): Promise<number> {\n const { program, state } = buildProgram((verbose) => createDefaultConsole({ verbose }));\n // We need a console for error reporting before parsing; use non-verbose default.\n const errorConsole = createDefaultConsole();\n try {\n await program.parseAsync(process.argv);\n return state.exitCode;\n } catch (error) {\n if (error instanceof CdwtError) {\n errorConsole.errln(`${pc.red(\"cdwt:\")} ${error.message}`);\n return error.code;\n }\n errorConsole.errln(`${pc.red(\"cdwt:\")} ${(error as Error).message}`);\n return 1;\n }\n}\n\nconst exitCode = await main();\nprocess.exit(exitCode);\n","/** Thrown when the user-facing message should be printed and the process exited with `code`. */\nexport class CdwtError extends Error {\n constructor(\n message: string,\n public readonly code: number = 1,\n ) {\n super(message);\n this.name = \"CdwtError\";\n }\n}\n","import { mkdir, readFile, stat, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport path from \"node:path\";\nimport pc from \"picocolors\";\nimport { appendLineIfMissing } from \"../core/rc-file.js\";\nimport type { ConsoleIO } from \"../io/console.js\";\n\nconst SHELL_FILE = \"cdwt.zsh\";\nconst SHELL_FUNCTION = `cdwt() {\n local destination\n case \"\\${1-}\" in\n -h|--help)\n command cdwt \"$@\"\n return $?\n ;;\n esac\n if ! destination=\"$(CDWT_SHELL_WRAPPER=1 command cdwt \"$@\")\"; then\n return $?\n fi\n if [[ -z \"$destination\" ]]; then\n return 1\n fi\n cd \"$destination\" || return $?\n}\n`;\n\nconst RC_LINE = 'source \"$HOME/.local/share/cdwt/cdwt.zsh\"';\n\nexport interface InstallOptions {\n home: string;\n rcFile?: string | undefined;\n console: ConsoleIO;\n}\n\nexport async function runInstall(options: InstallOptions): Promise<number> {\n const { console } = options;\n const shareDir = path.join(options.home, \".local\", \"share\", \"cdwt\");\n const shellFile = path.join(shareDir, SHELL_FILE);\n await mkdir(shareDir, { recursive: true });\n await writeFile(shellFile, SHELL_FUNCTION, { mode: 0o644 });\n\n const rcFile = options.rcFile ?? path.join(options.home, \".zshrc\");\n const existing = (await fileExists(rcFile)) ? await readFile(rcFile, \"utf8\") : \"\";\n const result = appendLineIfMissing(existing, RC_LINE);\n if (result.changed) {\n await writeFile(rcFile, result.contents);\n }\n\n console.outln(`${pc.green(\"✓\")} installed shell wrapper to ${shellFile}`);\n console.outln(\n `${pc.green(\"✓\")} ${result.changed ? \"added\" : \"kept\"} \\`source\\` line in ${rcFile}`,\n );\n console.outln(\"\");\n console.outln(\"Reload your shell with one of:\");\n console.outln(` exec zsh -l`);\n console.outln(` source \"${rcFile}\"`);\n return 0;\n}\n\nasync function fileExists(file: string): Promise<boolean> {\n try {\n const s = await stat(file);\n return s.isFile();\n } catch {\n return false;\n }\n}\n\nexport function defaultHome(): string {\n return process.env[\"HOME\"] ?? homedir();\n}\n","/**\n * Pure helper that decides what an rc file (e.g. ~/.zshrc) should look like\n * after we ensure `line` is sourced exactly once. Centralised so we can\n * unit-test the idempotency and trimming rules without touching the FS.\n */\nexport interface RcAppendResult {\n /** New file contents to write. Equals `existing` when no change is needed. */\n contents: string;\n /** Whether the file actually changed. */\n changed: boolean;\n}\n\nexport function appendLineIfMissing(existing: string, line: string): RcAppendResult {\n const target = line.trim();\n if (target === \"\") return { contents: existing, changed: false };\n\n for (const rawLine of existing.split(\"\\n\")) {\n if (rawLine.trim() === target) {\n return { contents: existing, changed: false };\n }\n }\n\n if (existing === \"\") {\n return { contents: `${target}\\n`, changed: true };\n }\n const separator = existing.endsWith(\"\\n\") ? \"\" : \"\\n\";\n return { contents: `${existing}${separator}${target}\\n`, changed: true };\n}\n","import { homedir } from \"node:os\";\nimport { CdwtError } from \"../errors.js\";\nimport { buildSections, deriveBranchesWithWorktree } from \"../core/sections.js\";\nimport { discoverConfigFiles, readMergedConfig } from \"../io/config-loader.js\";\nimport type { ConsoleIO } from \"../io/console.js\";\nimport { isGhAvailable, listPullRequests } from \"../io/gh.js\";\nimport { listLocalBranches, setGitDebug } from \"../io/git.js\";\nimport { loadRepoContext } from \"../io/repo-context.js\";\nimport { selectInteractive, type SelectorOptions } from \"../ui/selector.js\";\nimport { runCommandMode, type CommandModeOutcome } from \"../ui/command-mode.js\";\nimport { sectionLabel } from \"../ui/format.js\";\nimport type { DisplayLine, PullRequest, RepoContext } from \"../types.js\";\nimport {\n EXIT_CANCELLED,\n createNewWorktreeAction,\n createPrWorktreeAction,\n createWorktreeForBranchAction,\n deleteWorktreeAction,\n printDestination,\n type ActionContext,\n} from \"./actions.js\";\nimport {\n SLASH_COMMANDS,\n type CommandHost,\n type CommandResult,\n type SlashCommand,\n} from \"./slash-commands.js\";\n\nexport interface SelectOptions {\n defaultBranchOnly: boolean;\n /** Start with the PR filter enabled and PR list pre-fetched. */\n prFilter?: boolean;\n /**\n * `true` → prompt for branch name, `string` → use as branch name.\n * Skips the interactive picker and creates a new worktree directly.\n */\n newBranch?: string | true;\n cwd: string;\n configOverride: string | undefined;\n home: string;\n console: ConsoleIO;\n /**\n * Options forwarded to `selectInteractive`. Useful in tests to force\n * the prompt (non-fzf) path via `{ useFzf: false }`.\n */\n selectorOptions?: Omit<SelectorOptions, \"console\">;\n}\n\ninterface State {\n repo: RepoContext;\n prs: PullRequest[];\n prsLoaded: boolean;\n localBranches: string[];\n lines: DisplayLine[];\n}\n\nexport async function runSelect(options: SelectOptions): Promise<number> {\n const { console } = options;\n setGitDebug((msg) => console.debug(msg));\n console.debug(`runSelect start cwd=${options.cwd}`);\n\n const repo = await loadRepoContext(options.cwd);\n console.debug(\n `repo context: mainWorktree=${repo.mainWorktree} defaultBranchRef=${repo.defaultBranchRef ?? \"null\"} worktrees=${repo.worktrees.length}`,\n );\n\n if (options.defaultBranchOnly) {\n printDestination(console, repo.mainWorktree);\n return 0;\n }\n\n const configFiles = await discoverConfigFiles({\n cwd: repo.cwd,\n mainWorktree: repo.mainWorktree,\n home: options.home,\n override: options.configOverride,\n debug: (msg) => console.debug(msg),\n });\n\n const config = await readMergedConfig(configFiles);\n console.debug(\n `merged config: patterns=[${config.copyIgnored.patterns.join(\",\")}] paths=[${config.copyIgnored.paths.join(\",\")}]`,\n );\n\n if (options.newBranch !== undefined) {\n const ctx: ActionContext = {\n repo,\n config,\n branchesWithWorktree: deriveBranchesWithWorktree(repo),\n console,\n };\n const branchArg = options.newBranch === true ? undefined : options.newBranch;\n return createNewWorktreeAction(ctx, branchArg);\n }\n\n const localBranches = await listLocalBranches(repo.cwd);\n console.debug(`localBranches=${localBranches.length}`);\n\n let prs: PullRequest[] = [];\n let prsLoaded = false;\n if (options.prFilter) {\n prs = await loadPrs(options.cwd, console);\n prsLoaded = true;\n }\n\n const state: State = {\n repo,\n prs,\n prsLoaded,\n localBranches,\n lines: buildSections({ repo, prs, localBranches, home: options.home }),\n };\n\n if (state.lines.length === 0) {\n throw new CdwtError(\"no worktree or branch candidates found\");\n }\n\n let initialFilter: SelectorOptions[\"initialFilter\"] = options.prFilter ? \"pr\" : undefined;\n\n while (true) {\n const ctx: ActionContext = {\n repo: state.repo,\n config,\n branchesWithWorktree: deriveBranchesWithWorktree(state.repo),\n console,\n };\n\n const outcome = await selectInteractive(state.lines, {\n console,\n ...(initialFilter ? { initialFilter } : {}),\n ...options.selectorOptions,\n });\n initialFilter = undefined;\n\n switch (outcome.kind) {\n case \"cancelled\":\n return EXIT_CANCELLED;\n case \"command-mode\": {\n const code = await enterCommandMode(state, ctx, options, outcome.initialInput);\n if (code !== undefined) return code;\n continue;\n }\n case \"delete-target\": {\n const code = await handleDeleteTarget(state, ctx, options, outcome.line);\n if (code !== undefined) return code;\n continue;\n }\n case \"selected\":\n return dispatchSelected(state, ctx, options, outcome.line);\n }\n }\n}\n\nasync function dispatchSelected(\n _state: State,\n ctx: ActionContext,\n options: SelectOptions,\n selected: DisplayLine,\n): Promise<number> {\n options.console.debug(\n `selected: kind=${selected.kind} branch=\"${selected.branch}\" destination=\"${selected.destination}\"`,\n );\n switch (selected.kind) {\n case \"worktree\":\n printDestination(options.console, selected.destination);\n return 0;\n case \"branch\":\n return createWorktreeForBranchAction(ctx, selected.branch, selected.destination);\n case \"pr\": {\n if (selected.prNumber === null) throw new CdwtError(\"missing PR number\");\n if (ctx.branchesWithWorktree.has(selected.branch)) {\n printDestination(options.console, selected.destination);\n return 0;\n }\n return createPrWorktreeAction(ctx, selected.prNumber, selected.destination);\n }\n }\n}\n\n/**\n * Drive the slash-command UI. Returns an exit code to terminate `runSelect`,\n * or `undefined` to re-open the picker.\n */\nasync function enterCommandMode(\n state: State,\n ctx: ActionContext,\n options: SelectOptions,\n initialInput: string | undefined,\n): Promise<number | undefined> {\n const cmdOptions = {\n console: options.console,\n registry: SLASH_COMMANDS,\n ...(options.selectorOptions?.useFzf !== undefined\n ? { useFzf: options.selectorOptions.useFzf }\n : {}),\n ...(options.selectorOptions?.fzfRunner\n ? { fzfRunner: options.selectorOptions.fzfRunner }\n : {}),\n ...(initialInput !== undefined ? { initialInput } : {}),\n };\n const picked: CommandModeOutcome = await runCommandMode(cmdOptions);\n if (picked.kind === \"cancelled\") return undefined;\n\n const host = makeCommandHost(state, ctx, options);\n const result: CommandResult = await picked.command.execute(picked.args, host);\n if (result.kind === \"exit\") return result.code;\n return undefined;\n}\n\nfunction makeCommandHost(\n state: State,\n ctx: ActionContext,\n options: SelectOptions,\n): CommandHost {\n return {\n console: options.console,\n printMainDestination() {\n printDestination(options.console, state.repo.mainWorktree);\n },\n createNewWorktree(branch: string | undefined) {\n return createNewWorktreeAction(ctx, branch);\n },\n async loadPrs() {\n if (state.prsLoaded) return;\n state.prs = await loadPrs(options.cwd, options.console);\n state.prsLoaded = true;\n rebuildLines(state, options.home);\n },\n async refresh() {\n await refresh(state, options);\n },\n };\n}\n\n/**\n * Handle ctrl-d (or `d <num>` in prompt fallback) on a highlighted entry.\n * Only acts on `wt` rows; other sections are rejected with a message and the\n * picker re-opens. After a successful delete, refresh state and return to the\n * picker — except when no worktree is left, in which case jump to main.\n */\nasync function handleDeleteTarget(\n state: State,\n ctx: ActionContext,\n options: SelectOptions,\n target: DisplayLine,\n): Promise<number | undefined> {\n if (target.section === \"main\") {\n options.console.errln(\"cdwt: refusing to delete the default branch worktree\");\n return undefined;\n }\n if (target.section !== \"wt\") {\n options.console.errln(\n `cdwt: ctrl-d only deletes worktree entries (got [${sectionLabel(target.section)}])`,\n );\n return undefined;\n }\n const result = await deleteWorktreeAction(ctx, target.destination);\n if (result.kind === \"cancelled\") return undefined;\n await refresh(state, options);\n if (state.lines.filter((l) => l.section === \"wt\").length === 0) {\n printDestination(options.console, state.repo.mainWorktree);\n return 0;\n }\n return undefined;\n}\n\nasync function refresh(state: State, options: SelectOptions): Promise<void> {\n state.repo = await loadRepoContext(options.cwd);\n state.localBranches = await listLocalBranches(state.repo.cwd);\n if (state.prsLoaded) {\n state.prs = await loadPrs(options.cwd, options.console);\n }\n rebuildLines(state, options.home);\n}\n\nfunction rebuildLines(state: State, home: string): void {\n state.lines = buildSections({\n repo: state.repo,\n prs: state.prs,\n localBranches: state.localBranches,\n home,\n });\n}\n\nasync function loadPrs(cwd: string, console: ConsoleIO): Promise<PullRequest[]> {\n const t0 = Date.now();\n const ghAvailable = await isGhAvailable();\n console.debug(`gh available=${ghAvailable}`);\n if (!ghAvailable) return [];\n const prs = await listPullRequests(cwd);\n console.debug(`listed ${prs.length} PRs in ${Date.now() - t0}ms`);\n return prs;\n}\n\n// Re-exported so existing callers that imported it from select.ts keep working.\nexport type { SlashCommand };\n\nexport function defaultHome(): string {\n return process.env[\"HOME\"] ?? homedir();\n}\n","import path from \"node:path\";\n\nexport interface DisplayPathOptions {\n path: string;\n mainWorktree: string;\n mainParent: string;\n home: string;\n}\n\n/**\n * Mirrors the bash `display_path` helper.\n * Collapses paths into `.`, `./...`, `../...`, or `~/...` when possible.\n */\nexport function displayPath({\n path: target,\n mainWorktree,\n mainParent,\n home,\n}: DisplayPathOptions): string {\n if (target === mainWorktree) return \".\";\n if (mainWorktree && target.startsWith(`${mainWorktree}/`)) {\n return `./${target.slice(mainWorktree.length + 1)}`;\n }\n if (mainParent && target.startsWith(`${mainParent}/`)) {\n return `../${target.slice(mainParent.length + 1)}`;\n }\n if (home && target.startsWith(`${home}/`)) {\n return `~/${target.slice(home.length + 1)}`;\n }\n return target;\n}\n\n/**\n * Mirrors the bash branch-to-slug logic used to derive worktree directory names.\n * Replaces `/`, spaces, and any non-[A-Za-z0-9._-] character with `-`,\n * then trims leading/trailing dashes. Empty results fall back to `worktree`.\n */\nexport function slugifyBranch(branch: string): string {\n let slug = branch.replace(/[/ ]/g, \"-\").replace(/[^A-Za-z0-9._-]/g, \"-\");\n slug = slug.replace(/^-+/, \"\").replace(/-+$/, \"\");\n if (slug === \"\") return \"worktree\";\n return slug;\n}\n\nexport function makeBranchPath(branch: string, mainWorktree: string, repoName: string): string {\n const parent = path.dirname(mainWorktree);\n return `${parent}/${repoName}-${slugifyBranch(branch)}`;\n}\n\nexport function makePrPath(prNumber: number, mainWorktree: string, repoName: string): string {\n const parent = path.dirname(mainWorktree);\n return `${parent}/${repoName}-pr-${prNumber}`;\n}\n","import type { DisplayLine, PullRequest, RepoContext, SectionKey, Worktree } from \"../types.js\";\nimport { displayPath, makeBranchPath, makePrPath } from \"./paths.js\";\n\nexport interface BuildSectionsInput {\n repo: RepoContext;\n prs: readonly PullRequest[];\n /** Local branches (refs/heads/*) - excluded if already a worktree or PR head. */\n localBranches: readonly string[];\n home: string;\n}\n\n/**\n * Branches already checked out in a non-main worktree.\n *\n * The main worktree's branch is intentionally NOT included so the local\n * branch section still surfaces the default branch (lets the user create\n * another worktree of it if they want).\n */\nexport function deriveBranchesWithWorktree(repo: RepoContext): Set<string> {\n const set = new Set<string>();\n for (const wt of repo.worktrees) {\n if (wt.branch && wt.path !== repo.mainWorktree) {\n set.add(wt.branch);\n }\n }\n return set;\n}\n\n/**\n * Build the unified picker line list. Order:\n * 1. main worktree\n * 2. linked worktrees\n * 3. PRs (if loaded)\n * 4. local branches without a worktree\n *\n * Slash commands (`/new`, `/delete`) handle creation and deletion, so this\n * list contains entities only - no synthetic action rows.\n */\nexport function buildSections({\n repo,\n prs,\n localBranches,\n home,\n}: BuildSectionsInput): DisplayLine[] {\n const lines: DisplayLine[] = [];\n const branchesWithWorktree = deriveBranchesWithWorktree(repo);\n const prBranches = new Set<string>();\n\n const rootMarker = repo.mainWorktree === repo.currentPath ? \" [current]\" : \"\";\n lines.push(\n line({\n kind: \"worktree\",\n section: \"main\",\n name: `${repo.repoName}${rootMarker}`,\n shortPath: \".\",\n fullPath: repo.mainWorktree,\n destination: repo.mainWorktree,\n branch: repo.mainWorktreeBranch ?? \"\",\n }),\n );\n\n for (const wt of repo.worktrees) {\n if (wt.path === repo.mainWorktree) continue;\n const label = worktreeLabel(wt, repo.currentPath);\n lines.push(\n line({\n kind: \"worktree\",\n section: \"wt\",\n name: label,\n shortPath: displayPath({\n path: wt.path,\n mainWorktree: repo.mainWorktree,\n mainParent: repo.mainParent,\n home,\n }),\n fullPath: wt.path,\n destination: wt.path,\n branch: wt.branch ?? \"\",\n }),\n );\n }\n\n for (const pr of prs) {\n prBranches.add(pr.branch);\n const existingWorktreePath = findNonMainWorktreePathForBranch(\n repo.worktrees,\n pr.branch,\n repo.mainWorktree,\n );\n const targetPath =\n existingWorktreePath ?? makePrPath(pr.number, repo.mainWorktree, repo.repoName);\n lines.push(\n line({\n kind: \"pr\",\n section: \"pr\",\n name: `#${pr.number} ${pr.title}`,\n shortPath: displayPath({\n path: targetPath,\n mainWorktree: repo.mainWorktree,\n mainParent: repo.mainParent,\n home,\n }),\n fullPath: targetPath,\n destination: targetPath,\n branch: pr.branch,\n prNumber: pr.number,\n }),\n );\n }\n\n for (const branch of localBranches) {\n if (branchesWithWorktree.has(branch)) continue;\n if (prBranches.has(branch)) continue;\n const targetPath = makeBranchPath(branch, repo.mainWorktree, repo.repoName);\n lines.push(\n line({\n kind: \"branch\",\n section: \"br\",\n name: branch,\n shortPath: displayPath({\n path: targetPath,\n mainWorktree: repo.mainWorktree,\n mainParent: repo.mainParent,\n home,\n }),\n fullPath: targetPath,\n destination: targetPath,\n branch,\n }),\n );\n }\n\n return lines;\n}\n\nexport function sectionCounts(lines: readonly DisplayLine[]): Map<SectionKey, number> {\n const counts = new Map<SectionKey, number>();\n for (const l of lines) {\n counts.set(l.section, (counts.get(l.section) ?? 0) + 1);\n }\n return counts;\n}\n\ninterface BuildLineInput {\n kind: DisplayLine[\"kind\"];\n section: DisplayLine[\"section\"];\n name: string;\n shortPath: string;\n fullPath: string;\n destination: string;\n branch: string;\n prNumber?: number;\n}\n\nfunction line(input: BuildLineInput): DisplayLine {\n return {\n kind: input.kind,\n section: input.section,\n name: input.name,\n shortPath: input.shortPath,\n fullPath: input.fullPath,\n destination: input.destination,\n branch: input.branch,\n prNumber: input.prNumber ?? null,\n };\n}\n\nfunction worktreeLabel(wt: Worktree, currentPath: string): string {\n const baseLabel = wt.branch\n ? wt.branch\n : wt.head\n ? `detached@${wt.head.slice(0, 7)}`\n : \"detached\";\n const marker = wt.path === currentPath ? \" [current]\" : \"\";\n return `${baseLabel}${marker}`;\n}\n\n/**\n * Skip the main worktree on purpose: a PR whose head branch matches the\n * default branch should still create a fresh `repo-pr-<n>` directory rather\n * than overwrite the main worktree with a detached checkout.\n */\nfunction findNonMainWorktreePathForBranch(\n worktrees: readonly Worktree[],\n branch: string,\n mainWorktree: string,\n): string | null {\n for (const wt of worktrees) {\n if (wt.path === mainWorktree) continue;\n if (wt.branch === branch) return wt.path;\n }\n return null;\n}\n","import { readFile, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { CdwtError } from \"../errors.js\";\nimport { ConfigError, mergeConfigs, parseConfig, type ParsedConfig } from \"../core/config.js\";\nimport type { CdwtConfig } from \"../types.js\";\n\nexport interface DiscoverConfigsInput {\n /** Real (resolved) cwd. */\n cwd: string;\n mainWorktree: string;\n /** Process HOME directory. */\n home: string;\n /** Optional CDWT_CONFIG env override. */\n override?: string | undefined;\n /** Optional debug callback; called for each path checked (hit/miss). */\n debug?: (msg: string) => void;\n}\n\n/**\n * Locate config files in weak-to-strong order. The list returned is suitable\n * to feed into `parseConfig` + `mergeConfigs`. Mirrors the bash discovery rules:\n * - if CDWT_CONFIG is set, only that file is read (and its absence is a hard\n * error)\n * - otherwise: $HOME/.cdwt/settings.json, then `.cdwt/settings.json` files\n * walking from filesystem root down to the cwd (or the main worktree, when\n * cwd is outside the main worktree).\n */\nexport async function discoverConfigFiles({\n cwd,\n mainWorktree,\n home,\n override,\n debug,\n}: DiscoverConfigsInput): Promise<string[]> {\n if (override !== undefined) {\n const exists = await fileExists(override);\n debug?.(`config override path=${override} exists=${exists}`);\n if (!exists) {\n throw new CdwtError(`config file not found: ${override}`);\n }\n return [override];\n }\n\n const seen = new Set<string>();\n const files: string[] = [];\n\n const homeFile = path.join(home, \".cdwt\", \"settings.json\");\n const homeExists = await fileExists(homeFile);\n debug?.(`config check path=${homeFile} hit=${homeExists}`);\n if (homeExists) {\n seen.add(homeFile);\n files.push(homeFile);\n }\n\n let scan = cwd;\n if (scan !== mainWorktree && !scan.startsWith(`${mainWorktree}/`)) {\n scan = mainWorktree;\n }\n const dirs: string[] = [];\n while (true) {\n dirs.push(scan);\n if (scan === \"/\" || scan === \"\") break;\n scan = path.dirname(scan);\n }\n // bash walks from root → cwd (weak → strong)\n for (let i = dirs.length - 1; i >= 0; i--) {\n const file = path.join(dirs[i]!, \".cdwt\", \"settings.json\");\n if (seen.has(file)) continue;\n const exists = await fileExists(file);\n debug?.(`config check path=${file} hit=${exists}`);\n if (exists) {\n seen.add(file);\n files.push(file);\n }\n }\n debug?.(`config discovery complete: found ${files.length} file(s): [${files.join(\", \")}]`);\n return files;\n}\n\nexport async function readMergedConfig(files: readonly string[]): Promise<CdwtConfig> {\n const parsed: ParsedConfig[] = [];\n for (const file of files) {\n let raw: string;\n try {\n raw = await readFile(file, \"utf8\");\n } catch (err) {\n throw new CdwtError(`failed to read config: ${file} (${(err as Error).message})`);\n }\n let json: unknown;\n try {\n json = JSON.parse(raw);\n } catch (err) {\n throw new CdwtError(`invalid JSON in ${file}: ${(err as Error).message}`);\n }\n try {\n parsed.push(parseConfig(json, file));\n } catch (err) {\n if (err instanceof ConfigError) {\n throw new CdwtError(`invalid config: ${file} (${err.message})`);\n }\n throw err;\n }\n }\n return mergeConfigs(parsed);\n}\n\nasync function fileExists(file: string): Promise<boolean> {\n try {\n const s = await stat(file);\n return s.isFile();\n } catch {\n return false;\n }\n}\n","import type { CdwtConfig } from \"../types.js\";\n\nexport class ConfigError extends Error {\n constructor(\n message: string,\n public readonly file?: string,\n ) {\n super(message);\n this.name = \"ConfigError\";\n }\n}\n\n/**\n * A parsed config preserves the distinction between \"key absent\" (don't override)\n * and \"key present with empty array\" (clear the inherited value), which the bash\n * version inherits from jq's `*` (recursive merge) operator.\n */\nexport interface ParsedConfig {\n copyIgnored: {\n paths?: string[];\n patterns?: string[];\n };\n}\n\nexport function emptyConfig(): CdwtConfig {\n return { copyIgnored: { paths: [], patterns: [] } };\n}\n\n/**\n * Parse and validate the JSON contents of a single `.cdwt/settings.json` file.\n * Mirrors the bash jq schema check.\n */\nexport function parseConfig(json: unknown, file?: string): ParsedConfig {\n if (json === null || typeof json !== \"object\" || Array.isArray(json)) {\n throw new ConfigError(\"config root must be an object\", file);\n }\n const root = json as Record<string, unknown>;\n const copyRaw = root[\"copyIgnored\"];\n if (copyRaw === undefined) {\n return { copyIgnored: {} };\n }\n if (copyRaw === null || typeof copyRaw !== \"object\" || Array.isArray(copyRaw)) {\n throw new ConfigError(\"copyIgnored must be an object\", file);\n }\n const copy = copyRaw as Record<string, unknown>;\n const out: ParsedConfig = { copyIgnored: {} };\n if (\"paths\" in copy) {\n out.copyIgnored.paths = readStringArray(copy[\"paths\"], \"copyIgnored.paths\", file);\n }\n if (\"patterns\" in copy) {\n out.copyIgnored.patterns = readStringArray(copy[\"patterns\"], \"copyIgnored.patterns\", file);\n }\n return out;\n}\n\nfunction readStringArray(value: unknown, key: string, file: string | undefined): string[] {\n if (!Array.isArray(value)) {\n throw new ConfigError(`${key} must be an array`, file);\n }\n for (const item of value) {\n if (typeof item !== \"string\") {\n throw new ConfigError(`${key} must contain only strings`, file);\n }\n }\n return [...(value as string[])];\n}\n\n/**\n * Merge configs in weak-to-strong order, mirroring jq's `*` (recursive merge):\n * later arrays REPLACE earlier ones; missing keys leave the earlier value intact.\n */\nexport function mergeConfigs(configs: readonly ParsedConfig[]): CdwtConfig {\n const merged = emptyConfig();\n for (const config of configs) {\n if (config.copyIgnored.paths !== undefined) {\n merged.copyIgnored.paths = [...config.copyIgnored.paths];\n }\n if (config.copyIgnored.patterns !== undefined) {\n merged.copyIgnored.patterns = [...config.copyIgnored.patterns];\n }\n }\n return merged;\n}\n","import { spawn, type SpawnOptions } from \"node:child_process\";\n\nexport interface RunResult {\n stdout: string;\n stderr: string;\n exitCode: number;\n}\n\nexport interface RunOptions {\n cwd?: string;\n env?: Record<string, string | undefined>;\n /**\n * When true, child stdio inherits the parent's terminal (for git worktree, gh checkout, ...).\n * The child's stdout is redirected to the parent's stderr so the wrapper's\n * `destination=$(command cdwt)` capture stays clean — git writes \"HEAD is now at ...\" to\n * stdout and would otherwise pollute the destination path. The user still sees the\n * message because parent stderr is the terminal.\n */\n inheritStdio?: boolean;\n /** Optional input to write on stdin. */\n input?: string;\n /**\n * When provided, called with a timing message after the child exits.\n * Receives: command args, exit code, wall time, stdout/stderr byte counts.\n */\n onDebug?: (msg: string) => void;\n}\n\n/**\n * Spawn a process and capture stdout/stderr.\n * Never throws on a non-zero exit; the caller decides what to do with `exitCode`.\n */\nexport function run(\n command: string,\n args: readonly string[],\n options: RunOptions = {},\n): Promise<RunResult> {\n return new Promise((resolve, reject) => {\n const t0 = Date.now();\n const stdio: SpawnOptions[\"stdio\"] = options.inheritStdio\n ? [\"inherit\", process.stderr, \"inherit\"]\n : [\"pipe\", \"pipe\", \"pipe\"];\n const child = spawn(command, args, {\n cwd: options.cwd,\n env: options.env,\n stdio,\n });\n\n if (options.inheritStdio) {\n child.on(\"error\", reject);\n child.on(\"close\", (exitCode) => {\n const code = exitCode ?? 0;\n const elapsed = Date.now() - t0;\n options.onDebug?.(\n `exec [inherited] ${command} ${args.join(\" \")} cwd=${options.cwd ?? \".\"} exit=${code} +${elapsed}ms`,\n );\n resolve({ stdout: \"\", stderr: \"\", exitCode: code });\n });\n return;\n }\n\n let stdout = \"\";\n let stderr = \"\";\n child.stdout?.on(\"data\", (chunk: Buffer) => {\n stdout += chunk.toString(\"utf8\");\n });\n child.stderr?.on(\"data\", (chunk: Buffer) => {\n stderr += chunk.toString(\"utf8\");\n });\n child.on(\"error\", reject);\n child.on(\"close\", (exitCode) => {\n const code = exitCode ?? 0;\n const elapsed = Date.now() - t0;\n options.onDebug?.(\n `exec ${command} ${args.join(\" \")} cwd=${options.cwd ?? \".\"} exit=${code} stdout=${stdout.length}B stderr=${stderr.length}B +${elapsed}ms`,\n );\n resolve({ stdout, stderr, exitCode: code });\n });\n\n if (options.input !== undefined) {\n child.stdin?.write(options.input);\n child.stdin?.end();\n }\n });\n}\n","import type { PullRequest } from \"../types.js\";\nimport { run } from \"./exec.js\";\n\nexport async function isGhAvailable(): Promise<boolean> {\n const result = await run(\"which\", [\"gh\"]);\n return result.exitCode === 0;\n}\n\ninterface GhPrItem {\n number: number;\n title: string;\n headRefName: string;\n}\n\n/**\n * List open PRs for the current repository. Returns an empty list if `gh`\n * exits with a non-zero status (which is what the bash version did via\n * `2>/dev/null`).\n */\nexport async function listPullRequests(cwd: string, limit = 100): Promise<PullRequest[]> {\n const result = await run(\n \"gh\",\n [\"pr\", \"list\", \"--limit\", String(limit), \"--json\", \"number,title,headRefName\"],\n { cwd },\n );\n if (result.exitCode !== 0) return [];\n let parsed: unknown;\n try {\n parsed = JSON.parse(result.stdout);\n } catch {\n return [];\n }\n if (!Array.isArray(parsed)) return [];\n const out: PullRequest[] = [];\n for (const item of parsed) {\n if (!isGhPrItem(item)) continue;\n out.push({ number: item.number, branch: item.headRefName, title: item.title });\n }\n return out;\n}\n\nexport async function checkoutPr(cwd: string, prNumber: number): Promise<boolean> {\n const result = await run(\"gh\", [\"pr\", \"checkout\", String(prNumber)], {\n cwd,\n inheritStdio: true,\n });\n return result.exitCode === 0;\n}\n\nfunction isGhPrItem(value: unknown): value is GhPrItem {\n if (!value || typeof value !== \"object\") return false;\n const v = value as Record<string, unknown>;\n return (\n typeof v[\"number\"] === \"number\" &&\n typeof v[\"title\"] === \"string\" &&\n typeof v[\"headRefName\"] === \"string\"\n );\n}\n","import path from \"node:path\";\nimport { realpath } from \"node:fs/promises\";\nimport { CdwtError } from \"../errors.js\";\nimport { parseWorktreeList } from \"../core/git-parse.js\";\nimport type { Worktree } from \"../types.js\";\nimport type { ConsoleIO } from \"./console.js\";\nimport { run } from \"./exec.js\";\n\n/**\n * Module-level debug hook. Set once at startup via `setGitDebug` when\n * verbose mode is enabled. This avoids threading a console through every\n * git helper signature.\n */\nlet _gitDebug: ((msg: string) => void) | undefined;\n\nexport function setGitDebug(fn: (msg: string) => void): void {\n _gitDebug = fn;\n}\n\nexport interface GitContext {\n cwd: string;\n gitRoot: string;\n gitCommonDir: string;\n expectedMainWorktree: string;\n}\n\nexport async function loadGitContext(cwd: string): Promise<GitContext> {\n let realCwd: string;\n try {\n realCwd = await realpath(cwd);\n } catch {\n throw new CdwtError(`invalid working directory: ${cwd}`);\n }\n const root = await runGit([\"rev-parse\", \"--show-toplevel\"], { cwd: realCwd });\n if (root.exitCode !== 0) {\n throw new CdwtError(\"not inside a git worktree\");\n }\n const commonDirResult = await runGit([\"rev-parse\", \"--git-common-dir\"], { cwd: realCwd });\n if (commonDirResult.exitCode !== 0) {\n throw new CdwtError(\"failed to resolve git common dir\");\n }\n let commonDir = commonDirResult.stdout.trim();\n if (!path.isAbsolute(commonDir)) {\n commonDir = await realpath(path.resolve(realCwd, commonDir));\n }\n return {\n cwd: realCwd,\n gitRoot: root.stdout.trim(),\n gitCommonDir: commonDir,\n expectedMainWorktree: path.dirname(commonDir),\n };\n}\n\nexport async function listWorktrees(cwd: string): Promise<Worktree[]> {\n const result = await runGit([\"worktree\", \"list\", \"--porcelain\"], { cwd });\n if (result.exitCode !== 0) {\n throw new CdwtError(\"failed to list git worktrees\");\n }\n return parseWorktreeList(result.stdout);\n}\n\nexport async function symbolicRef(cwd: string, ref: string): Promise<string | null> {\n const result = await runGit([\"symbolic-ref\", \"--quiet\", \"--short\", ref], { cwd });\n return result.exitCode === 0 ? result.stdout.trim() : null;\n}\n\nexport async function listLocalBranches(cwd: string): Promise<string[]> {\n const result = await runGit([\"for-each-ref\", \"--format=%(refname:short)\", \"refs/heads\"], {\n cwd,\n });\n if (result.exitCode !== 0) return [];\n return result.stdout.split(\"\\n\").filter((line) => line.length > 0);\n}\n\nexport async function listRemoteBranches(cwd: string): Promise<string[]> {\n const result = await runGit(\n [\"for-each-ref\", \"--format=%(refname:short)\", \"refs/remotes/origin\"],\n { cwd },\n );\n if (result.exitCode !== 0) return [];\n return result.stdout\n .split(\"\\n\")\n .filter((line) => line.length > 0 && line !== \"origin/HEAD\")\n .map((line) => line.replace(/^origin\\//, \"\"));\n}\n\nexport async function branchExists(cwd: string, branch: string): Promise<boolean> {\n const result = await runGit([\"show-ref\", \"--verify\", \"--quiet\", `refs/heads/${branch}`], {\n cwd,\n });\n return result.exitCode === 0;\n}\n\nexport async function checkRefFormat(cwd: string, branch: string): Promise<boolean> {\n const result = await runGit([\"check-ref-format\", \"--branch\", branch], { cwd });\n return result.exitCode === 0;\n}\n\nexport async function isGitIgnored(cwd: string, relativePath: string): Promise<boolean> {\n const result = await runGit([\"check-ignore\", \"-q\", \"--\", relativePath], { cwd });\n return result.exitCode === 0;\n}\n\nexport async function listIgnoredFiles(cwd: string): Promise<string[]> {\n const result = await runGit([\"ls-files\", \"--others\", \"--ignored\", \"--exclude-standard\", \"-z\"], {\n cwd,\n });\n if (result.exitCode !== 0) return [];\n return result.stdout.split(\"\\0\").filter((p) => p.length > 0);\n}\n\nexport async function listIgnoredFilesMatching(\n cwd: string,\n pathspecs: readonly string[],\n): Promise<string[]> {\n if (pathspecs.length === 0) return [];\n const result = await runGit(\n [\"ls-files\", \"--others\", \"--ignored\", \"--exclude-standard\", \"-z\", \"--\", ...pathspecs],\n { cwd },\n );\n if (result.exitCode !== 0) return [];\n return result.stdout.split(\"\\0\").filter((p) => p.length > 0);\n}\n\n/**\n * For commands that produce useful progress output (worktree add / remove),\n * we let git own the user's terminal. That way the output is identical to\n * `git worktree add` invoked by hand and we never duplicate it.\n */\nasync function runGitInherited(args: readonly string[], cwd: string): Promise<number> {\n const result = await run(\"git\", args, { cwd, inheritStdio: true, ...(_gitDebug && { onDebug: _gitDebug }) });\n return result.exitCode;\n}\n\nexport async function addWorktreeForBranch(\n cwd: string,\n destination: string,\n branch: string,\n): Promise<void> {\n const code = await runGitInherited([\"worktree\", \"add\", destination, branch], cwd);\n if (code !== 0) {\n throw new CdwtError(`git worktree add failed for ${branch} (exit ${code})`);\n }\n}\n\nexport async function addWorktreeNewBranch(\n cwd: string,\n destination: string,\n branch: string,\n baseRef: string,\n): Promise<void> {\n const code = await runGitInherited([\"worktree\", \"add\", \"-b\", branch, destination, baseRef], cwd);\n if (code !== 0) {\n throw new CdwtError(`git worktree add -b ${branch} from ${baseRef} failed (exit ${code})`);\n }\n}\n\nexport async function addWorktreeDetached(cwd: string, destination: string): Promise<void> {\n const code = await runGitInherited([\"worktree\", \"add\", \"--detach\", destination], cwd);\n if (code !== 0) {\n throw new CdwtError(`git worktree add --detach failed at ${destination} (exit ${code})`);\n }\n}\n\nexport interface RemoveWorktreeResult {\n exitCode: number;\n stderr: string;\n}\n\n/**\n * Attempt `git worktree remove` without force. Returns `{ exitCode, stderr }`\n * rather than throwing so the caller can decide how to handle dirty-worktree failures.\n */\nexport async function removeWorktree(\n cwd: string,\n target: string,\n): Promise<RemoveWorktreeResult> {\n const result = await run(\"git\", [\"worktree\", \"remove\", target], { cwd, ...(_gitDebug && { onDebug: _gitDebug }) });\n return { exitCode: result.exitCode, stderr: result.stderr };\n}\n\n/**\n * `git worktree remove --force`. Returns `{ exitCode, stderr }` so the caller\n * can surface git's message and decide whether to throw.\n */\nexport async function removeWorktreeForceRaw(\n cwd: string,\n target: string,\n): Promise<RemoveWorktreeResult> {\n const result = await run(\"git\", [\"worktree\", \"remove\", \"--force\", target], {\n cwd,\n ...(_gitDebug && { onDebug: _gitDebug }),\n });\n return { exitCode: result.exitCode, stderr: result.stderr };\n}\n\n/**\n * Best-effort cleanup used by rollback paths. Does not throw; instead reports\n * a clear remediation hint on the supplied console, so a leaked worktree can\n * be cleaned up by the user.\n */\nexport async function removeWorktreeForce(\n cwd: string,\n target: string,\n console: ConsoleIO,\n): Promise<void> {\n const result = await removeWorktreeForceRaw(cwd, target);\n if (result.exitCode === 0) return;\n if (result.stderr) console.err(result.stderr);\n console.errln(\n `cdwt: warning: failed to remove orphan worktree at ${target}; clean up with: git worktree remove --force \"${target}\"`,\n );\n}\n\nasync function runGit(args: readonly string[], options: { cwd: string }) {\n return run(\"git\", args, { cwd: options.cwd, ...(_gitDebug && { onDebug: _gitDebug }) });\n}\n","import type { Worktree } from \"../types.js\";\n\n/**\n * Parse the output of `git worktree list --porcelain` into a structured list.\n * The porcelain format places one attribute per line and separates worktrees\n * with blank lines. Lines we recognise: `worktree <path>`, `branch <ref>`,\n * `HEAD <sha>`, `detached`. Other lines (locked, prunable, ...) are ignored.\n */\nexport function parseWorktreeList(output: string): Worktree[] {\n const worktrees: Worktree[] = [];\n let current: { path: string; branch: string | null; head: string | null } | null = null;\n\n const flush = () => {\n if (current && current.path) {\n worktrees.push({ ...current });\n }\n current = null;\n };\n\n for (const rawLine of output.split(\"\\n\")) {\n const line = rawLine.replace(/\\r$/, \"\");\n if (line === \"\") {\n flush();\n continue;\n }\n if (line.startsWith(\"worktree \")) {\n flush();\n current = { path: line.slice(\"worktree \".length), branch: null, head: null };\n continue;\n }\n if (!current) continue;\n if (line.startsWith(\"branch \")) {\n const ref = line.slice(\"branch \".length);\n current.branch = ref.startsWith(\"refs/heads/\") ? ref.slice(\"refs/heads/\".length) : ref;\n } else if (line.startsWith(\"HEAD \")) {\n current.head = line.slice(\"HEAD \".length);\n }\n }\n flush();\n return worktrees;\n}\n","import path from \"node:path\";\nimport { CdwtError } from \"../errors.js\";\nimport { resolveDefaultBranch } from \"../core/default-branch.js\";\nimport type { RepoContext } from \"../types.js\";\nimport {\n listLocalBranches,\n listRemoteBranches,\n listWorktrees,\n loadGitContext,\n symbolicRef,\n} from \"./git.js\";\n\nexport async function loadRepoContext(cwd: string): Promise<RepoContext> {\n const git = await loadGitContext(cwd);\n const worktrees = await listWorktrees(git.cwd);\n const main = worktrees.find((wt) => wt.path === git.expectedMainWorktree);\n if (!main) {\n throw new CdwtError(\"failed to detect the main worktree\");\n }\n const mainParent = path.dirname(main.path);\n const repoName = path.basename(main.path);\n\n const [remoteHead, localBranches, remoteBranches] = await Promise.all([\n symbolicRef(git.cwd, \"refs/remotes/origin/HEAD\"),\n listLocalBranches(git.cwd),\n listRemoteBranches(git.cwd),\n ]);\n const worktreeBranches = new Set<string>();\n for (const wt of worktrees) {\n if (wt.branch) worktreeBranches.add(wt.branch);\n }\n\n const { branch, ref } = resolveDefaultBranch({\n remoteHead,\n mainWorktreeBranch: main.branch,\n localBranches: new Set(localBranches),\n remoteBranches: new Set(remoteBranches),\n worktreeBranches,\n });\n\n return {\n mainWorktree: main.path,\n mainParent,\n repoName,\n defaultBranch: branch,\n defaultBranchRef: ref,\n mainWorktreeBranch: main.branch,\n worktrees,\n cwd: git.cwd,\n currentPath: git.gitRoot,\n };\n}\n","export interface ResolveDefaultBranchInput {\n /** Result of `git symbolic-ref --short refs/remotes/origin/HEAD`, or null. */\n remoteHead: string | null;\n /** Branch checked out on the main worktree (if any). */\n mainWorktreeBranch: string | null;\n /** Local branches that exist (refs/heads/*). */\n localBranches: ReadonlySet<string>;\n /** Remote branches under origin/* (without the leading `origin/`). */\n remoteBranches: ReadonlySet<string>;\n /** Branches checked out across worktrees. */\n worktreeBranches: ReadonlySet<string>;\n}\n\nexport interface ResolvedDefaultBranch {\n branch: string | null;\n ref: string | null;\n}\n\nconst FALLBACK_CANDIDATES = [\"main\", \"master\"] as const;\n\n/**\n * Pure version of the bash `resolve_default_branch` helper.\n * Returns the inferred default branch name and a usable ref for `git worktree add`.\n */\nexport function resolveDefaultBranch(input: ResolveDefaultBranchInput): ResolvedDefaultBranch {\n let branch: string | null = null;\n\n if (input.remoteHead) {\n branch = input.remoteHead.startsWith(\"origin/\")\n ? input.remoteHead.slice(\"origin/\".length)\n : input.remoteHead;\n }\n\n if (!branch && input.mainWorktreeBranch) {\n branch = input.mainWorktreeBranch;\n }\n\n if (!branch) {\n for (const candidate of FALLBACK_CANDIDATES) {\n if (input.localBranches.has(candidate) || input.remoteBranches.has(candidate)) {\n branch = candidate;\n break;\n }\n }\n }\n\n if (!branch) {\n return { branch: null, ref: null };\n }\n\n if (input.localBranches.has(branch)) {\n return { branch, ref: branch };\n }\n if (input.remoteBranches.has(branch)) {\n return { branch, ref: `origin/${branch}` };\n }\n if (input.worktreeBranches.has(branch)) {\n return { branch, ref: branch };\n }\n return { branch, ref: null };\n}\n","import { spawn } from \"node:child_process\";\nimport { run } from \"../io/exec.js\";\n\nexport interface FzfOptions {\n args: string[];\n input: string;\n}\n\nexport interface FzfResult {\n exitCode: number;\n stdout: string;\n}\n\nexport async function isFzfAvailable(): Promise<boolean> {\n const result = await run(\"which\", [\"fzf\"]);\n return result.exitCode === 0;\n}\n\n/**\n * Spawn fzf with stdout captured but stdin/stderr connected to the user's TTY,\n * so the picker can render to the terminal while we still receive the choice.\n */\nexport function runFzf({ args, input }: FzfOptions): Promise<FzfResult> {\n return new Promise((resolve, reject) => {\n const child = spawn(\"fzf\", args, {\n stdio: [\"pipe\", \"pipe\", \"inherit\"],\n });\n let stdout = \"\";\n child.stdout.setEncoding(\"utf8\");\n child.stdout.on(\"data\", (chunk: string) => {\n stdout += chunk;\n });\n child.on(\"error\", reject);\n child.on(\"close\", (code) => resolve({ exitCode: code ?? 0, stdout }));\n child.stdin.write(input);\n child.stdin.end();\n });\n}\n","import type { DisplayLine, SectionKey } from \"../types.js\";\n\nexport const FIELD_SEP = \"\\x1f\";\nconst TAG_WIDTH = 11;\nconst NAME_WIDTH = 44;\n\nconst ESC = \"\\x1b[\";\nconst RESET = `${ESC}0m`;\nconst BOLD = `${ESC}1m`;\nconst FG_GREEN = `${ESC}32m`;\nconst FG_YELLOW = `${ESC}33m`;\nconst FG_CYAN = `${ESC}36m`;\nconst FG_MAGENTA = `${ESC}35m`;\nconst FG_GRAY = `${ESC}90m`;\n\ninterface SectionStyle {\n /** Human-readable label shown in brackets, e.g. `[worktree]`. */\n label: string;\n /** Single-cell glyph that hints at the row's \"kind\". */\n glyph: string;\n /** ANSI sequence applied to glyph + tag + name. */\n color: string;\n}\n\n/**\n * Visual identity per section.\n * - main / worktree: the worktree exists; enter = jump.\n * Filled glyph + vivid color.\n * - branch / PR: the worktree does NOT exist yet; enter = create.\n * Open glyph and a softer color so it contrasts with worktrees.\n */\nconst STYLES: Record<SectionKey, SectionStyle> = {\n main: { label: \"main\", glyph: \"★\", color: `${BOLD}${FG_GREEN}` },\n wt: { label: \"worktree\", glyph: \"●\", color: FG_CYAN },\n br: { label: \"branch\", glyph: \"○\", color: FG_YELLOW },\n pr: { label: \"PR\", glyph: \"◆\", color: FG_MAGENTA },\n};\n\n/**\n * Render a display line as\n * `<glyph> [label] name <dim shortPath><FS>shortPath<FS>fullPath`.\n *\n * Field 1 is the visible row. Field 2 carries the short path so fzf's\n * preview window can pull it; field 3 carries the absolute path used for\n * the final `cd` target.\n *\n * fzf is invoked with `--with-nth=1` so only field 1 is rendered, and\n * with `--nth=1` so matching is restricted to that field. Section labels\n * (e.g. `[worktree]`) appear as literal text so users can fzf-filter by\n * typing `worktree`, `branch`, `pr`, etc.\n */\nexport function renderLine(line: DisplayLine): string {\n const style = STYLES[line.section];\n const tag = pad(`[${style.label}]`, TAG_WIDTH);\n const paddedName = pad(line.name, NAME_WIDTH);\n const head = `${style.color}${style.glyph} ${tag} ${paddedName}${RESET}`;\n const pathHint = `${FG_GRAY}${line.shortPath}${RESET}`;\n const visible = `${head} ${pathHint}`;\n return `${visible}${FIELD_SEP}${line.shortPath}${FIELD_SEP}${line.fullPath}`;\n}\n\n// eslint-disable-next-line no-control-regex\nconst ANSI_RE = /\\x1b\\[[0-9;]*m/g;\n\nexport function stripAnsi(s: string): string {\n return s.replace(ANSI_RE, \"\");\n}\n\nexport function sectionLabel(section: SectionKey): string {\n return STYLES[section].label;\n}\n\nexport function tagOf(section: SectionKey): string {\n return `[${STYLES[section].label}]`;\n}\n\nfunction pad(value: string, width: number): string {\n return value.length >= width ? value : value + \" \".repeat(width - value.length);\n}\n","import type { ConsoleIO } from \"../io/console.js\";\nimport type { DisplayLine, SectionKey } from \"../types.js\";\nimport { isFzfAvailable, runFzf as runFzfDefault, type FzfOptions, type FzfResult } from \"./fzf.js\";\nimport { FIELD_SEP, renderLine, sectionLabel, stripAnsi } from \"./format.js\";\n\nexport type FzfRunner = (options: FzfOptions) => Promise<FzfResult>;\n\nconst FILTER_ORDER: readonly Filter[] = [\"all\", \"wt\", \"br\", \"pr\"];\ntype Filter = \"all\" | \"wt\" | \"br\" | \"pr\";\n\nfunction filterLabel(filter: Filter): string {\n return filter === \"all\" ? \"all\" : sectionLabel(filter);\n}\n\nconst FILTER_CYCLE_LABEL = `${FILTER_ORDER.map(filterLabel).join(\" / \")}`;\n\n/**\n * The fzf `/` key emits this sentinel via `become(...)`. `become` replaces\n * fzf with a `printf` that writes the sentinel and exits 0, which is the\n * cleanest way to signal \"user wants command mode\" out of fzf — `print(...)`\n * is suppressed on abort, and `accept` requires a match. Picking the sentinel\n * up in stdout is what tells `runSelect` to switch into command mode.\n */\nexport const COMMAND_SENTINEL = \"__CDWT_CMD__\";\n\nconst FOOTER = \"↵ go esc cancel tab filter ctrl-d delete / commands ? help\";\n\nconst HELP_BODY = [\n \"shortcuts\",\n \" enter go to highlighted entry\",\n \" esc cancel\",\n ` tab / shift-tab cycle filter (${FILTER_CYCLE_LABEL})`,\n \" ctrl-d delete the highlighted worktree\",\n \" / open the slash command palette\",\n \" ? this help\",\n \"\",\n \"row legend\",\n \" ★ [main] default-branch worktree (enter = jump)\",\n \" ● [worktree] existing linked worktree (enter = jump)\",\n \" ○ [branch] local branch without a worktree (enter = create then jump)\",\n \" ◆ [PR] GitHub PR (enter = checkout into a worktree then jump)\",\n];\n\nexport type SelectOutcome =\n | { kind: \"selected\"; line: DisplayLine }\n | { kind: \"delete-target\"; line: DisplayLine }\n | { kind: \"command-mode\"; initialInput?: string }\n | { kind: \"cancelled\" };\n\nexport interface SelectorOptions {\n console: ConsoleIO;\n /**\n * Override fzf detection. `true` forces fzf, `false` forces the numbered\n * fallback. Omit for auto-detect via PATH lookup.\n */\n useFzf?: boolean;\n /** Inject a custom runner for fzf. Defaults to spawning the real binary. */\n fzfRunner?: FzfRunner;\n /** Initial filter (used by `/pr` etc.). */\n initialFilter?: Filter;\n /** Prompt label override (e.g. \"delete> \"). */\n prompt?: string;\n /** Footer override. */\n footer?: string;\n}\n\nexport async function selectInteractive(\n allLines: readonly DisplayLine[],\n options: SelectorOptions,\n): Promise<SelectOutcome> {\n if (allLines.length === 0) return { kind: \"cancelled\" };\n\n const useFzf = options.useFzf ?? (await isFzfAvailable());\n options.console.debug(\n `selector mode=${useFzf ? \"fzf\" : \"prompt\"} totalLines=${allLines.length} initialFilter=${options.initialFilter ?? \"all\"}`,\n );\n\n if (useFzf) {\n return selectWithFzf(allLines, options);\n }\n return selectWithPrompt(allLines, options);\n}\n\nasync function selectWithFzf(\n allLines: readonly DisplayLine[],\n options: SelectorOptions,\n): Promise<SelectOutcome> {\n const runFzf = options.fzfRunner ?? runFzfDefault;\n let filter: Filter = options.initialFilter ?? \"all\";\n const prompt = options.prompt ?? \"> \";\n const footer = options.footer ?? FOOTER;\n\n while (true) {\n const visible = applyFilter(allLines, filter);\n if (visible.length === 0) {\n filter = \"all\";\n continue;\n }\n const inputLines = visible.map((line) => renderLine(line));\n // fzf --ansi strips ANSI escape codes from its output, so the lookup\n // keys must also be stripped to match.\n const lookup = new Map(visible.map((line) => [stripAnsi(renderLine(line)), line]));\n const header = filter === \"all\" ? \"\" : `filter: ${filterLabel(filter)}`;\n const result = await runFzf({\n args: [\n `--prompt=${prompt}`,\n \"--print-query\",\n `--delimiter=${FIELD_SEP}`,\n \"--nth=1\",\n // Field 1 carries the colored \"glyph + [tag] + name + dim path\" row,\n // fields 2/3 are data-only (preview / cd target). --with-nth=1 keeps\n // the visible row tidy; --ansi makes fzf interpret the color codes\n // and strip them when matching/printing.\n \"--with-nth=1\",\n \"--ansi\",\n \"--expect=tab,btab,?,ctrl-d\",\n \"--height=70%\",\n \"--reverse\",\n \"--layout=reverse\",\n \"--info=inline-right\",\n \"--header-first\",\n `--header=${header}`,\n `--footer=${footer}`,\n \"--preview\",\n 'if [ -n \"{3}\" ]; then printf \"%s\\\\n\" {3}; fi',\n \"--preview-window=down:3:wrap\",\n // `/` leaves the picker. `become` replaces fzf with a printf that\n // writes the sentinel; we dispatch into command-mode from the caller.\n `--bind=/:become(printf '%s\\\\n' '${COMMAND_SENTINEL}')`,\n ],\n input: inputLines.join(\"\\n\"),\n });\n options.console.debug(\n `fzf returned exit=${result.exitCode} stdoutBytes=${result.stdout.length}`,\n );\n\n if (containsCommandSentinel(result.stdout)) {\n return { kind: \"command-mode\" };\n }\n\n const outcome = parsePickerOutput(result.stdout, result.exitCode);\n options.console.debug(\n `fzf parsed key=${JSON.stringify(outcome.key)} query=${JSON.stringify(outcome.query)} selected=${outcome.selected ? \"yes\" : \"no\"}`,\n );\n if (outcome.cancelled) return { kind: \"cancelled\" };\n\n if (outcome.key === \"tab\") {\n filter = nextFilter(filter, +1);\n continue;\n }\n if (outcome.key === \"btab\") {\n filter = nextFilter(filter, -1);\n continue;\n }\n if (outcome.key === \"?\") {\n await runHelpOverlay(runFzf);\n continue;\n }\n if (outcome.key === \"ctrl-d\") {\n if (outcome.selected) {\n const line = lookup.get(stripAnsi(outcome.selected));\n if (line) return { kind: \"delete-target\", line };\n }\n continue;\n }\n\n if (outcome.selected) {\n const line = lookup.get(stripAnsi(outcome.selected));\n if (line) return { kind: \"selected\", line };\n }\n return { kind: \"cancelled\" };\n }\n}\n\ninterface PickerOutput {\n cancelled: boolean;\n query: string;\n key: string;\n selected: string;\n}\n\nfunction containsCommandSentinel(stdout: string): boolean {\n return stdout.split(\"\\n\").some((line) => line === COMMAND_SENTINEL);\n}\n\nfunction parsePickerOutput(stdout: string, exitCode: number): PickerOutput {\n if (exitCode !== 0 && stdout === \"\") {\n return { cancelled: true, query: \"\", key: \"\", selected: \"\" };\n }\n const lines = stdout.replace(/\\n$/, \"\").split(\"\\n\");\n return {\n cancelled: false,\n query: lines[0] ?? \"\",\n key: lines[1] ?? \"\",\n selected: lines[2] ?? \"\",\n };\n}\n\nfunction applyFilter(lines: readonly DisplayLine[], filter: Filter): DisplayLine[] {\n if (filter === \"all\") return [...lines];\n return lines.filter((l) => sectionMatches(l.section, filter));\n}\n\nfunction sectionMatches(section: SectionKey, filter: Filter): boolean {\n return section === filter;\n}\n\nfunction nextFilter(current: Filter, step: number): Filter {\n const idx = FILTER_ORDER.indexOf(current);\n const next = (idx + step + FILTER_ORDER.length) % FILTER_ORDER.length;\n return FILTER_ORDER[next]!;\n}\n\nasync function runHelpOverlay(runFzf: FzfRunner): Promise<void> {\n await runFzf({\n args: [\n \"--prompt=help> \",\n \"--height=70%\",\n \"--reverse\",\n \"--layout=reverse\",\n \"--info=hidden\",\n \"--header-first\",\n \"--header=press esc to close\",\n \"--no-sort\",\n \"--disabled\",\n ],\n input: HELP_BODY.join(\"\\n\"),\n });\n}\n\nconst MAX_PROMPT_RETRIES = 5;\n\nasync function selectWithPrompt(\n allLines: readonly DisplayLine[],\n options: SelectorOptions,\n): Promise<SelectOutcome> {\n const console = options.console;\n let filter: Filter = options.initialFilter ?? \"all\";\n\n for (let attempt = 0; attempt < MAX_PROMPT_RETRIES; attempt++) {\n const visible = applyFilter(allLines, filter);\n if (visible.length === 0) {\n filter = \"all\";\n continue;\n }\n console.errln(\"\");\n if (filter !== \"all\") console.errln(`(filter: ${filterLabel(filter)})`);\n visible.forEach((line, idx) =>\n console.errln(\n `${String(idx + 1).padStart(2)}) ${renderLine(line).split(FIELD_SEP)[0] ?? line.name}`,\n ),\n );\n console.errln(\n \"type number to go, d <number> to delete, /<command> for slash mode, blank to cancel\",\n );\n const answer = await console.ask(\"> \");\n if (answer === null) return { kind: \"cancelled\" };\n const trimmed = answer.trim();\n if (trimmed === \"\") return { kind: \"cancelled\" };\n\n if (trimmed.startsWith(\"/\")) {\n return { kind: \"command-mode\", initialInput: trimmed };\n }\n\n if (trimmed === \"tab\") {\n filter = nextFilter(filter, +1);\n continue;\n }\n if (trimmed === \"?\") {\n console.errln(HELP_BODY.join(\"\\n\"));\n continue;\n }\n\n const deleteMatch = /^d\\s+(\\d+)$/i.exec(trimmed);\n if (deleteMatch) {\n const n = Number.parseInt(deleteMatch[1]!, 10);\n if (!Number.isFinite(n) || n < 1 || n > visible.length) {\n console.errln(\"cdwt: invalid selection\");\n continue;\n }\n return { kind: \"delete-target\", line: visible[n - 1]! };\n }\n\n const n = Number.parseInt(trimmed, 10);\n if (!Number.isFinite(n) || n < 1 || n > visible.length) {\n console.errln(\"cdwt: invalid selection\");\n continue;\n }\n return { kind: \"selected\", line: visible[n - 1]! };\n }\n console.errln(\"cdwt: too many invalid attempts; aborting\");\n return { kind: \"cancelled\" };\n}\n","import type { ConsoleIO } from \"../io/console.js\";\n\n/**\n * Surface that slash-command executors call into. select.ts implements this\n * over its mutable state. Adding a new command that needs novel behaviour =\n * extend this interface and provide the implementation in select.ts.\n */\nexport interface CommandHost {\n console: ConsoleIO;\n /** Print the main worktree path on stdout (jumps via the zsh wrapper). */\n printMainDestination(): void;\n /**\n * Run the create-new-worktree action. Returns the exit code that should\n * propagate out of `runSelect` (0 on success, EXIT_CANCELLED on abort, ...).\n */\n createNewWorktree(branch: string | undefined): Promise<number>;\n /** Load PRs via `gh` and rebuild the picker rows. */\n loadPrs(): Promise<void>;\n /** Reload worktrees, branches, and (if already loaded) PRs. */\n refresh(): Promise<void>;\n}\n\nexport type CommandResult =\n | { kind: \"exit\"; code: number }\n | { kind: \"continue\" };\n\nexport interface SlashCommand {\n name: string;\n aliases: readonly string[];\n description: string;\n /**\n * Hint shown next to the command in the palette / help text. e.g.\n * `<branch>` for `/new <branch>`. Omit for commands that take no arg.\n */\n argHint?: string;\n execute(rawArgs: string, host: CommandHost): Promise<CommandResult>;\n}\n\nconst NEW_CMD: SlashCommand = {\n name: \"new\",\n aliases: [\"n\"],\n description: \"create a worktree from the default branch\",\n argHint: \"<branch>\",\n async execute(rawArgs, host) {\n const branch = rawArgs.trim() === \"\" ? undefined : rawArgs.trim();\n const code = await host.createNewWorktree(branch);\n return { kind: \"exit\", code };\n },\n};\n\nconst MAIN_CMD: SlashCommand = {\n name: \"main\",\n aliases: [\"home\"],\n description: \"jump to the main worktree\",\n execute(_rawArgs, host) {\n host.printMainDestination();\n return Promise.resolve({ kind: \"exit\", code: 0 });\n },\n};\n\nconst PR_CMD: SlashCommand = {\n name: \"pr\",\n aliases: [],\n description: \"load and filter pull requests\",\n async execute(_rawArgs, host) {\n await host.loadPrs();\n return { kind: \"continue\" };\n },\n};\n\nconst REFRESH_CMD: SlashCommand = {\n name: \"refresh\",\n aliases: [\"reload\", \"r\"],\n description: \"reload worktrees, branches, and PRs\",\n async execute(_rawArgs, host) {\n await host.refresh();\n return { kind: \"continue\" };\n },\n};\n\nconst HELP_CMD: SlashCommand = {\n name: \"help\",\n aliases: [\"h\", \"?\"],\n description: \"show command help\",\n execute(_rawArgs, host) {\n host.console.errln(buildHelpText(SLASH_COMMANDS));\n return Promise.resolve({ kind: \"continue\" });\n },\n};\n\nexport const SLASH_COMMANDS: readonly SlashCommand[] = [\n NEW_CMD,\n MAIN_CMD,\n PR_CMD,\n REFRESH_CMD,\n HELP_CMD,\n];\n\nexport function findCommand(name: string): SlashCommand | null {\n if (name === \"\") return null;\n return (\n SLASH_COMMANDS.find((c) => c.name === name || c.aliases.includes(name)) ?? null\n );\n}\n\nexport interface ParsedCommandLine {\n command: SlashCommand;\n args: string;\n}\n\n/**\n * Parse a raw line typed by the user (with or without leading slash). Returns\n * null when the input isn't a slash command or the command name is unknown.\n */\nexport function parseCommandLine(input: string): ParsedCommandLine | null {\n const trimmed = input.trim();\n if (!trimmed.startsWith(\"/\")) return null;\n const body = trimmed.slice(1).trim();\n if (body === \"\") return null;\n const [head, ...rest] = body.split(/\\s+/);\n if (head === undefined || head === \"\") return null;\n const command = findCommand(head);\n if (!command) return null;\n return { command, args: rest.join(\" \") };\n}\n\nexport function buildHelpText(commands: readonly SlashCommand[]): string {\n const rows = commands.map((cmd) => {\n const aliases = cmd.aliases.map((a) => `/${a}`).join(\", \");\n const left = `/${cmd.name}${cmd.argHint ? ` ${cmd.argHint}` : \"\"}`;\n const aliasPart = aliases ? ` (${aliases})` : \"\";\n return ` ${left.padEnd(20)} ${cmd.description}${aliasPart}`;\n });\n return [\"slash commands\", ...rows].join(\"\\n\");\n}\n","import {\n buildHelpText,\n parseCommandLine,\n type SlashCommand,\n} from \"../commands/slash-commands.js\";\nimport type { ConsoleIO } from \"../io/console.js\";\nimport {\n isFzfAvailable,\n runFzf as runFzfDefault,\n type FzfOptions,\n type FzfResult,\n} from \"./fzf.js\";\nimport { FIELD_SEP } from \"./format.js\";\n\nexport type FzfRunner = (options: FzfOptions) => Promise<FzfResult>;\n\nexport type CommandModeOutcome =\n | { kind: \"command\"; command: SlashCommand; args: string }\n | { kind: \"cancelled\" };\n\nexport interface CommandModeOptions {\n console: ConsoleIO;\n registry: readonly SlashCommand[];\n useFzf?: boolean;\n fzfRunner?: FzfRunner;\n /**\n * If set, parsed first as a `/<name> [args]` line. On a hit, the command is\n * returned without showing the palette. This lets the picker pass through\n * full lines typed in the numbered fallback (e.g. `/main`, `/new feat/x`).\n */\n initialInput?: string;\n}\n\nconst PROMPT = \"cmd> \";\n\n/**\n * Read-eval-loop for slash commands.\n *\n * fzf path: a palette of available commands. fzf is the discovery surface;\n * picking an entry that has an `argHint` triggers a follow-up `console.ask`.\n *\n * Prompt fallback: a numbered list. Either type the number, or type the\n * full `/<name> [args]` line directly.\n */\nexport async function runCommandMode(\n options: CommandModeOptions,\n): Promise<CommandModeOutcome> {\n if (options.initialInput !== undefined) {\n const parsed = parseCommandLine(options.initialInput);\n if (parsed) {\n return resolveArgs(parsed.command, parsed.args, options);\n }\n options.console.errln(`cdwt: unknown command: ${options.initialInput.trim()}`);\n }\n\n const useFzf = options.useFzf ?? (await isFzfAvailable());\n if (useFzf) return runWithFzf(options);\n return runWithPrompt(options);\n}\n\nconst MAX_PROMPT_RETRIES = 5;\n\nasync function runWithPrompt(options: CommandModeOptions): Promise<CommandModeOutcome> {\n const { console, registry } = options;\n\n for (let attempt = 0; attempt < MAX_PROMPT_RETRIES; attempt++) {\n console.errln(\"\");\n registry.forEach((cmd, idx) => console.errln(formatPaletteRow(cmd, idx + 1)));\n console.errln(\n \"type number to pick, /<name> [args] to dispatch directly, blank to cancel\",\n );\n const answer = await console.ask(PROMPT);\n if (answer === null) return { kind: \"cancelled\" };\n const trimmed = answer.trim();\n if (trimmed === \"\") return { kind: \"cancelled\" };\n\n if (trimmed.startsWith(\"/\")) {\n const parsed = parseCommandLine(trimmed);\n if (parsed) return resolveArgs(parsed.command, parsed.args, options);\n console.errln(`cdwt: unknown command: ${trimmed}`);\n continue;\n }\n\n const n = Number.parseInt(trimmed, 10);\n if (!Number.isFinite(n) || n < 1 || n > registry.length) {\n console.errln(\"cdwt: invalid selection\");\n continue;\n }\n const command = registry[n - 1]!;\n return resolveArgs(command, \"\", options);\n }\n console.errln(\"cdwt: too many invalid attempts; aborting\");\n return { kind: \"cancelled\" };\n}\n\nasync function runWithFzf(options: CommandModeOptions): Promise<CommandModeOutcome> {\n const runFzf = options.fzfRunner ?? runFzfDefault;\n const { registry, console } = options;\n\n const inputLines = registry.map((cmd) => renderPaletteLine(cmd));\n const lookup = new Map(inputLines.map((line, idx) => [line, registry[idx]!]));\n\n const result = await runFzf({\n args: [\n `--prompt=${PROMPT}`,\n \"--print-query\",\n `--delimiter=${FIELD_SEP}`,\n \"--nth=1\",\n \"--height=40%\",\n \"--reverse\",\n \"--layout=reverse\",\n \"--info=inline-right\",\n \"--header=pick a command\",\n ],\n input: inputLines.join(\"\\n\"),\n });\n\n if (result.exitCode !== 0 && result.stdout === \"\") {\n return { kind: \"cancelled\" };\n }\n\n const lines = result.stdout.replace(/\\n$/, \"\").split(\"\\n\");\n const query = lines[0] ?? \"\";\n const selected = lines[1] ?? \"\";\n\n // If user typed a freeform `/<name> [args]` query, dispatch on Enter.\n if (query.startsWith(\"/\")) {\n const parsed = parseCommandLine(query);\n if (parsed) return resolveArgs(parsed.command, parsed.args, options);\n console.errln(`cdwt: unknown command: ${query.trim()}`);\n return { kind: \"cancelled\" };\n }\n\n const command = selected ? lookup.get(selected) : undefined;\n if (!command) return { kind: \"cancelled\" };\n return resolveArgs(command, \"\", options);\n}\n\nasync function resolveArgs(\n command: SlashCommand,\n rawArgs: string,\n options: CommandModeOptions,\n): Promise<CommandModeOutcome> {\n if (command.argHint && rawArgs.trim() === \"\") {\n const answer = await options.console.ask(`/${command.name} ${command.argHint}> `);\n if (answer === null || answer.trim() === \"\") return { kind: \"cancelled\" };\n return { kind: \"command\", command, args: answer.trim() };\n }\n return { kind: \"command\", command, args: rawArgs };\n}\n\nfunction renderPaletteLine(cmd: SlashCommand): string {\n const left = `/${cmd.name}${cmd.argHint ? ` ${cmd.argHint}` : \"\"}`;\n return `${left.padEnd(20)}${FIELD_SEP}${cmd.description}`;\n}\n\nfunction formatPaletteRow(cmd: SlashCommand, n: number): string {\n const left = `/${cmd.name}${cmd.argHint ? ` ${cmd.argHint}` : \"\"}`;\n return `${String(n).padStart(2)}) ${left.padEnd(20)} ${cmd.description}`;\n}\n\n// Used in tests to assert help can be derived from the registry.\nexport { buildHelpText };\n","import { stat } from \"node:fs/promises\";\nimport { CdwtError } from \"../errors.js\";\nimport { copyConfiguredIgnoredPaths } from \"../io/copy-files.js\";\nimport {\n addWorktreeDetached,\n addWorktreeForBranch,\n addWorktreeNewBranch,\n branchExists,\n checkRefFormat,\n removeWorktree,\n removeWorktreeForce,\n removeWorktreeForceRaw,\n} from \"../io/git.js\";\nimport { checkoutPr } from \"../io/gh.js\";\nimport type { ConsoleIO } from \"../io/console.js\";\nimport type { CdwtConfig, RepoContext } from \"../types.js\";\nimport { makeBranchPath } from \"../core/paths.js\";\n\nexport const EXIT_CANCELLED = 130;\nconst MAX_BRANCH_PROMPT_RETRIES = 5;\n\nexport interface ActionContext {\n repo: RepoContext;\n config: CdwtConfig;\n branchesWithWorktree: ReadonlySet<string>;\n console: ConsoleIO;\n}\n\nexport type DeleteOutcome = { kind: \"deleted\" } | { kind: \"cancelled\" };\n\n/** Print the destination path so the shell wrapper can `cd` into it. */\nexport function printDestination(console: ConsoleIO, target: string): void {\n console.outln(target);\n warnIfShellWrapperMissing(console);\n}\n\nfunction warnIfShellWrapperMissing(console: ConsoleIO): void {\n const stdoutIsTty = Boolean((process.stdout as { isTTY?: boolean }).isTTY);\n if (!stdoutIsTty || process.env[\"CDWT_SHELL_WRAPPER\"] === \"1\") return;\n\n console.errln(\n \"cdwt: shell integration is not loaded, so this command printed the destination path only.\",\n );\n console.errln(\"cdwt: run `cdwt install`, then `source ~/.zshrc` or restart your shell.\");\n}\n\nexport async function deleteWorktreeAction(\n ctx: ActionContext,\n target: string,\n): Promise<DeleteOutcome> {\n if (target === ctx.repo.mainWorktree) {\n throw new CdwtError(\"refusing to delete the default branch worktree\");\n }\n if (!(await ctx.console.confirm(`Delete worktree at \"${target}\"? [y/N] `))) {\n ctx.console.debug(`delete cancelled by user for ${target}`);\n return { kind: \"cancelled\" };\n }\n\n ctx.console.debug(`attempting git worktree remove for ${target}`);\n const result = await removeWorktree(ctx.repo.mainWorktree, target);\n ctx.console.debug(\n `git worktree remove exit=${result.exitCode} stderr=${result.stderr.length}B`,\n );\n\n if (result.exitCode === 0) {\n ctx.console.debug(`delete succeeded (clean) for ${target}`);\n return { kind: \"deleted\" };\n }\n\n if (result.stderr) ctx.console.errln(result.stderr.trimEnd());\n ctx.console.debug(`worktree is dirty, prompting for force delete`);\n\n if (!(await ctx.console.confirm(`Worktree has uncommitted changes. Force delete? [y/N] `))) {\n ctx.console.debug(`force delete cancelled by user for ${target}`);\n return { kind: \"cancelled\" };\n }\n\n ctx.console.debug(`attempting force remove for ${target}`);\n const force = await removeWorktreeForceRaw(ctx.repo.mainWorktree, target);\n ctx.console.debug(`force remove exit=${force.exitCode} stderr=${force.stderr.length}B`);\n\n if (force.exitCode !== 0) {\n if (force.stderr) ctx.console.errln(force.stderr.trimEnd());\n throw new CdwtError(\n `git worktree remove --force failed for ${target} (exit ${force.exitCode})`,\n );\n }\n\n ctx.console.debug(`force delete succeeded for ${target}`);\n return { kind: \"deleted\" };\n}\n\nexport async function createWorktreeForBranchAction(\n ctx: ActionContext,\n branch: string,\n target: string,\n): Promise<number> {\n await assertDestinationFree(target);\n await addWorktreeForBranch(ctx.repo.cwd, target, branch);\n await copyConfiguredIgnoredPaths({\n source: ctx.repo.mainWorktree,\n destination: target,\n config: ctx.config,\n console: ctx.console,\n });\n printDestination(ctx.console, target);\n return 0;\n}\n\nexport async function createNewWorktreeAction(\n ctx: ActionContext,\n branchArg?: string,\n): Promise<number> {\n const ref = ctx.repo.defaultBranchRef;\n if (!ref) throw new CdwtError(\"failed to detect the default branch\");\n\n const branch =\n branchArg !== undefined && branchArg !== \"\"\n ? await validateNewBranch(ctx, branchArg)\n : await readNewBranchName(ctx);\n if (branch === null) return EXIT_CANCELLED;\n const target = makeBranchPath(branch, ctx.repo.mainWorktree, ctx.repo.repoName);\n await assertDestinationFree(target);\n await addWorktreeNewBranch(ctx.repo.cwd, target, branch, ref);\n await copyConfiguredIgnoredPaths({\n source: ctx.repo.mainWorktree,\n destination: target,\n config: ctx.config,\n console: ctx.console,\n });\n printDestination(ctx.console, target);\n return 0;\n}\n\nexport async function createPrWorktreeAction(\n ctx: ActionContext,\n prNumber: number,\n target: string,\n): Promise<number> {\n await assertDestinationFree(target);\n await addWorktreeDetached(ctx.repo.cwd, target);\n const ok = await checkoutPr(target, prNumber);\n if (!ok) {\n await removeWorktreeForce(ctx.repo.cwd, target, ctx.console);\n throw new CdwtError(`failed to checkout PR #${prNumber}`);\n }\n await copyConfiguredIgnoredPaths({\n source: ctx.repo.mainWorktree,\n destination: target,\n config: ctx.config,\n console: ctx.console,\n });\n printDestination(ctx.console, target);\n return 0;\n}\n\nasync function validateNewBranch(ctx: ActionContext, raw: string): Promise<string | null> {\n const branch = raw.trim();\n if (branch === \"\") return null;\n if (!(await checkRefFormat(ctx.repo.cwd, branch))) {\n ctx.console.errln(`cdwt: invalid branch name: ${branch}`);\n return null;\n }\n if (await branchExists(ctx.repo.cwd, branch)) {\n ctx.console.errln(`cdwt: branch already exists: ${branch}`);\n return null;\n }\n if (ctx.branchesWithWorktree.has(branch)) {\n ctx.console.errln(`cdwt: branch already has a worktree: ${branch}`);\n return null;\n }\n return branch;\n}\n\nasync function readNewBranchName(ctx: ActionContext): Promise<string | null> {\n for (let attempt = 0; attempt < MAX_BRANCH_PROMPT_RETRIES; attempt++) {\n const raw = await ctx.console.ask(\"New branch name: \");\n if (raw === null) return null;\n const branch = raw.trim();\n if (branch === \"\") return null;\n const validated = await validateNewBranch(ctx, branch);\n if (validated !== null) return validated;\n }\n ctx.console.errln(`cdwt: too many invalid branch name attempts; aborting`);\n return null;\n}\n\nasync function assertDestinationFree(target: string): Promise<void> {\n try {\n await stat(target);\n } catch {\n return;\n }\n throw new CdwtError(`destination already exists: ${target}`);\n}\n","import { cp, mkdir, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { copyPatternMatchesPath, patternsToPathspecs, validateCopyPath } from \"../core/copy.js\";\nimport type { CdwtConfig } from \"../types.js\";\nimport type { ConsoleIO } from \"./console.js\";\nimport { isGitIgnored, listIgnoredFilesMatching } from \"./git.js\";\n\nexport interface CopyIgnoredOptions {\n source: string;\n destination: string;\n config: CdwtConfig;\n console: ConsoleIO;\n}\n\n/**\n * Copy ignored files from `source` to `destination` according to the merged\n * `copyIgnored` rules. Mirrors the bash `copy_configured_ignored_paths` flow:\n * explicit paths first, then pattern-matched ignored files.\n */\nexport async function copyConfiguredIgnoredPaths(options: CopyIgnoredOptions): Promise<void> {\n const { source, destination, config, console } = options;\n const t0Total = Date.now();\n\n console.debug(\n `copyConfiguredIgnoredPaths start source=${source} destination=${destination} paths=[${config.copyIgnored.paths.join(\",\")}] patterns=[${config.copyIgnored.patterns.join(\",\")}]`,\n );\n\n let timeInIsIgnored = 0;\n let timeInCp = 0;\n let copiedCount = 0;\n let skippedCount = 0;\n\n for (const relative of config.copyIgnored.paths) {\n validateCopyPath(relative);\n await copyOneIgnoredPath(source, destination, relative, console, {\n onTimeIgnored: (ms) => { timeInIsIgnored += ms; },\n onTimeCp: (ms) => { timeInCp += ms; },\n onCopied: () => { copiedCount++; },\n onSkipped: () => { skippedCount++; },\n });\n }\n\n if (config.copyIgnored.patterns.length === 0) {\n console.debug(\n `copyConfiguredIgnoredPaths done (no patterns) elapsed=${Date.now() - t0Total}ms copied=${copiedCount} skipped=${skippedCount}`,\n );\n return;\n }\n\n const pathspecs = patternsToPathspecs(config.copyIgnored.patterns);\n const t0Ls = Date.now();\n const ignored = await listIgnoredFilesMatching(source, pathspecs);\n const lsElapsed = Date.now() - t0Ls;\n console.debug(`git ls-files (targeted) returned ${ignored.length} entries in ${lsElapsed}ms`);\n\n const matched = ignored.filter((f) => copyPatternMatchesPath(f, config.copyIgnored.patterns));\n console.debug(`pattern filter: ${matched.length} of ${ignored.length} entries matched`);\n\n for (const relative of matched) {\n await copyOnePath(source, destination, relative, console, {\n onTimeCp: (ms) => { timeInCp += ms; },\n onCopied: () => { copiedCount++; },\n });\n }\n\n const totalElapsed = Date.now() - t0Total;\n console.debug(\n `copyConfiguredIgnoredPaths done elapsed=${totalElapsed}ms copied=${copiedCount} skipped=${skippedCount} timeInIsIgnored=${timeInIsIgnored}ms timeInCp=${timeInCp}ms other=${totalElapsed - timeInIsIgnored - timeInCp}ms`,\n );\n}\n\ninterface CopyTimers {\n onTimeIgnored: (ms: number) => void;\n onTimeCp: (ms: number) => void;\n onCopied: () => void;\n onSkipped: () => void;\n}\n\nasync function copyOneIgnoredPath(\n source: string,\n destination: string,\n relative: string,\n console: ConsoleIO,\n timers: CopyTimers,\n): Promise<void> {\n validateCopyPath(relative);\n const sourceItem = path.join(source, relative);\n const destinationItem = path.join(destination, relative);\n\n const sourceStat = await safeStat(sourceItem);\n if (!sourceStat) {\n console.debug(`copy skip (not found): ${relative}`);\n return;\n }\n\n const t0Ignored = Date.now();\n const ignored = await isGitIgnored(source, relative);\n const ignoredElapsed = Date.now() - t0Ignored;\n timers.onTimeIgnored(ignoredElapsed);\n\n if (!ignored) {\n console.debug(`copy skip (not git-ignored, isGitIgnored took ${ignoredElapsed}ms): ${relative}`);\n timers.onSkipped();\n console.errln(`cdwt: copy path is not ignored by git, skipping: ${relative}`);\n return;\n }\n\n const sizeInfo = sourceStat.isDirectory() ? \"dir\" : `${sourceStat.size}B`;\n console.debug(\n `copy ${relative} (${sizeInfo}) isGitIgnored=${ignoredElapsed}ms`,\n );\n\n // `cp` with recursive: true creates the destination root itself, so we\n // only need to ensure the *parent* directory exists for both file and\n // directory copies. Defaults: force overwrites, errorOnExist false,\n // verbatimSymlinks true (Node 22), which matches `cp -pR` closely enough\n // for our \"carry .env / .claude across worktrees\" use case.\n await mkdir(path.dirname(destinationItem), { recursive: true });\n\n const t0Cp = Date.now();\n await cp(sourceItem, destinationItem, {\n recursive: sourceStat.isDirectory(),\n preserveTimestamps: true,\n force: true,\n });\n const cpElapsed = Date.now() - t0Cp;\n timers.onTimeCp(cpElapsed);\n timers.onCopied();\n console.debug(`copy done ${relative} cp=${cpElapsed}ms`);\n}\n\ninterface CopyOneTimers {\n onTimeCp: (ms: number) => void;\n onCopied: () => void;\n}\n\nasync function copyOnePath(\n source: string,\n destination: string,\n relative: string,\n console: ConsoleIO,\n timers: CopyOneTimers,\n): Promise<void> {\n validateCopyPath(relative);\n const sourceItem = path.join(source, relative);\n const destinationItem = path.join(destination, relative);\n\n const sourceStat = await safeStat(sourceItem);\n if (!sourceStat) {\n console.debug(`copy skip (not found): ${relative}`);\n return;\n }\n\n const sizeInfo = sourceStat.isDirectory() ? \"dir\" : `${sourceStat.size}B`;\n console.debug(`copy ${relative} (${sizeInfo})`);\n\n await mkdir(path.dirname(destinationItem), { recursive: true });\n\n const t0Cp = Date.now();\n await cp(sourceItem, destinationItem, {\n recursive: sourceStat.isDirectory(),\n preserveTimestamps: true,\n force: true,\n });\n const cpElapsed = Date.now() - t0Cp;\n timers.onTimeCp(cpElapsed);\n timers.onCopied();\n console.debug(`copy done ${relative} cp=${cpElapsed}ms`);\n}\n\nasync function safeStat(target: string) {\n try {\n return await stat(target);\n } catch {\n return null;\n }\n}\n","import path from \"node:path\";\n\nexport class UnsafeCopyPathError extends Error {\n constructor(public readonly value: string) {\n super(`refusing unsafe copy path: ${value}`);\n this.name = \"UnsafeCopyPathError\";\n }\n}\n\n/**\n * Reject paths that are empty, absolute, or escape the worktree.\n * Mirrors the bash `validate_copy_path` helper.\n */\nexport function validateCopyPath(relativePath: string): void {\n if (\n relativePath === \"\" ||\n relativePath.startsWith(\"/\") ||\n relativePath.includes(\"/../\") ||\n relativePath.startsWith(\"../\") ||\n relativePath === \"..\"\n ) {\n throw new UnsafeCopyPathError(relativePath);\n }\n}\n\n/**\n * Convert user-facing copy patterns into git pathspecs suitable for\n * `git ls-files --others --ignored --exclude-standard -- <pathspecs>`.\n *\n * The result intentionally over-matches — callers should apply\n * `copyPatternMatchesPath` as a secondary filter to enforce exact semantics.\n */\nexport function patternsToPathspecs(patterns: readonly string[]): string[] {\n const specs: string[] = [];\n for (const p of patterns) {\n if (p.includes(\"/\")) {\n specs.push(`:(glob)${p}`);\n } else {\n specs.push(`:(glob)**/${p}`);\n }\n }\n return specs;\n}\n\n/**\n * Glob-ish pattern matcher that mirrors the bash `copy_pattern_matches_path` rules:\n * - patterns containing `/` are matched as full repo-relative paths via fnmatch\n * - patterns without `/` match the basename anywhere in the path, the path itself,\n * any directory prefix (`pattern/...`), or any suffix (`.../pattern` / `.../pattern/...`)\n */\nexport function copyPatternMatchesPath(relativePath: string, patterns: readonly string[]): boolean {\n const base = path.basename(relativePath);\n for (const pattern of patterns) {\n validateCopyPath(pattern);\n if (pattern.includes(\"/\")) {\n if (fnmatch(relativePath, pattern)) return true;\n continue;\n }\n if (fnmatch(base, pattern)) return true;\n if (relativePath === pattern) return true;\n if (relativePath.startsWith(`${pattern}/`)) return true;\n if (relativePath.endsWith(`/${pattern}`)) return true;\n if (relativePath.includes(`/${pattern}/`)) return true;\n }\n return false;\n}\n\n/**\n * Translate a bash `[[ str == pattern ]]`-style glob into a RegExp and test it.\n * Without `shopt -s globstar` (bash default), `*` matches any character\n * including `/`. `**` collapses to the same thing. We therefore use `.*` for\n * both. `?` matches any single character (including `/`). Bracket expressions\n * `[..]` are passed through.\n */\nfunction fnmatch(input: string, pattern: string): boolean {\n let regex = \"^\";\n for (let i = 0; i < pattern.length; i++) {\n const ch = pattern[i]!;\n if (ch === \"*\") {\n regex += \".*\";\n while (pattern[i + 1] === \"*\") i++;\n } else if (ch === \"?\") {\n regex += \".\";\n } else if (ch === \"[\") {\n const close = pattern.indexOf(\"]\", i + 1);\n if (close === -1) {\n regex += \"\\\\[\";\n } else {\n regex += pattern.slice(i, close + 1);\n i = close;\n }\n } else if (/[.+^${}()|\\\\]/.test(ch)) {\n regex += `\\\\${ch}`;\n } else {\n regex += ch;\n }\n }\n regex += \"$\";\n return new RegExp(regex).test(input);\n}\n","import { createInterface } from \"node:readline/promises\";\nimport type { Readable, Writable } from \"node:stream\";\n\n/**\n * Façade over stdin / stdout / stderr that the rest of the codebase depends on\n * instead of touching `process.*` directly. Lets us:\n * - swap in a fake during tests (see TestConsole)\n * - centralise EOF / non-TTY handling so callers never block CI pipelines\n */\nexport interface ConsoleIO {\n /** Write to stdout, no implicit newline. */\n out(chunk: string): void;\n /** Write to stdout followed by a newline. */\n outln(message?: string): void;\n /** Write to stderr, no implicit newline. */\n err(chunk: string): void;\n /** Write to stderr followed by a newline. */\n errln(message?: string): void;\n /**\n * Write a timestamped diagnostic line to stderr.\n * No-op when verbose mode is disabled.\n * Format: [cdwt verbose +NNNms] message\n */\n debug(message: string): void;\n /**\n * Read one line from stdin, prompting on stderr.\n * Returns null on EOF or when stdin is not a TTY (so callers can fail\n * fast in non-interactive contexts instead of hanging forever).\n */\n ask(prompt: string): Promise<string | null>;\n /** Yes / no confirmation. EOF or non-TTY is treated as \"no\". */\n confirm(prompt: string): Promise<boolean>;\n /** True when stdin is connected to a TTY. */\n readonly isInteractive: boolean;\n}\n\nconst YES = /^y(es)?$/i;\n\nexport interface DefaultConsoleStreams {\n stdin?: Readable;\n stdout?: Writable;\n stderr?: Writable;\n /** When true, debug() writes timestamped lines to stderr. */\n verbose?: boolean;\n}\n\nconst _startTime = Date.now();\n\nexport function createDefaultConsole(streams: DefaultConsoleStreams = {}): ConsoleIO {\n const stdin = streams.stdin ?? process.stdin;\n const stdout = streams.stdout ?? process.stdout;\n const stderr = streams.stderr ?? process.stderr;\n const isInteractive = Boolean((stdin as { isTTY?: boolean }).isTTY);\n const verbose = streams.verbose ?? false;\n\n const console: ConsoleIO = {\n out: (chunk) => stdout.write(chunk),\n outln: (message = \"\") => stdout.write(`${message}\\n`),\n err: (chunk) => stderr.write(chunk),\n errln: (message = \"\") => stderr.write(`${message}\\n`),\n debug(message) {\n if (!verbose) return;\n const elapsed = Date.now() - _startTime;\n stderr.write(`[cdwt verbose +${elapsed}ms] ${message}\\n`);\n },\n isInteractive,\n async ask(prompt) {\n if (!isInteractive) return null;\n const rl = createInterface({ input: stdin, output: stderr, terminal: true });\n try {\n return await rl.question(prompt);\n } catch {\n return null;\n } finally {\n rl.close();\n }\n },\n async confirm(prompt) {\n const answer = await this.ask(prompt);\n if (answer === null) return false;\n return YES.test(answer.trim());\n },\n };\n return console;\n}\n"],"mappings":"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","names":["pc","line","homedir","path","readFile","stat","path","fileExists","path","readFile","stat","exitCode","path","line","path","line","path","main","path","spawn","spawn","line","runFzf","line","exitCode","n","MAX_PROMPT_RETRIES","runFzf","line","stat","mkdir","stat","path","path","path","mkdir","stat","stat","defaultHome","homedir","defaultHome","pc"]}
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@soprog_/cdwt",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Interactive git worktree switcher with fzf integration",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
8
|
-
"url": "git+https://github.com/souta0104/
|
|
8
|
+
"url": "git+https://github.com/souta0104/cdwt.git"
|
|
9
9
|
},
|
|
10
10
|
"publishConfig": {
|
|
11
11
|
"access": "public"
|