worktree-add 1.3.12 → 2.0.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.
Files changed (47) hide show
  1. package/README.md +14 -6
  2. package/dist/app/resolve-open-target.d.ts +16 -0
  3. package/dist/app/resolve-open-target.d.ts.map +1 -0
  4. package/dist/app/{resolve-apps.js → resolve-open-target.js} +18 -9
  5. package/dist/app/resolve-open-target.js.map +1 -0
  6. package/dist/cli/cleanup-worktree.d.ts +2 -1
  7. package/dist/cli/cleanup-worktree.d.ts.map +1 -1
  8. package/dist/cli/cleanup-worktree.js +51 -4
  9. package/dist/cli/cleanup-worktree.js.map +1 -1
  10. package/dist/cli/open-worktree-apps.d.ts +2 -1
  11. package/dist/cli/open-worktree-apps.d.ts.map +1 -1
  12. package/dist/cli/open-worktree-apps.js +20 -2
  13. package/dist/cli/open-worktree-apps.js.map +1 -1
  14. package/dist/cli/plan-branch-cleanup.d.ts +17 -0
  15. package/dist/cli/plan-branch-cleanup.d.ts.map +1 -0
  16. package/dist/cli/plan-branch-cleanup.js +19 -0
  17. package/dist/cli/plan-branch-cleanup.js.map +1 -0
  18. package/dist/cli/run-worktree-add.d.ts +1 -0
  19. package/dist/cli/run-worktree-add.d.ts.map +1 -1
  20. package/dist/cli/run-worktree-add.js +8 -10
  21. package/dist/cli/run-worktree-add.js.map +1 -1
  22. package/dist/cli.js +5 -3
  23. package/dist/cli.js.map +1 -1
  24. package/dist/git/create-worktree.d.ts +15 -1
  25. package/dist/git/create-worktree.d.ts.map +1 -1
  26. package/dist/git/create-worktree.js +48 -33
  27. package/dist/git/create-worktree.js.map +1 -1
  28. package/dist/git/delete-created-branch.d.ts +3 -0
  29. package/dist/git/delete-created-branch.d.ts.map +1 -0
  30. package/dist/git/delete-created-branch.js +6 -0
  31. package/dist/git/delete-created-branch.js.map +1 -0
  32. package/dist/git/git.d.ts +3 -0
  33. package/dist/git/git.d.ts.map +1 -1
  34. package/dist/git/git.js +12 -0
  35. package/dist/git/git.js.map +1 -1
  36. package/dist/git/parse-branch-config.d.ts +4 -0
  37. package/dist/git/parse-branch-config.d.ts.map +1 -0
  38. package/dist/git/parse-branch-config.js +17 -0
  39. package/dist/git/parse-branch-config.js.map +1 -0
  40. package/dist/git/restore-branch-config.d.ts +3 -0
  41. package/dist/git/restore-branch-config.d.ts.map +1 -0
  42. package/dist/git/restore-branch-config.js +30 -0
  43. package/dist/git/restore-branch-config.js.map +1 -0
  44. package/package.json +5 -4
  45. package/dist/app/resolve-apps.d.ts +0 -7
  46. package/dist/app/resolve-apps.d.ts.map +0 -1
  47. package/dist/app/resolve-apps.js.map +0 -1
package/README.md CHANGED
@@ -24,13 +24,15 @@ Running `worktree-add <branch>` from inside a repo:
24
24
  8. Detects your package manager and installs dependencies with lockfile‑safe flags
25
25
  (`npm ci`, `pnpm install --frozen-lockfile`, `yarn install --immutable`, etc.).
26
26
  9. If the project uses Next.js and supports it, runs `next typegen`.
27
- 10. Opens the new worktree in your requested apps (if any).
27
+ 10. Opens the new worktree if you passed `--app` or `--open`.
28
28
 
29
29
  Your original checkout is left untouched.
30
30
 
31
+ If a later step fails or you interrupt the run, the tool removes the new worktree. Once the worktree is removed, it also deletes the branch if this run created it (from `HEAD` or from `origin/<branch>`) and the branch still points at the commit it was created at. Its `branch.<branch>.*` config goes back to what it was before the run: the tracking settings the run added are removed, and any values you had set are kept. A branch that existed before the run, gained commits, or is checked out in another worktree is kept.
32
+
31
33
  ## Requirements
32
34
 
33
- - Node.js ≥ 24.2.0
35
+ - Node.js ≥ 24.15.0
34
36
  - Git with `git worktree` support
35
37
  - Git credentials configured for `origin/` (the tool is non-interactive and won’t prompt for authentication)
36
38
 
@@ -72,6 +74,7 @@ Common options:
72
74
 
73
75
  ```text
74
76
  -a, --app <name> Open the worktree in an app (repeatable)
77
+ -o, --open Open the worktree after creating it
75
78
  --offline Create from HEAD when origin can't be reached
76
79
  -y, --yes Skip confirmation and replace existing destination
77
80
  --interactive Allow confirmation prompts (requires a TTY)
@@ -111,10 +114,13 @@ App names are executed on your machine, so only use values you trust. Validation
111
114
  Arguments are not parsed: values like `code -w` are treated as part of the app name and will likely fail.
112
115
 
113
116
  1. `--app <name>` flag (repeatable): `worktree-add feature/foo --app ghostty --app code`
114
- 2. `WORKTREE_ADD_APP` env var (comma-separated): `WORKTREE_ADD_APP=ghostty,code worktree-add feature/foo`
117
+ 2. `-o, --open`: `worktree-add feature/foo --open`
118
+ 3. `WORKTREE_ADD_APP` env var (comma-separated): the app list used by `--open`
115
119
 
116
- CLI flags take priority over the env var.
117
- To explicitly open nothing even when `WORKTREE_ADD_APP` is set, pass `--app ""`.
120
+ `--app` takes priority over `--open` / `WORKTREE_ADD_APP`.
121
+ `WORKTREE_ADD_APP` does not open anything on its own; pass `--open` to use it.
122
+ If `--open` is set and no apps are configured, the destination is opened with the OS default handler.
123
+ To explicitly open nothing even when `--open` is set, pass `--app ""`.
118
124
  Whitespace-only values like `--app " "` are treated as absent and do not override `WORKTREE_ADD_APP`.
119
125
 
120
126
  If launching an app fails to start, the worktree still stays created and ready.
@@ -123,10 +129,12 @@ Platform note: on macOS the app value is passed to `open -a`, so use an applicat
123
129
 
124
130
  Terminal-based editors (vim/nvim/nano) are not supported via `--app` — apps are launched detached from the current terminal.
125
131
 
126
- Tip: add a shell helper with your preferred apps in your shell profile:
132
+ Tip: set default apps for `--open` in your shell profile, then pass `-o` when you want them:
127
133
 
128
134
  ```bash
129
135
  worktree-add() { WORKTREE_ADD_APP=ghostty,code command worktree-add "$@" }
136
+ # worktree-add feature/foo # create only
137
+ # worktree-add feature/foo -o # create and open in Ghostty + VS Code
130
138
  ```
131
139
 
132
140
  Add it to your shell profile:
@@ -0,0 +1,16 @@
1
+ interface ResolveOpenTargetInput {
2
+ optionApps: string[] | undefined;
3
+ environmentApps: string | undefined;
4
+ open: boolean;
5
+ }
6
+ export type OpenTarget = {
7
+ type: "none";
8
+ } | {
9
+ type: "default";
10
+ } | {
11
+ type: "apps";
12
+ apps: string[];
13
+ };
14
+ export declare function resolveOpenTarget({ optionApps, environmentApps, open, }: ResolveOpenTargetInput): OpenTarget;
15
+ export {};
16
+ //# sourceMappingURL=resolve-open-target.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-open-target.d.ts","sourceRoot":"","sources":["../../src/app/resolve-open-target.ts"],"names":[],"mappings":"AAAA,UAAU,sBAAsB;IAC9B,UAAU,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACjC,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,MAAM,UAAU,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAwBnG,wBAAgB,iBAAiB,CAAC,EAChC,UAAU,EACV,eAAe,EACf,IAAI,GACL,EAAE,sBAAsB,GAAG,UAAU,CA2BrC"}
@@ -10,24 +10,33 @@ function dedupePreserveOrder(apps) {
10
10
  }
11
11
  return deduped;
12
12
  }
13
- export function resolveApps({ optionApps, environmentApps }) {
13
+ function parseAppList(value) {
14
+ return dedupePreserveOrder(value
15
+ .split(",")
16
+ .map((app) => app.trim())
17
+ .filter(Boolean));
18
+ }
19
+ export function resolveOpenTarget({ optionApps, environmentApps, open, }) {
14
20
  const hasExplicitEmptyOption = optionApps?.includes("") ?? false;
15
21
  const normalizedOptionApps = optionApps?.map((app) => app.trim()).filter(Boolean) ?? [];
16
22
  if (optionApps !== undefined) {
17
23
  if (normalizedOptionApps.length > 0) {
18
- return dedupePreserveOrder(normalizedOptionApps);
24
+ return { type: "apps", apps: dedupePreserveOrder(normalizedOptionApps) };
19
25
  }
20
26
  if (hasExplicitEmptyOption) {
21
- return [];
27
+ return { type: "none" };
22
28
  }
23
29
  }
30
+ if (!open) {
31
+ return { type: "none" };
32
+ }
24
33
  const normalized = environmentApps?.trim();
25
34
  if (normalized) {
26
- return dedupePreserveOrder(normalized
27
- .split(",")
28
- .map((app) => app.trim())
29
- .filter(Boolean));
35
+ const apps = parseAppList(normalized);
36
+ if (apps.length > 0) {
37
+ return { type: "apps", apps };
38
+ }
30
39
  }
31
- return [];
40
+ return { type: "default" };
32
41
  }
33
- //# sourceMappingURL=resolve-apps.js.map
42
+ //# sourceMappingURL=resolve-open-target.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-open-target.js","sourceRoot":"","sources":["../../src/app/resolve-open-target.ts"],"names":[],"mappings":"AAQA,SAAS,mBAAmB,CAAC,IAAc;IACzC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAClB,SAAS;QACX,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACd,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,mBAAmB,CACxB,KAAK;SACF,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;SACxB,MAAM,CAAC,OAAO,CAAC,CACnB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,EAChC,UAAU,EACV,eAAe,EACf,IAAI,GACmB;IACvB,MAAM,sBAAsB,GAAG,UAAU,EAAE,QAAQ,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC;IACjE,MAAM,oBAAoB,GAAG,UAAU,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IAExF,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,IAAI,oBAAoB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,CAAC,oBAAoB,CAAC,EAAE,CAAC;QAC3E,CAAC;QAED,IAAI,sBAAsB,EAAE,CAAC;YAC3B,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC1B,CAAC;IAED,MAAM,UAAU,GAAG,eAAe,EAAE,IAAI,EAAE,CAAC;IAC3C,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,IAAI,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;QACtC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAChC,CAAC;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;AAC7B,CAAC"}
@@ -1,3 +1,4 @@
1
1
  import type { StatusLogger } from "../output/create-status-logger.js";
2
- export declare function cleanupWorktree(destinationDirectory: string, logger: StatusLogger, reason: string): void;
2
+ import type { CreatedWorktree } from "../git/create-worktree.js";
3
+ export declare function cleanupWorktree(worktree: CreatedWorktree, logger: StatusLogger, reason: string): void;
3
4
  //# sourceMappingURL=cleanup-worktree.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cleanup-worktree.d.ts","sourceRoot":"","sources":["../../src/cli/cleanup-worktree.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAGtE,wBAAgB,eAAe,CAC7B,oBAAoB,EAAE,MAAM,EAC5B,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,MAAM,GACb,IAAI,CAWN"}
1
+ {"version":3,"file":"cleanup-worktree.d.ts","sourceRoot":"","sources":["../../src/cli/cleanup-worktree.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,KAAK,EAAiB,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAkDhF,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,eAAe,EACzB,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,MAAM,GACb,IAAI,CAcN"}
@@ -1,12 +1,59 @@
1
+ import { deleteCreatedBranch } from "../git/delete-created-branch.js";
2
+ import { extractDiagnosticLine } from "../git/extract-diagnostic-line.js";
3
+ import { resolveCommit } from "../git/git.js";
1
4
  import { removeWorktree } from "../git/remove-worktree.js";
2
- export function cleanupWorktree(destinationDirectory, logger, reason) {
3
- logger.warn(`Cleaning up worktree at ${JSON.stringify(destinationDirectory)} ${reason}.`);
5
+ import { restoreBranchConfig } from "../git/restore-branch-config.js";
6
+ import { findWorktreeByBranchName } from "../git/worktree-discovery.js";
7
+ import { planBranchCleanup } from "./plan-branch-cleanup.js";
8
+ function restoreCreatedBranchConfig(branch, logger) {
4
9
  try {
5
- removeWorktree(destinationDirectory);
10
+ restoreBranchConfig(branch.name, branch.preexistingConfig);
11
+ }
12
+ catch (error) {
13
+ const preexistingValues = branch.preexistingConfig.size === 0
14
+ ? ""
15
+ : ` Its values before this run: ${JSON.stringify(Object.fromEntries(branch.preexistingConfig))}`;
16
+ logger.warn(`Failed to restore the config of branch '${branch.name}': ${extractDiagnosticLine(error)}.${preexistingValues}`);
17
+ }
18
+ }
19
+ function cleanupCreatedBranch(branch, logger) {
20
+ try {
21
+ const plan = planBranchCleanup({
22
+ createdBranch: branch,
23
+ currentCommit: resolveCommit(branch.ref),
24
+ checkedOutAt: findWorktreeByBranchName(branch.name),
25
+ });
26
+ switch (plan.action) {
27
+ case "delete": {
28
+ deleteCreatedBranch(branch);
29
+ logger.warn(`Deleted branch '${branch.name}', which this run created.`);
30
+ restoreCreatedBranchConfig(branch, logger);
31
+ break;
32
+ }
33
+ case "keep": {
34
+ logger.warn(plan.message);
35
+ break;
36
+ }
37
+ case "none": {
38
+ break;
39
+ }
40
+ }
41
+ }
42
+ catch (error) {
43
+ logger.warn(`Failed to delete branch '${branch.name}': ${extractDiagnosticLine(error)}`);
44
+ }
45
+ }
46
+ export function cleanupWorktree(worktree, logger, reason) {
47
+ logger.warn(`Cleaning up worktree at ${JSON.stringify(worktree.directory)} ${reason}.`);
48
+ try {
49
+ removeWorktree(worktree.directory);
6
50
  }
7
51
  catch (cleanupError) {
8
52
  const cleanupMessage = cleanupError instanceof Error ? cleanupError.message : String(cleanupError);
9
- logger.warn(`Failed to clean up worktree at ${JSON.stringify(destinationDirectory)}: ${cleanupMessage}`);
53
+ logger.warn(`Failed to clean up worktree at ${JSON.stringify(worktree.directory)}: ${cleanupMessage}`);
54
+ }
55
+ if (worktree.createdBranch !== undefined) {
56
+ cleanupCreatedBranch(worktree.createdBranch, logger);
10
57
  }
11
58
  }
12
59
  //# sourceMappingURL=cleanup-worktree.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cleanup-worktree.js","sourceRoot":"","sources":["../../src/cli/cleanup-worktree.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE3D,MAAM,UAAU,eAAe,CAC7B,oBAA4B,EAC5B,MAAoB,EACpB,MAAc;IAEd,MAAM,CAAC,IAAI,CAAC,2BAA2B,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC;IAC1F,IAAI,CAAC;QACH,cAAc,CAAC,oBAAoB,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,YAAY,EAAE,CAAC;QACtB,MAAM,cAAc,GAClB,YAAY,YAAY,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAC9E,MAAM,CAAC,IAAI,CACT,kCAAkC,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,KAAK,cAAc,EAAE,CAC5F,CAAC;IACJ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"cleanup-worktree.js","sourceRoot":"","sources":["../../src/cli/cleanup-worktree.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import type { StatusLogger } from "../output/create-status-logger.js";
2
- export declare function openWorktreeApps(destinationDirectory: string, apps: string[], options?: {
2
+ import type { OpenTarget } from "../app/resolve-open-target.js";
3
+ export declare function openWorktreeApps(destinationDirectory: string, target: OpenTarget, options?: {
3
4
  dryRun?: boolean;
4
5
  logger?: StatusLogger;
5
6
  }): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"open-worktree-apps.d.ts","sourceRoot":"","sources":["../../src/cli/open-worktree-apps.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAItE,wBAAsB,gBAAgB,CACpC,oBAAoB,EAAE,MAAM,EAC5B,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,YAAY,CAAA;CAAO,GACxD,OAAO,CAAC,IAAI,CAAC,CAiCf"}
1
+ {"version":3,"file":"open-worktree-apps.d.ts","sourceRoot":"","sources":["../../src/cli/open-worktree-apps.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAGtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAEhE,wBAAsB,gBAAgB,CACpC,oBAAoB,EAAE,MAAM,EAC5B,MAAM,EAAE,UAAU,EAClB,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,YAAY,CAAA;CAAO,GACxD,OAAO,CAAC,IAAI,CAAC,CAqDf"}
@@ -1,10 +1,28 @@
1
1
  import open from "open";
2
2
  import { fallbackStatusLogger } from "../output/create-status-logger.js";
3
3
  import { getUnsafeAppNameReason } from "../app/get-unsafe-app-name-reason.js";
4
- export async function openWorktreeApps(destinationDirectory, apps, options = {}) {
4
+ export async function openWorktreeApps(destinationDirectory, target, options = {}) {
5
5
  const logger = options.logger ?? fallbackStatusLogger;
6
6
  const dryRun = options.dryRun ?? false;
7
- await Promise.all(apps.map(async (app) => {
7
+ if (target.type === "none") {
8
+ return;
9
+ }
10
+ if (target.type === "default") {
11
+ if (dryRun) {
12
+ logger.step(`Would open ${JSON.stringify(destinationDirectory)}`);
13
+ return;
14
+ }
15
+ logger.step(`Opening ${JSON.stringify(destinationDirectory)} …`);
16
+ try {
17
+ await open(destinationDirectory, { wait: false });
18
+ }
19
+ catch (error) {
20
+ const message = error instanceof Error ? error.message : String(error);
21
+ logger.warn(`Failed to open ${JSON.stringify(destinationDirectory)}: ${message}.`);
22
+ }
23
+ return;
24
+ }
25
+ await Promise.all(target.apps.map(async (app) => {
8
26
  const unsafeReason = getUnsafeAppNameReason(app);
9
27
  if (unsafeReason) {
10
28
  logger.warn(`Skipping app ${JSON.stringify(app)}: ${unsafeReason}.`);
@@ -1 +1 @@
1
- {"version":3,"file":"open-worktree-apps.js","sourceRoot":"","sources":["../../src/cli/open-worktree-apps.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAE9E,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,oBAA4B,EAC5B,IAAc,EACd,OAAO,GAAgD,EAAE;IAEzD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,oBAAoB,CAAC;IACtD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC;IAEvC,MAAM,OAAO,CAAC,GAAG,CACf,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACrB,MAAM,YAAY,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC;QACjD,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,YAAY,GAAG,CAAC,CAAC;YACrE,OAAO;QACT,CAAC;QAED,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC5F,OAAO;QACT,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,oBAAoB,EAAE;gBAC/B,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE;gBACpB,IAAI,EAAE,KAAK;aACZ,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,MAAM,kBAAkB,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChD,MAAM,YAAY,GAAG,kBAAkB;gBACrC,CAAC,CAAC,gIAAgI;gBAClI,CAAC,CAAC,EAAE,CAAC;YACP,MAAM,CAAC,IAAI,CAAC,kBAAkB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,OAAO,IAAI,YAAY,EAAE,CAAC,CAAC;QACnF,CAAC;IACH,CAAC,CAAC,CACH,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"open-worktree-apps.js","sourceRoot":"","sources":["../../src/cli/open-worktree-apps.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { CreatedBranch } from "../git/create-worktree.js";
2
+ interface PlanBranchCleanupInput {
3
+ readonly createdBranch: CreatedBranch;
4
+ readonly currentCommit: string | undefined;
5
+ readonly checkedOutAt: string | undefined;
6
+ }
7
+ type BranchCleanupPlan = {
8
+ readonly action: "delete";
9
+ } | {
10
+ readonly action: "keep";
11
+ readonly message: string;
12
+ } | {
13
+ readonly action: "none";
14
+ };
15
+ export declare function planBranchCleanup({ createdBranch, currentCommit, checkedOutAt, }: PlanBranchCleanupInput): BranchCleanupPlan;
16
+ export {};
17
+ //# sourceMappingURL=plan-branch-cleanup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-branch-cleanup.d.ts","sourceRoot":"","sources":["../../src/cli/plan-branch-cleanup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE/D,UAAU,sBAAsB;IAC9B,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IACtC,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3C;AAED,KAAK,iBAAiB,GAClB;IAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAA;CAAE,GAC7B;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACrD;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhC,wBAAgB,iBAAiB,CAAC,EAChC,aAAa,EACb,aAAa,EACb,YAAY,GACb,EAAE,sBAAsB,GAAG,iBAAiB,CAiB5C"}
@@ -0,0 +1,19 @@
1
+ export function planBranchCleanup({ createdBranch, currentCommit, checkedOutAt, }) {
2
+ if (currentCommit === undefined) {
3
+ return { action: "none" };
4
+ }
5
+ if (checkedOutAt !== undefined) {
6
+ return {
7
+ action: "keep",
8
+ message: `Keeping branch '${createdBranch.name}' because it is checked out at ${JSON.stringify(checkedOutAt)}.`,
9
+ };
10
+ }
11
+ if (currentCommit !== createdBranch.commit) {
12
+ return {
13
+ action: "keep",
14
+ message: `Keeping branch '${createdBranch.name}' because it no longer points at the commit this run created it at.`,
15
+ };
16
+ }
17
+ return { action: "delete" };
18
+ }
19
+ //# sourceMappingURL=plan-branch-cleanup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-branch-cleanup.js","sourceRoot":"","sources":["../../src/cli/plan-branch-cleanup.ts"],"names":[],"mappings":"AAaA,MAAM,UAAU,iBAAiB,CAAC,EAChC,aAAa,EACb,aAAa,EACb,YAAY,GACW;IACvB,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAC5B,CAAC;IACD,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO;YACL,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,mBAAmB,aAAa,CAAC,IAAI,kCAAkC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG;SAChH,CAAC;IACJ,CAAC;IACD,IAAI,aAAa,KAAK,aAAa,CAAC,MAAM,EAAE,CAAC;QAC3C,OAAO;YACL,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,mBAAmB,aAAa,CAAC,IAAI,qEAAqE;SACpH,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AAC9B,CAAC"}
@@ -1,5 +1,6 @@
1
1
  export interface CliOptions {
2
2
  readonly app?: string[];
3
+ readonly open?: boolean;
3
4
  readonly offline?: boolean;
4
5
  readonly yes?: boolean;
5
6
  readonly interactive?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"run-worktree-add.d.ts","sourceRoot":"","sources":["../../src/cli/run-worktree-add.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAuG1F"}
1
+ {"version":3,"file":"run-worktree-add.d.ts","sourceRoot":"","sources":["../../src/cli/run-worktree-add.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAqG1F"}
@@ -1,5 +1,5 @@
1
1
  import { createStatusLogger } from "../output/create-status-logger.js";
2
- import { resolveApps } from "../app/resolve-apps.js";
2
+ import { resolveOpenTarget } from "../app/resolve-open-target.js";
3
3
  import { handleExistingDirectory } from "../worktree/destination-directory.js";
4
4
  import { copyUntrackedFiles } from "../worktree/untracked-file-copy.js";
5
5
  import { setupProject } from "../project/setup.js";
@@ -22,12 +22,12 @@ export async function runWorktreeAdd(branchRaw, options) {
22
22
  const interactive = options.interactive ?? false;
23
23
  const assumeYes = options.yes ?? false;
24
24
  const context = resolveWorktreeContext(branchRaw);
25
- let worktreeCreated = false;
25
+ let createdWorktree;
26
26
  const cleanupIfNeeded = (reason) => {
27
- if (!worktreeCreated || dryRun) {
27
+ if (createdWorktree === undefined) {
28
28
  return;
29
29
  }
30
- cleanupWorktree(context.destinationDirectory, logger, reason);
30
+ cleanupWorktree(createdWorktree, logger, reason);
31
31
  };
32
32
  const unregisterSigintHandler = registerSigintHandler({
33
33
  destinationDirectory: context.destinationDirectory,
@@ -74,24 +74,22 @@ export async function runWorktreeAdd(branchRaw, options) {
74
74
  }
75
75
  // Only treat origin as existing when confirmed; "unknown" remains false.
76
76
  const remoteBranchExists = remoteStatus.status === "exists";
77
- createWorktree(context.branch, context.destinationDirectory, {
77
+ createdWorktree = createWorktree(context.branch, context.destinationDirectory, {
78
78
  remoteBranchExists,
79
79
  dryRun,
80
80
  logger,
81
81
  });
82
- if (!dryRun) {
83
- worktreeCreated = true;
84
- }
85
82
  await copyUntrackedFiles(context.repoRoot, context.destinationDirectory, {
86
83
  dryRun,
87
84
  logger,
88
85
  });
89
86
  await setupProject(context.destinationDirectory, { dryRun, logger });
90
- const apps = resolveApps({
87
+ const target = resolveOpenTarget({
91
88
  optionApps: options.app,
92
89
  environmentApps: process.env.WORKTREE_ADD_APP,
90
+ open: options.open ?? false,
93
91
  });
94
- await openWorktreeApps(context.destinationDirectory, apps, {
92
+ await openWorktreeApps(context.destinationDirectory, target, {
95
93
  dryRun,
96
94
  logger,
97
95
  });
@@ -1 +1 @@
1
- {"version":3,"file":"run-worktree-add.js","sourceRoot":"","sources":["../../src/cli/run-worktree-add.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run-worktree-add.js","sourceRoot":"","sources":["../../src/cli/run-worktree-add.ts"],"names":[],"mappings":"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"}
package/dist/cli.js CHANGED
@@ -11,6 +11,7 @@ const program = new Command()
11
11
  .version(packageJson.version)
12
12
  .argument("<branch>", "branch name for the worktree")
13
13
  .option("-a, --app <name>", "Open the worktree in an app (repeatable)", collectApp)
14
+ .option("-o, --open", "Open the worktree after creating it (uses WORKTREE_ADD_APP, or the OS default handler)")
14
15
  .option("--offline", "Allow creating a new local branch from HEAD when origin cannot be reached and the branch does not exist locally")
15
16
  .option("-y, --yes", "Skip confirmation and replace existing destination")
16
17
  .option("--dry-run", "Show what would happen without making changes")
@@ -22,14 +23,15 @@ const program = new Command()
22
23
  Examples:
23
24
  $ worktree-add feature/login-form
24
25
  $ worktree-add feature/api --app code
25
- $ WORKTREE_ADD_APP=ghostty,code worktree-add feature/new-branch
26
+ $ worktree-add feature/new-branch --open
27
+ $ WORKTREE_ADD_APP=ghostty,code worktree-add feature/new-branch --open
26
28
  $ git branch --format="%(refname:short)" | head -n1 | xargs worktree-add
27
29
 
28
30
  App notes:
29
31
  - App names are executed on your machine; only use values you trust.
30
32
  - Arguments are not parsed; pass only the app name (e.g., "code", not "code --wait").
31
- - WORKTREE_ADD_APP is a comma-separated list of apps (alternative to repeating --app).
32
- - To explicitly open nothing when WORKTREE_ADD_APP is set, pass --app "".
33
+ - WORKTREE_ADD_APP is a comma-separated list of apps used by --open (it does not open on its own).
34
+ - To explicitly open nothing when --open is set, pass --app "".
33
35
 
34
36
  Dependencies:
35
37
  - git (with worktree support)
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AACtD,OAAO,WAAW,MAAM,iBAAiB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAG3D,SAAS,UAAU,CAAC,GAAW,EAAE,QAA8B;IAC7D,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE;KAC1B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;KACtB,WAAW,CAAC,WAAW,CAAC,WAAW,CAAC;KACpC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC;KAC5B,QAAQ,CAAC,UAAU,EAAE,8BAA8B,CAAC;KACpD,MAAM,CAAC,kBAAkB,EAAE,0CAA0C,EAAE,UAAU,CAAC;KAClF,MAAM,CACL,WAAW,EACX,iHAAiH,CAClH;KACA,MAAM,CAAC,WAAW,EAAE,oDAAoD,CAAC;KACzE,MAAM,CAAC,WAAW,EAAE,+CAA+C,CAAC;KACpE,MAAM,CAAC,eAAe,EAAE,6CAA6C,CAAC;KACtE,MAAM,CAAC,WAAW,EAAE,kCAAkC,CAAC;KACvD,kBAAkB,CAAC,yCAAyC,CAAC;KAC7D,wBAAwB,EAAE;KAC1B,WAAW,CACV,OAAO,EACP;;;;;;;;;;;;;;;;CAgBH,CACE;KACA,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,OAAmB,EAAE,EAAE;IACpD,IAAI,CAAC;QACH,MAAM,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACzB,CAAC;QACD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;IACxB,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;AAC7B,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AACtD,OAAO,WAAW,MAAM,iBAAiB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAG3D,SAAS,UAAU,CAAC,GAAW,EAAE,QAA8B;IAC7D,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE;KAC1B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;KACtB,WAAW,CAAC,WAAW,CAAC,WAAW,CAAC;KACpC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC;KAC5B,QAAQ,CAAC,UAAU,EAAE,8BAA8B,CAAC;KACpD,MAAM,CAAC,kBAAkB,EAAE,0CAA0C,EAAE,UAAU,CAAC;KAClF,MAAM,CACL,YAAY,EACZ,wFAAwF,CACzF;KACA,MAAM,CACL,WAAW,EACX,iHAAiH,CAClH;KACA,MAAM,CAAC,WAAW,EAAE,oDAAoD,CAAC;KACzE,MAAM,CAAC,WAAW,EAAE,+CAA+C,CAAC;KACpE,MAAM,CAAC,eAAe,EAAE,6CAA6C,CAAC;KACtE,MAAM,CAAC,WAAW,EAAE,kCAAkC,CAAC;KACvD,kBAAkB,CAAC,yCAAyC,CAAC;KAC7D,wBAAwB,EAAE;KAC1B,WAAW,CACV,OAAO,EACP;;;;;;;;;;;;;;;;;CAiBH,CACE;KACA,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,OAAmB,EAAE,EAAE;IACpD,IAAI,CAAC;QACH,MAAM,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACzB,CAAC;QACD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;IACxB,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;AAC7B,CAAC"}
@@ -1,7 +1,21 @@
1
1
  import type { StatusLogger } from "../output/create-status-logger.js";
2
+ import type { BranchConfig } from "./parse-branch-config.js";
3
+ export interface CreatedBranch {
4
+ readonly name: string;
5
+ readonly ref: string;
6
+ readonly commit: string;
7
+ /** `git worktree add -b` keeps `branch.<name>.*` config that predates the branch. */
8
+ readonly preexistingConfig: BranchConfig;
9
+ }
10
+ export interface CreatedWorktree {
11
+ readonly directory: string;
12
+ /** Undefined unless this run created the branch and it still sat at its start point. */
13
+ readonly createdBranch: CreatedBranch | undefined;
14
+ }
15
+ /** Returns what was created, or undefined on a dry run. */
2
16
  export declare function createWorktree(branch: string, destinationDirectory: string, options?: {
3
17
  remoteBranchExists?: boolean;
4
18
  dryRun?: boolean;
5
19
  logger?: StatusLogger;
6
- }): void;
20
+ }): CreatedWorktree | undefined;
7
21
  //# sourceMappingURL=create-worktree.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"create-worktree.d.ts","sourceRoot":"","sources":["../../src/git/create-worktree.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAgBtE,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,oBAAoB,EAAE,MAAM,EAC5B,OAAO,CAAC,EAAE;IACR,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB,GACA,IAAI,CAkDN"}
1
+ {"version":3,"file":"create-worktree.d.ts","sourceRoot":"","sources":["../../src/git/create-worktree.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAUtE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAG7D,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,qFAAqF;IACrF,QAAQ,CAAC,iBAAiB,EAAE,YAAY,CAAC;CAC1C;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,wFAAwF;IACxF,QAAQ,CAAC,aAAa,EAAE,aAAa,GAAG,SAAS,CAAC;CACnD;AAuDD,2DAA2D;AAC3D,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,oBAAoB,EAAE,MAAM,EAC5B,OAAO,CAAC,EAAE;IACR,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB,GACA,eAAe,GAAG,SAAS,CA+B7B"}
@@ -1,25 +1,14 @@
1
1
  import { fallbackStatusLogger } from "../output/create-status-logger.js";
2
- import { git, localBranchExists, normalizeBranchName, remoteBranchExists } from "./git.js";
2
+ import { git, localBranchExists, normalizeBranchName, readBranchConfig, remoteBranchExists, resolveCommit, } from "./git.js";
3
3
  import { extractDiagnosticLine } from "./extract-diagnostic-line.js";
4
- const runGitWorktreeCommand = (args, options) => {
5
- options.logger.step(`${options.dryRun ? "Would run " : ""}git ${args.join(" ")}`);
6
- if (options.dryRun) {
7
- return;
8
- }
9
- git(...args);
10
- };
11
- export function createWorktree(branch, destinationDirectory, options) {
12
- const logger = options?.logger ?? fallbackStatusLogger;
13
- const dryRun = options?.dryRun ?? false;
14
- const normalized = normalizeBranchName(branch);
4
+ function selectWorktreeAddCommand(normalized, destinationDirectory, remoteBranchExistsHint) {
15
5
  if (localBranchExists(normalized)) {
16
- runGitWorktreeCommand(["worktree", "add", "--", destinationDirectory, `refs/heads/${normalized}`], {
17
- dryRun,
18
- logger,
19
- });
20
- return;
6
+ return {
7
+ args: ["worktree", "add", "--", destinationDirectory, `refs/heads/${normalized}`],
8
+ newBranchStartPoint: undefined,
9
+ };
21
10
  }
22
- let branchExistsOnOrigin = options?.remoteBranchExists;
11
+ let branchExistsOnOrigin = remoteBranchExistsHint;
23
12
  if (branchExistsOnOrigin === undefined) {
24
13
  try {
25
14
  branchExistsOnOrigin = remoteBranchExists(normalized);
@@ -30,21 +19,47 @@ export function createWorktree(branch, destinationDirectory, options) {
30
19
  }
31
20
  }
32
21
  if (branchExistsOnOrigin) {
33
- runGitWorktreeCommand([
34
- "worktree",
35
- "add",
36
- "--track",
37
- "-b",
38
- normalized,
39
- "--",
40
- destinationDirectory,
41
- `origin/${normalized}`,
42
- ], { dryRun, logger });
43
- return;
22
+ return {
23
+ args: [
24
+ "worktree",
25
+ "add",
26
+ "--track",
27
+ "-b",
28
+ normalized,
29
+ "--",
30
+ destinationDirectory,
31
+ `origin/${normalized}`,
32
+ ],
33
+ newBranchStartPoint: `refs/remotes/origin/${normalized}`,
34
+ };
35
+ }
36
+ return {
37
+ args: ["worktree", "add", "-b", normalized, "--", destinationDirectory],
38
+ newBranchStartPoint: "HEAD",
39
+ };
40
+ }
41
+ /** Returns what was created, or undefined on a dry run. */
42
+ export function createWorktree(branch, destinationDirectory, options) {
43
+ const logger = options?.logger ?? fallbackStatusLogger;
44
+ const dryRun = options?.dryRun ?? false;
45
+ const normalized = normalizeBranchName(branch);
46
+ const command = selectWorktreeAddCommand(normalized, destinationDirectory, options?.remoteBranchExists);
47
+ logger.step(`${dryRun ? "Would run " : ""}git ${command.args.join(" ")}`);
48
+ if (dryRun) {
49
+ return undefined;
44
50
  }
45
- runGitWorktreeCommand(["worktree", "add", "-b", normalized, "--", destinationDirectory], {
46
- dryRun,
47
- logger,
48
- });
51
+ // Resolved before the add: a post-checkout hook can commit onto the new branch during it.
52
+ const startCommit = command.newBranchStartPoint === undefined
53
+ ? undefined
54
+ : resolveCommit(command.newBranchStartPoint);
55
+ const preexistingConfig = startCommit === undefined ? new Map() : readBranchConfig(normalized);
56
+ git(...command.args);
57
+ const ref = `refs/heads/${normalized}`;
58
+ return {
59
+ directory: destinationDirectory,
60
+ createdBranch: startCommit !== undefined && resolveCommit(ref) === startCommit
61
+ ? { name: normalized, ref, commit: startCommit, preexistingConfig }
62
+ : undefined,
63
+ };
49
64
  }
50
65
  //# sourceMappingURL=create-worktree.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"create-worktree.js","sourceRoot":"","sources":["../../src/git/create-worktree.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAE,GAAG,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC3F,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAErE,MAAM,qBAAqB,GAAG,CAC5B,IAAc,EACd,OAAkD,EAC5C,EAAE;IACR,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClF,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO;IACT,CAAC;IACD,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,UAAU,cAAc,CAC5B,MAAc,EACd,oBAA4B,EAC5B,OAIC;IAED,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,oBAAoB,CAAC;IACvD,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,KAAK,CAAC;IACxC,MAAM,UAAU,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAE/C,IAAI,iBAAiB,CAAC,UAAU,CAAC,EAAE,CAAC;QAClC,qBAAqB,CACnB,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,oBAAoB,EAAE,cAAc,UAAU,EAAE,CAAC,EAC3E;YACE,MAAM;YACN,MAAM;SACP,CACF,CAAC;QACF,OAAO;IACT,CAAC;IAED,IAAI,oBAAoB,GAAG,OAAO,EAAE,kBAAkB,CAAC;IACvD,IAAI,oBAAoB,KAAK,SAAS,EAAE,CAAC;QACvC,IAAI,CAAC;YACH,oBAAoB,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;QACxD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,UAAU,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;YAChD,MAAM,IAAI,KAAK,CACb,4CAA4C,UAAU,aAAa,UAAU,EAAE,EAC/E,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,oBAAoB,EAAE,CAAC;QACzB,qBAAqB,CACnB;YACE,UAAU;YACV,KAAK;YACL,SAAS;YACT,IAAI;YACJ,UAAU;YACV,IAAI;YACJ,oBAAoB;YACpB,UAAU,UAAU,EAAE;SACvB,EACD,EAAE,MAAM,EAAE,MAAM,EAAE,CACnB,CAAC;QACF,OAAO;IACT,CAAC;IAED,qBAAqB,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,oBAAoB,CAAC,EAAE;QACvF,MAAM;QACN,MAAM;KACP,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"create-worktree.js","sourceRoot":"","sources":["../../src/git/create-worktree.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { CreatedBranch } from "./create-worktree.js";
2
+ export declare function deleteCreatedBranch(branch: CreatedBranch): void;
3
+ //# sourceMappingURL=delete-created-branch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete-created-branch.d.ts","sourceRoot":"","sources":["../../src/git/delete-created-branch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAG1D,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAG/D"}
@@ -0,0 +1,6 @@
1
+ import { git } from "./git.js";
2
+ export function deleteCreatedBranch(branch) {
3
+ // The expected old value makes the delete fail if the branch moved after it was read.
4
+ git("update-ref", "-d", branch.ref, branch.commit);
5
+ }
6
+ //# sourceMappingURL=delete-created-branch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete-created-branch.js","sourceRoot":"","sources":["../../src/git/delete-created-branch.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE/B,MAAM,UAAU,mBAAmB,CAAC,MAAqB;IACvD,sFAAsF;IACtF,GAAG,CAAC,YAAY,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;AACrD,CAAC"}
package/dist/git/git.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import type { BranchConfig } from "./parse-branch-config.js";
1
2
  export declare function git(...arguments_: [...string[], {
2
3
  cwd?: string;
3
4
  }] | string[]): string;
@@ -5,6 +6,8 @@ export declare function normalizeBranchName(name: string): string;
5
6
  export declare function localBranchExists(branch: string): boolean;
6
7
  export declare function remoteBranchExists(branch: string): boolean;
7
8
  export declare function fetchOriginBranch(branch: string): void;
9
+ export declare function resolveCommit(revision: string): string | undefined;
10
+ export declare function readBranchConfig(branchName: string): BranchConfig;
8
11
  export declare function getLocalBranchHead(branch: string): string | undefined;
9
12
  export declare function getRemoteBranchHead(branch: string): string | undefined;
10
13
  export declare function getAheadBehindCounts(localHead: string, remoteHead: string): {
@@ -1 +1 @@
1
- {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/git/git.ts"],"names":[],"mappings":"AAIA,wBAAgB,GAAG,CAAC,GAAG,UAAU,EAAE,CAAC,GAAG,MAAM,EAAE,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,MAAM,EAAE,GAAG,MAAM,CA0BrF;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOxD;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAQzD;AAGD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAK1D;AAGD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAItD;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAOrE;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAOtE;AAED,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CASnC;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOvD;AAED,wBAAsB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO5D;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,CAItD;AAeD,wBAAsB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAI/D"}
1
+ {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/git/git.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAG7D,wBAAgB,GAAG,CAAC,GAAG,UAAU,EAAE,CAAC,GAAG,MAAM,EAAE,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,MAAM,EAAE,GAAG,MAAM,CA0BrF;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOxD;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAQzD;AAGD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAK1D;AAGD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAItD;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAMlE;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY,CAEjE;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAOrE;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAOtE;AAED,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CASnC;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOvD;AAED,wBAAsB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO5D;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,CAItD;AAeD,wBAAsB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAI/D"}
package/dist/git/git.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import { spawnSync } from "node:child_process";
2
2
  import * as fs from "node:fs/promises";
3
3
  import * as readline from "node:readline/promises";
4
+ import { parseBranchConfig } from "./parse-branch-config.js";
4
5
  export function git(...arguments_) {
5
6
  let cwd;
6
7
  let gitArguments;
@@ -58,6 +59,17 @@ export function fetchOriginBranch(branch) {
58
59
  const refspec = `+refs/heads/${normalized}:refs/remotes/origin/${normalized}`;
59
60
  git("fetch", "origin", "--", refspec);
60
61
  }
62
+ export function resolveCommit(revision) {
63
+ try {
64
+ return git("rev-parse", "--verify", "--quiet", `${revision}^{commit}`);
65
+ }
66
+ catch {
67
+ return undefined;
68
+ }
69
+ }
70
+ export function readBranchConfig(branchName) {
71
+ return parseBranchConfig(git("config", "--local", "--null", "--list"), branchName);
72
+ }
61
73
  export function getLocalBranchHead(branch) {
62
74
  try {
63
75
  const normalized = normalizeBranchName(branch);
@@ -1 +1 @@
1
- {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/git/git.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/git/git.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ /** Values per `branch.<name>.<variable>` key, in file order. */
2
+ export type BranchConfig = ReadonlyMap<string, readonly string[]>;
3
+ export declare function parseBranchConfig(nullListOutput: string, branchName: string): BranchConfig;
4
+ //# sourceMappingURL=parse-branch-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-branch-config.d.ts","sourceRoot":"","sources":["../../src/git/parse-branch-config.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,MAAM,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC;AAElE,wBAAgB,iBAAiB,CAAC,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,YAAY,CAe1F"}
@@ -0,0 +1,17 @@
1
+ export function parseBranchConfig(nullListOutput, branchName) {
2
+ const prefix = `branch.${branchName}.`;
3
+ const config = new Map();
4
+ for (const entry of nullListOutput.split("\0")) {
5
+ const newline = entry.indexOf("\n");
6
+ const key = newline === -1 ? entry : entry.slice(0, newline);
7
+ // Variable names contain no dot, so a dotted remainder belongs to a longer branch name.
8
+ if (!key.startsWith(prefix) || key.slice(prefix.length).includes(".")) {
9
+ continue;
10
+ }
11
+ // A key written without `=` is an implicit boolean true.
12
+ const value = newline === -1 ? "true" : entry.slice(newline + 1);
13
+ config.set(key, [...(config.get(key) ?? []), value]);
14
+ }
15
+ return config;
16
+ }
17
+ //# sourceMappingURL=parse-branch-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-branch-config.js","sourceRoot":"","sources":["../../src/git/parse-branch-config.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,iBAAiB,CAAC,cAAsB,EAAE,UAAkB;IAC1E,MAAM,MAAM,GAAG,UAAU,UAAU,GAAG,CAAC;IACvC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC3C,KAAK,MAAM,KAAK,IAAI,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/C,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,GAAG,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAC7D,wFAAwF;QACxF,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACtE,SAAS;QACX,CAAC;QACD,yDAAyD;QACzD,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;QACjE,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { BranchConfig } from "./parse-branch-config.js";
2
+ export declare function restoreBranchConfig(branchName: string, preexistingConfig: BranchConfig): void;
3
+ //# sourceMappingURL=restore-branch-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restore-branch-config.d.ts","sourceRoot":"","sources":["../../src/git/restore-branch-config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE7D,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,iBAAiB,EAAE,YAAY,GAAG,IAAI,CA0B7F"}
@@ -0,0 +1,30 @@
1
+ import { isDeepStrictEqual } from "node:util";
2
+ import { git, readBranchConfig } from "./git.js";
3
+ export function restoreBranchConfig(branchName, preexistingConfig) {
4
+ const currentConfig = readBranchConfig(branchName);
5
+ if (preexistingConfig.size === 0) {
6
+ if (currentConfig.size > 0) {
7
+ // The same removal `git branch -D` performs.
8
+ git("config", "--local", "--remove-section", `branch.${branchName}`);
9
+ }
10
+ return;
11
+ }
12
+ // `--track` replaces or appends to tracking keys that predate the branch.
13
+ for (const key of new Set([...currentConfig.keys(), ...preexistingConfig.keys()])) {
14
+ const preexistingValues = preexistingConfig.get(key) ?? [];
15
+ if (isDeepStrictEqual(currentConfig.get(key) ?? [], preexistingValues)) {
16
+ continue;
17
+ }
18
+ const [firstValue, ...otherValues] = preexistingValues;
19
+ if (firstValue === undefined) {
20
+ git("config", "--local", "--unset-all", key);
21
+ continue;
22
+ }
23
+ // `--replace-all` swaps the values in one write, so a failure never leaves the key unset.
24
+ git("config", "--local", "--replace-all", key, firstValue);
25
+ for (const value of otherValues) {
26
+ git("config", "--local", "--add", key, value);
27
+ }
28
+ }
29
+ }
30
+ //# sourceMappingURL=restore-branch-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restore-branch-config.js","sourceRoot":"","sources":["../../src/git/restore-branch-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,GAAG,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAGjD,MAAM,UAAU,mBAAmB,CAAC,UAAkB,EAAE,iBAA+B;IACrF,MAAM,aAAa,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;IACnD,IAAI,iBAAiB,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACjC,IAAI,aAAa,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YAC3B,6CAA6C;YAC7C,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,kBAAkB,EAAE,UAAU,UAAU,EAAE,CAAC,CAAC;QACvE,CAAC;QACD,OAAO;IACT,CAAC;IACD,0EAA0E;IAC1E,KAAK,MAAM,GAAG,IAAI,IAAI,GAAG,CAAC,CAAC,GAAG,aAAa,CAAC,IAAI,EAAE,EAAE,GAAG,iBAAiB,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;QAClF,MAAM,iBAAiB,GAAG,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAC3D,IAAI,iBAAiB,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,iBAAiB,CAAC,EAAE,CAAC;YACvE,SAAS;QACX,CAAC;QACD,MAAM,CAAC,UAAU,EAAE,GAAG,WAAW,CAAC,GAAG,iBAAiB,CAAC;QACvD,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,GAAG,CAAC,CAAC;YAC7C,SAAS;QACX,CAAC;QACD,0FAA0F;QAC1F,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,eAAe,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC;QAC3D,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;YAChC,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "worktree-add",
3
- "version": "1.3.12",
3
+ "version": "2.0.1",
4
4
  "description": "Create a Git worktree next to your current repo for a branch, copy useful local files, install deps, and open it in your apps.",
5
5
  "keywords": [
6
6
  "cli",
@@ -60,8 +60,9 @@
60
60
  "devDependencies": {
61
61
  "@j4k/oxlint-config": "^2.11.0",
62
62
  "@total-typescript/ts-reset": "^0.6.1",
63
- "@types/node": "^25.9.3",
63
+ "@types/node": "^24.0.0",
64
64
  "@vitest/coverage-v8": "^4.1.8",
65
+ "conventional-changelog-conventionalcommits": "^9.3.1",
65
66
  "fta-check": "^1.5.4",
66
67
  "fta-cli": "^3.0.0",
67
68
  "knip": "^6.16.1",
@@ -73,7 +74,7 @@
73
74
  "vitest": "^4.1.8"
74
75
  },
75
76
  "engines": {
76
- "node": ">=24.2.0"
77
+ "node": ">=24.15.0"
77
78
  },
78
- "packageManager": "pnpm@11.8.0"
79
+ "packageManager": "pnpm@11.22.0"
79
80
  }
@@ -1,7 +0,0 @@
1
- interface ResolveAppsInput {
2
- optionApps?: string[];
3
- environmentApps?: string;
4
- }
5
- export declare function resolveApps({ optionApps, environmentApps }: ResolveAppsInput): string[];
6
- export {};
7
- //# sourceMappingURL=resolve-apps.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"resolve-apps.d.ts","sourceRoot":"","sources":["../../src/app/resolve-apps.ts"],"names":[],"mappings":"AAAA,UAAU,gBAAgB;IACxB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAeD,wBAAgB,WAAW,CAAC,EAAE,UAAU,EAAE,eAAe,EAAE,EAAE,gBAAgB,GAAG,MAAM,EAAE,CAyBvF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"resolve-apps.js","sourceRoot":"","sources":["../../src/app/resolve-apps.ts"],"names":[],"mappings":"AAKA,SAAS,mBAAmB,CAAC,IAAc;IACzC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAClB,SAAS;QACX,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACd,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,EAAE,UAAU,EAAE,eAAe,EAAoB;IAC3E,MAAM,sBAAsB,GAAG,UAAU,EAAE,QAAQ,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC;IACjE,MAAM,oBAAoB,GAAG,UAAU,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IAExF,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,IAAI,oBAAoB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpC,OAAO,mBAAmB,CAAC,oBAAoB,CAAC,CAAC;QACnD,CAAC;QAED,IAAI,sBAAsB,EAAE,CAAC;YAC3B,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,eAAe,EAAE,IAAI,EAAE,CAAC;IAC3C,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,mBAAmB,CACxB,UAAU;aACP,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;aACxB,MAAM,CAAC,OAAO,CAAC,CACnB,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC"}