From ecfe87d5d671b5c452c34a34ee770ec06f45051a Mon Sep 17 00:00:00 2001 From: Maximilian Roos Date: Sun, 6 Sep 2026 13:15:53 -0700 Subject: [PATCH 1/6] Document copy-ignored's disk-space benefit The reflink mechanism was documented only under a "Performance" heading, next to a table of times, so the disk saving read as an explanation of why the copy is fast rather than a benefit in its own right. Rename the section to "Copy-on-write", add a Disk column to the table, and name the filesystems that support reflink along with what happens on ext4 and NTFS. Add an FAQ question for the fleet-level number, which is what someone running many worktrees actually wants to know. Drop the copy-on-write bullet from the Claude Code comparison. Claude Code ships compiled with Bun, whose fs.copyFile uses clonefile() on macOS, so it is not a difference there: measured on a 2GB file, Bun's copyFileSync consumed 6 MiB against Node's 2111 MiB. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01NrPJmECkKALUaqxb9GKCC5 --- README.md | 2 +- docs/src/content/docs/faq.md | 6 ++++++ docs/src/content/docs/step.md | 17 +++++++++-------- docs/src/content/docs/worktrunk.md | 2 +- .../skills/worktrunk/reference/README.md | 2 +- .../worktrunk/skills/worktrunk/reference/faq.md | 6 ++++++ .../skills/worktrunk/reference/step.md | 17 +++++++++-------- .../skills/worktrunk/reference/worktrunk.md | 2 +- skills/worktrunk/reference/faq.md | 6 ++++++ skills/worktrunk/reference/step.md | 17 +++++++++-------- skills/worktrunk/reference/worktrunk.md | 2 +- src/cli/step.rs | 17 +++++++++-------- ...ion_tests__help__help_step_copy_ignored.snap | 17 +++++++++-------- 13 files changed, 68 insertions(+), 45 deletions(-) diff --git a/README.md b/README.md index 0654012e9..4924bb9ec 100644 --- a/README.md +++ b/README.md @@ -90,7 +90,7 @@ git branch -d feat - **[LLM commit messages](https://worktrunk.dev/llm-commits/)** — generate commit messages from diffs - **[Merge workflow](https://worktrunk.dev/merge/)** — squash, rebase, merge, clean up in one command - **[Interactive picker](https://worktrunk.dev/switch/#interactive-picker)** — browse worktrees with live diff and log previews -- **[Copy build caches](https://worktrunk.dev/step/#wt-step-copy-ignored)** — skip cold starts by sharing `target/`, `node_modules/`, etc between worktrees +- **[Copy build caches](https://worktrunk.dev/step/#wt-step-copy-ignored)** — skip cold starts by sharing `target/`, `node_modules/`, etc between worktrees, with copy-on-write - **[`wt list --full`](https://worktrunk.dev/list/#full-mode)** — [CI status](https://worktrunk.dev/list/#ci-status) and [AI-generated summaries](https://worktrunk.dev/list/#llm-summaries) per branch - **[PR checkout](https://worktrunk.dev/switch/#pull-requests-and-merge-requests)** — `wt switch pr:123` to jump straight to a PR's branch - **[Dev server per worktree](https://worktrunk.dev/tips-patterns/#dev-server-per-worktree)** — `hash_port` template filter gives each worktree a unique port diff --git a/docs/src/content/docs/faq.md b/docs/src/content/docs/faq.md index 167017a3d..2a6756c94 100644 --- a/docs/src/content/docs/faq.md +++ b/docs/src/content/docs/faq.md @@ -55,6 +55,12 @@ These tools can be used together—run git-machete or git-town inside individual Git TUIs operate on a single repository. Worktrunk manages multiple worktrees, runs automation hooks, and aggregates status across branches. TUIs work inside each worktree directory. +## How much disk do worktrees use? + +Worktrees share one `.git`. Each adds a checkout of the tracked files, plus whatever gitignored build output you copy in. + +On APFS, btrfs, and XFS (not ext4 or NTFS), [`wt step copy-ignored`](/step/#copy-on-write) reflinks that output, so a new worktree shares the primary worktree's disk blocks. A later build rewrites only what changed, and the rest stays shared. On one machine, 56 worktrees of a Rust repository with a 40GB `target/` came to 2.6TB by `du` and 0.7TB on disk. + ## Does Worktrunk support stacked branches? Not natively — stacked-branch workflows are a large design space, so Worktrunk treats them as an extension rather than a built-in. [`worktrunk-sync`](https://github.com/pablospe/worktrunk-sync) is a community tool that auto-detects the branch dependency tree from git history and rebases each branch onto its parent in topological order. Install with `cargo install worktrunk-sync` and run as `wt sync` (via [custom subcommands](/extending/#custom-subcommands)). diff --git a/docs/src/content/docs/step.md b/docs/src/content/docs/step.md index f738f9778..692184b2d 100644 --- a/docs/src/content/docs/step.md +++ b/docs/src/content/docs/step.md @@ -611,16 +611,18 @@ Without `.worktreeinclude`, the command is a no-op (it reports that nothing was | Generated assets | Images, ML models, binaries too large for git | | Environment files | `.env` (if not generated per-worktree) | -### Performance +### Copy-on-write -Reflink copies share disk blocks until modified — no data is actually copied. For a 14GB `target/` directory: +Files are reflinked where the filesystem supports it: APFS (macOS), btrfs and XFS (Linux), ReFS (Windows). A reflinked copy shares the source's disk blocks until one side writes. For a 14GB `target/` directory: -| Command | Time | -|---------|------| -| `cp -R` (full copy) | 2m | -| `cp -Rc` / `wt step copy-ignored` | 20s | +| Command | Time | Disk | +|---------|------|------| +| `cp -R` (full copy) | 2m | 14GB | +| `cp -Rc` / `wt step copy-ignored` | 20s | ~0 | -Uses per-file reflink (like `cp -Rc`) — copy time scales with file count. +On ext4 and NTFS, which have no reflink, every file is copied in full. + +Reflinks are per file (like `cp -Rc`), so copy time scales with file count. Use the `post-start` hook so the copy runs in the background. Use `pre-start` instead if subsequent hooks or `--execute` command need the copied files immediately. @@ -654,7 +656,6 @@ Virtual environments contain absolute paths and can't be copied. Use `uv sync` i The `.worktreeinclude` pattern is shared with [Claude Code on desktop](https://code.claude.com/docs/en/desktop), which copies matching files when creating worktrees. Differences: - worktrunk copies all gitignored files by default; Claude Code requires `.worktreeinclude`. Pass `--require-include` to match Claude Code (copy nothing without `.worktreeinclude`) -- worktrunk uses copy-on-write for large directories like `target/` (see Performance above) - worktrunk runs as a configurable hook in the worktree lifecycle ### Command reference diff --git a/docs/src/content/docs/worktrunk.md b/docs/src/content/docs/worktrunk.md index 058e90c0b..1288e9676 100644 --- a/docs/src/content/docs/worktrunk.md +++ b/docs/src/content/docs/worktrunk.md @@ -100,7 +100,7 @@ git branch -d feat - **[LLM commit messages](/llm-commits/)** — generate commit messages from diffs - **[Merge workflow](/merge/)** — squash, rebase, merge, clean up in one command - **[Interactive picker](/switch/#interactive-picker)** — browse worktrees with live diff and log previews -- **[Copy build caches](/step/#wt-step-copy-ignored)** — skip cold starts by sharing `target/`, `node_modules/`, etc between worktrees +- **[Copy build caches](/step/#wt-step-copy-ignored)** — skip cold starts by sharing `target/`, `node_modules/`, etc between worktrees, with copy-on-write - **[`wt list --full`](/list/#full-mode)** — [CI status](/list/#ci-status) and [AI-generated summaries](/list/#llm-summaries) per branch - **[PR checkout](/switch/#pull-requests-and-merge-requests)** — `wt switch pr:123` to jump straight to a PR's branch - **[Dev server per worktree](/tips-patterns/#dev-server-per-worktree)** — `hash_port` template filter gives each worktree a unique port diff --git a/plugins/worktrunk/skills/worktrunk/reference/README.md b/plugins/worktrunk/skills/worktrunk/reference/README.md index 0654012e9..4924bb9ec 100644 --- a/plugins/worktrunk/skills/worktrunk/reference/README.md +++ b/plugins/worktrunk/skills/worktrunk/reference/README.md @@ -90,7 +90,7 @@ git branch -d feat - **[LLM commit messages](https://worktrunk.dev/llm-commits/)** — generate commit messages from diffs - **[Merge workflow](https://worktrunk.dev/merge/)** — squash, rebase, merge, clean up in one command - **[Interactive picker](https://worktrunk.dev/switch/#interactive-picker)** — browse worktrees with live diff and log previews -- **[Copy build caches](https://worktrunk.dev/step/#wt-step-copy-ignored)** — skip cold starts by sharing `target/`, `node_modules/`, etc between worktrees +- **[Copy build caches](https://worktrunk.dev/step/#wt-step-copy-ignored)** — skip cold starts by sharing `target/`, `node_modules/`, etc between worktrees, with copy-on-write - **[`wt list --full`](https://worktrunk.dev/list/#full-mode)** — [CI status](https://worktrunk.dev/list/#ci-status) and [AI-generated summaries](https://worktrunk.dev/list/#llm-summaries) per branch - **[PR checkout](https://worktrunk.dev/switch/#pull-requests-and-merge-requests)** — `wt switch pr:123` to jump straight to a PR's branch - **[Dev server per worktree](https://worktrunk.dev/tips-patterns/#dev-server-per-worktree)** — `hash_port` template filter gives each worktree a unique port diff --git a/plugins/worktrunk/skills/worktrunk/reference/faq.md b/plugins/worktrunk/skills/worktrunk/reference/faq.md index 6d7e27263..8989ac18b 100644 --- a/plugins/worktrunk/skills/worktrunk/reference/faq.md +++ b/plugins/worktrunk/skills/worktrunk/reference/faq.md @@ -51,6 +51,12 @@ These tools can be used together—run git-machete or git-town inside individual Git TUIs operate on a single repository. Worktrunk manages multiple worktrees, runs automation hooks, and aggregates status across branches. TUIs work inside each worktree directory. +## How much disk do worktrees use? + +Worktrees share one `.git`. Each adds a checkout of the tracked files, plus whatever gitignored build output you copy in. + +On APFS, btrfs, and XFS (not ext4 or NTFS), [`wt step copy-ignored`](https://worktrunk.dev/step/#copy-on-write) reflinks that output, so a new worktree shares the primary worktree's disk blocks. A later build rewrites only what changed, and the rest stays shared. On one machine, 56 worktrees of a Rust repository with a 40GB `target/` came to 2.6TB by `du` and 0.7TB on disk. + ## Does Worktrunk support stacked branches? Not natively — stacked-branch workflows are a large design space, so Worktrunk treats them as an extension rather than a built-in. [`worktrunk-sync`](https://github.com/pablospe/worktrunk-sync) is a community tool that auto-detects the branch dependency tree from git history and rebases each branch onto its parent in topological order. Install with `cargo install worktrunk-sync` and run as `wt sync` (via [custom subcommands](https://worktrunk.dev/extending/#custom-subcommands)). diff --git a/plugins/worktrunk/skills/worktrunk/reference/step.md b/plugins/worktrunk/skills/worktrunk/reference/step.md index a88b23831..bd4eccc59 100644 --- a/plugins/worktrunk/skills/worktrunk/reference/step.md +++ b/plugins/worktrunk/skills/worktrunk/reference/step.md @@ -599,16 +599,18 @@ Without `.worktreeinclude`, the command is a no-op (it reports that nothing was | Generated assets | Images, ML models, binaries too large for git | | Environment files | `.env` (if not generated per-worktree) | -### Performance +### Copy-on-write -Reflink copies share disk blocks until modified — no data is actually copied. For a 14GB `target/` directory: +Files are reflinked where the filesystem supports it: APFS (macOS), btrfs and XFS (Linux), ReFS (Windows). A reflinked copy shares the source's disk blocks until one side writes. For a 14GB `target/` directory: -| Command | Time | -|---------|------| -| `cp -R` (full copy) | 2m | -| `cp -Rc` / `wt step copy-ignored` | 20s | +| Command | Time | Disk | +|---------|------|------| +| `cp -R` (full copy) | 2m | 14GB | +| `cp -Rc` / `wt step copy-ignored` | 20s | ~0 | -Uses per-file reflink (like `cp -Rc`) — copy time scales with file count. +On ext4 and NTFS, which have no reflink, every file is copied in full. + +Reflinks are per file (like `cp -Rc`), so copy time scales with file count. Use the `post-start` hook so the copy runs in the background. Use `pre-start` instead if subsequent hooks or `--execute` command need the copied files immediately. @@ -642,7 +644,6 @@ Virtual environments contain absolute paths and can't be copied. Use `uv sync` i The `.worktreeinclude` pattern is shared with [Claude Code on desktop](https://code.claude.com/docs/en/desktop), which copies matching files when creating worktrees. Differences: - worktrunk copies all gitignored files by default; Claude Code requires `.worktreeinclude`. Pass `--require-include` to match Claude Code (copy nothing without `.worktreeinclude`) -- worktrunk uses copy-on-write for large directories like `target/` (see Performance above) - worktrunk runs as a configurable hook in the worktree lifecycle ### Command reference diff --git a/plugins/worktrunk/skills/worktrunk/reference/worktrunk.md b/plugins/worktrunk/skills/worktrunk/reference/worktrunk.md index 6fc3c8db0..85799a1a1 100644 --- a/plugins/worktrunk/skills/worktrunk/reference/worktrunk.md +++ b/plugins/worktrunk/skills/worktrunk/reference/worktrunk.md @@ -72,7 +72,7 @@ git branch -d feat - **[LLM commit messages](https://worktrunk.dev/llm-commits/)** — generate commit messages from diffs - **[Merge workflow](https://worktrunk.dev/merge/)** — squash, rebase, merge, clean up in one command - **[Interactive picker](https://worktrunk.dev/switch/#interactive-picker)** — browse worktrees with live diff and log previews -- **[Copy build caches](https://worktrunk.dev/step/#wt-step-copy-ignored)** — skip cold starts by sharing `target/`, `node_modules/`, etc between worktrees +- **[Copy build caches](https://worktrunk.dev/step/#wt-step-copy-ignored)** — skip cold starts by sharing `target/`, `node_modules/`, etc between worktrees, with copy-on-write - **[`wt list --full`](https://worktrunk.dev/list/#full-mode)** — [CI status](https://worktrunk.dev/list/#ci-status) and [AI-generated summaries](https://worktrunk.dev/list/#llm-summaries) per branch - **[PR checkout](https://worktrunk.dev/switch/#pull-requests-and-merge-requests)** — `wt switch pr:123` to jump straight to a PR's branch - **[Dev server per worktree](https://worktrunk.dev/tips-patterns/#dev-server-per-worktree)** — `hash_port` template filter gives each worktree a unique port diff --git a/skills/worktrunk/reference/faq.md b/skills/worktrunk/reference/faq.md index 6d7e27263..8989ac18b 100644 --- a/skills/worktrunk/reference/faq.md +++ b/skills/worktrunk/reference/faq.md @@ -51,6 +51,12 @@ These tools can be used together—run git-machete or git-town inside individual Git TUIs operate on a single repository. Worktrunk manages multiple worktrees, runs automation hooks, and aggregates status across branches. TUIs work inside each worktree directory. +## How much disk do worktrees use? + +Worktrees share one `.git`. Each adds a checkout of the tracked files, plus whatever gitignored build output you copy in. + +On APFS, btrfs, and XFS (not ext4 or NTFS), [`wt step copy-ignored`](https://worktrunk.dev/step/#copy-on-write) reflinks that output, so a new worktree shares the primary worktree's disk blocks. A later build rewrites only what changed, and the rest stays shared. On one machine, 56 worktrees of a Rust repository with a 40GB `target/` came to 2.6TB by `du` and 0.7TB on disk. + ## Does Worktrunk support stacked branches? Not natively — stacked-branch workflows are a large design space, so Worktrunk treats them as an extension rather than a built-in. [`worktrunk-sync`](https://github.com/pablospe/worktrunk-sync) is a community tool that auto-detects the branch dependency tree from git history and rebases each branch onto its parent in topological order. Install with `cargo install worktrunk-sync` and run as `wt sync` (via [custom subcommands](https://worktrunk.dev/extending/#custom-subcommands)). diff --git a/skills/worktrunk/reference/step.md b/skills/worktrunk/reference/step.md index a88b23831..bd4eccc59 100644 --- a/skills/worktrunk/reference/step.md +++ b/skills/worktrunk/reference/step.md @@ -599,16 +599,18 @@ Without `.worktreeinclude`, the command is a no-op (it reports that nothing was | Generated assets | Images, ML models, binaries too large for git | | Environment files | `.env` (if not generated per-worktree) | -### Performance +### Copy-on-write -Reflink copies share disk blocks until modified — no data is actually copied. For a 14GB `target/` directory: +Files are reflinked where the filesystem supports it: APFS (macOS), btrfs and XFS (Linux), ReFS (Windows). A reflinked copy shares the source's disk blocks until one side writes. For a 14GB `target/` directory: -| Command | Time | -|---------|------| -| `cp -R` (full copy) | 2m | -| `cp -Rc` / `wt step copy-ignored` | 20s | +| Command | Time | Disk | +|---------|------|------| +| `cp -R` (full copy) | 2m | 14GB | +| `cp -Rc` / `wt step copy-ignored` | 20s | ~0 | -Uses per-file reflink (like `cp -Rc`) — copy time scales with file count. +On ext4 and NTFS, which have no reflink, every file is copied in full. + +Reflinks are per file (like `cp -Rc`), so copy time scales with file count. Use the `post-start` hook so the copy runs in the background. Use `pre-start` instead if subsequent hooks or `--execute` command need the copied files immediately. @@ -642,7 +644,6 @@ Virtual environments contain absolute paths and can't be copied. Use `uv sync` i The `.worktreeinclude` pattern is shared with [Claude Code on desktop](https://code.claude.com/docs/en/desktop), which copies matching files when creating worktrees. Differences: - worktrunk copies all gitignored files by default; Claude Code requires `.worktreeinclude`. Pass `--require-include` to match Claude Code (copy nothing without `.worktreeinclude`) -- worktrunk uses copy-on-write for large directories like `target/` (see Performance above) - worktrunk runs as a configurable hook in the worktree lifecycle ### Command reference diff --git a/skills/worktrunk/reference/worktrunk.md b/skills/worktrunk/reference/worktrunk.md index 6fc3c8db0..85799a1a1 100644 --- a/skills/worktrunk/reference/worktrunk.md +++ b/skills/worktrunk/reference/worktrunk.md @@ -72,7 +72,7 @@ git branch -d feat - **[LLM commit messages](https://worktrunk.dev/llm-commits/)** — generate commit messages from diffs - **[Merge workflow](https://worktrunk.dev/merge/)** — squash, rebase, merge, clean up in one command - **[Interactive picker](https://worktrunk.dev/switch/#interactive-picker)** — browse worktrees with live diff and log previews -- **[Copy build caches](https://worktrunk.dev/step/#wt-step-copy-ignored)** — skip cold starts by sharing `target/`, `node_modules/`, etc between worktrees +- **[Copy build caches](https://worktrunk.dev/step/#wt-step-copy-ignored)** — skip cold starts by sharing `target/`, `node_modules/`, etc between worktrees, with copy-on-write - **[`wt list --full`](https://worktrunk.dev/list/#full-mode)** — [CI status](https://worktrunk.dev/list/#ci-status) and [AI-generated summaries](https://worktrunk.dev/list/#llm-summaries) per branch - **[PR checkout](https://worktrunk.dev/switch/#pull-requests-and-merge-requests)** — `wt switch pr:123` to jump straight to a PR's branch - **[Dev server per worktree](https://worktrunk.dev/tips-patterns/#dev-server-per-worktree)** — `hash_port` template filter gives each worktree a unique port diff --git a/src/cli/step.rs b/src/cli/step.rs index 3af5bc952..43c59f0ca 100644 --- a/src/cli/step.rs +++ b/src/cli/step.rs @@ -379,16 +379,18 @@ Without `.worktreeinclude`, the command is a no-op (it reports that nothing was | Generated assets | Images, ML models, binaries too large for git | | Environment files | `.env` (if not generated per-worktree) | -## Performance +## Copy-on-write -Reflink copies share disk blocks until modified — no data is actually copied. For a 14GB `target/` directory: +Files are reflinked where the filesystem supports it: APFS (macOS), btrfs and XFS (Linux), ReFS (Windows). A reflinked copy shares the source's disk blocks until one side writes. For a 14GB `target/` directory: -| Command | Time | -|---------|------| -| `cp -R` (full copy) | 2m | -| `cp -Rc` / `wt step copy-ignored` | 20s | +| Command | Time | Disk | +|---------|------|------| +| `cp -R` (full copy) | 2m | 14GB | +| `cp -Rc` / `wt step copy-ignored` | 20s | ~0 | -Uses per-file reflink (like `cp -Rc`) — copy time scales with file count. +On ext4 and NTFS, which have no reflink, every file is copied in full. + +Reflinks are per file (like `cp -Rc`), so copy time scales with file count. Use the `post-start` hook so the copy runs in the background. Use `pre-start` instead if subsequent hooks or `--execute` command need the copied files immediately. @@ -422,7 +424,6 @@ Virtual environments contain absolute paths and can't be copied. Use `uv sync` i The `.worktreeinclude` pattern is shared with [Claude Code on desktop](https://code.claude.com/docs/en/desktop), which copies matching files when creating worktrees. Differences: - worktrunk copies all gitignored files by default; Claude Code requires `.worktreeinclude`. Pass `--require-include` to match Claude Code (copy nothing without `.worktreeinclude`) -- worktrunk uses copy-on-write for large directories like `target/` (see Performance above) - worktrunk runs as a configurable hook in the worktree lifecycle "#)] CopyIgnored { diff --git a/tests/snapshots/integration__integration_tests__help__help_step_copy_ignored.snap b/tests/snapshots/integration__integration_tests__help__help_step_copy_ignored.snap index 0ca154ca2..0ae9cbe87 100644 --- a/tests/snapshots/integration__integration_tests__help__help_step_copy_ignored.snap +++ b/tests/snapshots/integration__integration_tests__help__help_step_copy_ignored.snap @@ -145,16 +145,18 @@ Without .worktreeinclude, the command is a no-op (it reports that nothin Generated assets Images, ML models, binaries too large for git Environment files .env (if not generated per-worktree) -Performance +Copy-on-write -Reflink copies share disk blocks until modified — no data is actually copied. For a 14GB target/ directory: +Files are reflinked where the filesystem supports it: APFS (macOS), btrfs and XFS (Linux), ReFS (Windows). A reflinked copy shares the source's disk blocks until one side writes. For a 14GB target/ directory: - Command Time - ───────────────────────────── ──── - cp -R (full copy) 2m - cp -Rc / wt step copy-ignored 20s + Command Time Disk + ───────────────────────────── ──── ──── + cp -R (full copy) 2m 14GB + cp -Rc / wt step copy-ignored 20s ~0 -Uses per-file reflink (like cp -Rc) — copy time scales with file count. +On ext4 and NTFS, which have no reflink, every file is copied in full. + +Reflinks are per file (like cp -Rc), so copy time scales with file count. Use the post-start hook so the copy runs in the background. Use pre-start instead if subsequent hooks or --execute command need the copied files immediately. @@ -186,7 +188,6 @@ Virtual environments contain absolute paths and can't be copied. Use uv sync The .worktreeinclude pattern is shared with Claude Code on desktop, which copies matching files when creating worktrees. Differences: - worktrunk copies all gitignored files by default; Claude Code requires .worktreeinclude. Pass --require-include to match Claude Code (copy nothing without .worktreeinclude) -- worktrunk uses copy-on-write for large directories like target/ (see Performance above) - worktrunk runs as a configurable hook in the worktree lifecycle ----- stderr ----- From 16e6c3e2f33302277b54674bc260df3bb5c6a41d Mon Sep 17 00:00:00 2001 From: Maximilian Roos Date: Sun, 6 Sep 2026 13:23:57 -0700 Subject: [PATCH 2/6] Retitle the homepage build-cache bullet "Copy build caches" names the thing the feature avoids doing. The bullet now leads with sharing and states both benefits: a warm start, and no second copy of the build output on disk. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01NrPJmECkKALUaqxb9GKCC5 --- README.md | 2 +- docs/src/content/docs/worktrunk.md | 2 +- plugins/worktrunk/skills/worktrunk/reference/README.md | 2 +- plugins/worktrunk/skills/worktrunk/reference/worktrunk.md | 2 +- skills/worktrunk/reference/worktrunk.md | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 4924bb9ec..e0ebd656d 100644 --- a/README.md +++ b/README.md @@ -90,7 +90,7 @@ git branch -d feat - **[LLM commit messages](https://worktrunk.dev/llm-commits/)** — generate commit messages from diffs - **[Merge workflow](https://worktrunk.dev/merge/)** — squash, rebase, merge, clean up in one command - **[Interactive picker](https://worktrunk.dev/switch/#interactive-picker)** — browse worktrees with live diff and log previews -- **[Copy build caches](https://worktrunk.dev/step/#wt-step-copy-ignored)** — skip cold starts by sharing `target/`, `node_modules/`, etc between worktrees, with copy-on-write +- **[Share build caches](https://worktrunk.dev/step/#wt-step-copy-ignored)** — `target/`, `node_modules/`, etc are copy-on-write clones, so a new worktree starts warm without a second copy on disk - **[`wt list --full`](https://worktrunk.dev/list/#full-mode)** — [CI status](https://worktrunk.dev/list/#ci-status) and [AI-generated summaries](https://worktrunk.dev/list/#llm-summaries) per branch - **[PR checkout](https://worktrunk.dev/switch/#pull-requests-and-merge-requests)** — `wt switch pr:123` to jump straight to a PR's branch - **[Dev server per worktree](https://worktrunk.dev/tips-patterns/#dev-server-per-worktree)** — `hash_port` template filter gives each worktree a unique port diff --git a/docs/src/content/docs/worktrunk.md b/docs/src/content/docs/worktrunk.md index 1288e9676..3a772b184 100644 --- a/docs/src/content/docs/worktrunk.md +++ b/docs/src/content/docs/worktrunk.md @@ -100,7 +100,7 @@ git branch -d feat - **[LLM commit messages](/llm-commits/)** — generate commit messages from diffs - **[Merge workflow](/merge/)** — squash, rebase, merge, clean up in one command - **[Interactive picker](/switch/#interactive-picker)** — browse worktrees with live diff and log previews -- **[Copy build caches](/step/#wt-step-copy-ignored)** — skip cold starts by sharing `target/`, `node_modules/`, etc between worktrees, with copy-on-write +- **[Share build caches](/step/#wt-step-copy-ignored)** — `target/`, `node_modules/`, etc are copy-on-write clones, so a new worktree starts warm without a second copy on disk - **[`wt list --full`](/list/#full-mode)** — [CI status](/list/#ci-status) and [AI-generated summaries](/list/#llm-summaries) per branch - **[PR checkout](/switch/#pull-requests-and-merge-requests)** — `wt switch pr:123` to jump straight to a PR's branch - **[Dev server per worktree](/tips-patterns/#dev-server-per-worktree)** — `hash_port` template filter gives each worktree a unique port diff --git a/plugins/worktrunk/skills/worktrunk/reference/README.md b/plugins/worktrunk/skills/worktrunk/reference/README.md index 4924bb9ec..e0ebd656d 100644 --- a/plugins/worktrunk/skills/worktrunk/reference/README.md +++ b/plugins/worktrunk/skills/worktrunk/reference/README.md @@ -90,7 +90,7 @@ git branch -d feat - **[LLM commit messages](https://worktrunk.dev/llm-commits/)** — generate commit messages from diffs - **[Merge workflow](https://worktrunk.dev/merge/)** — squash, rebase, merge, clean up in one command - **[Interactive picker](https://worktrunk.dev/switch/#interactive-picker)** — browse worktrees with live diff and log previews -- **[Copy build caches](https://worktrunk.dev/step/#wt-step-copy-ignored)** — skip cold starts by sharing `target/`, `node_modules/`, etc between worktrees, with copy-on-write +- **[Share build caches](https://worktrunk.dev/step/#wt-step-copy-ignored)** — `target/`, `node_modules/`, etc are copy-on-write clones, so a new worktree starts warm without a second copy on disk - **[`wt list --full`](https://worktrunk.dev/list/#full-mode)** — [CI status](https://worktrunk.dev/list/#ci-status) and [AI-generated summaries](https://worktrunk.dev/list/#llm-summaries) per branch - **[PR checkout](https://worktrunk.dev/switch/#pull-requests-and-merge-requests)** — `wt switch pr:123` to jump straight to a PR's branch - **[Dev server per worktree](https://worktrunk.dev/tips-patterns/#dev-server-per-worktree)** — `hash_port` template filter gives each worktree a unique port diff --git a/plugins/worktrunk/skills/worktrunk/reference/worktrunk.md b/plugins/worktrunk/skills/worktrunk/reference/worktrunk.md index 85799a1a1..ed9fda274 100644 --- a/plugins/worktrunk/skills/worktrunk/reference/worktrunk.md +++ b/plugins/worktrunk/skills/worktrunk/reference/worktrunk.md @@ -72,7 +72,7 @@ git branch -d feat - **[LLM commit messages](https://worktrunk.dev/llm-commits/)** — generate commit messages from diffs - **[Merge workflow](https://worktrunk.dev/merge/)** — squash, rebase, merge, clean up in one command - **[Interactive picker](https://worktrunk.dev/switch/#interactive-picker)** — browse worktrees with live diff and log previews -- **[Copy build caches](https://worktrunk.dev/step/#wt-step-copy-ignored)** — skip cold starts by sharing `target/`, `node_modules/`, etc between worktrees, with copy-on-write +- **[Share build caches](https://worktrunk.dev/step/#wt-step-copy-ignored)** — `target/`, `node_modules/`, etc are copy-on-write clones, so a new worktree starts warm without a second copy on disk - **[`wt list --full`](https://worktrunk.dev/list/#full-mode)** — [CI status](https://worktrunk.dev/list/#ci-status) and [AI-generated summaries](https://worktrunk.dev/list/#llm-summaries) per branch - **[PR checkout](https://worktrunk.dev/switch/#pull-requests-and-merge-requests)** — `wt switch pr:123` to jump straight to a PR's branch - **[Dev server per worktree](https://worktrunk.dev/tips-patterns/#dev-server-per-worktree)** — `hash_port` template filter gives each worktree a unique port diff --git a/skills/worktrunk/reference/worktrunk.md b/skills/worktrunk/reference/worktrunk.md index 85799a1a1..ed9fda274 100644 --- a/skills/worktrunk/reference/worktrunk.md +++ b/skills/worktrunk/reference/worktrunk.md @@ -72,7 +72,7 @@ git branch -d feat - **[LLM commit messages](https://worktrunk.dev/llm-commits/)** — generate commit messages from diffs - **[Merge workflow](https://worktrunk.dev/merge/)** — squash, rebase, merge, clean up in one command - **[Interactive picker](https://worktrunk.dev/switch/#interactive-picker)** — browse worktrees with live diff and log previews -- **[Copy build caches](https://worktrunk.dev/step/#wt-step-copy-ignored)** — skip cold starts by sharing `target/`, `node_modules/`, etc between worktrees, with copy-on-write +- **[Share build caches](https://worktrunk.dev/step/#wt-step-copy-ignored)** — `target/`, `node_modules/`, etc are copy-on-write clones, so a new worktree starts warm without a second copy on disk - **[`wt list --full`](https://worktrunk.dev/list/#full-mode)** — [CI status](https://worktrunk.dev/list/#ci-status) and [AI-generated summaries](https://worktrunk.dev/list/#llm-summaries) per branch - **[PR checkout](https://worktrunk.dev/switch/#pull-requests-and-merge-requests)** — `wt switch pr:123` to jump straight to a PR's branch - **[Dev server per worktree](https://worktrunk.dev/tips-patterns/#dev-server-per-worktree)** — `hash_port` template filter gives each worktree a unique port From 6d09f95febcf95b018959fefb48aaab4490ff555 Mon Sep 17 00:00:00 2001 From: Maximilian Roos Date: Sun, 6 Sep 2026 13:59:25 -0700 Subject: [PATCH 3/6] Scope the homepage build-cache claim to filesystems with reflink "Are copy-on-write clones" stated it unconditionally, which is wrong on ext4 and NTFS. The bullet it replaced made a claim about time, which held everywhere; this one is about disk, so it needs the scope every other file in the change already carries. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01NrPJmECkKALUaqxb9GKCC5 --- README.md | 2 +- docs/src/content/docs/worktrunk.md | 2 +- plugins/worktrunk/skills/worktrunk/reference/README.md | 2 +- plugins/worktrunk/skills/worktrunk/reference/worktrunk.md | 2 +- skills/worktrunk/reference/worktrunk.md | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index e0ebd656d..2ad9a8f91 100644 --- a/README.md +++ b/README.md @@ -90,7 +90,7 @@ git branch -d feat - **[LLM commit messages](https://worktrunk.dev/llm-commits/)** — generate commit messages from diffs - **[Merge workflow](https://worktrunk.dev/merge/)** — squash, rebase, merge, clean up in one command - **[Interactive picker](https://worktrunk.dev/switch/#interactive-picker)** — browse worktrees with live diff and log previews -- **[Share build caches](https://worktrunk.dev/step/#wt-step-copy-ignored)** — `target/`, `node_modules/`, etc are copy-on-write clones, so a new worktree starts warm without a second copy on disk +- **[Share build caches](https://worktrunk.dev/step/#wt-step-copy-ignored)** — `target/`, `node_modules/`, etc are copy-on-write clones where the filesystem supports it, so a new worktree starts warm without a second copy on disk - **[`wt list --full`](https://worktrunk.dev/list/#full-mode)** — [CI status](https://worktrunk.dev/list/#ci-status) and [AI-generated summaries](https://worktrunk.dev/list/#llm-summaries) per branch - **[PR checkout](https://worktrunk.dev/switch/#pull-requests-and-merge-requests)** — `wt switch pr:123` to jump straight to a PR's branch - **[Dev server per worktree](https://worktrunk.dev/tips-patterns/#dev-server-per-worktree)** — `hash_port` template filter gives each worktree a unique port diff --git a/docs/src/content/docs/worktrunk.md b/docs/src/content/docs/worktrunk.md index 3a772b184..55ec37fff 100644 --- a/docs/src/content/docs/worktrunk.md +++ b/docs/src/content/docs/worktrunk.md @@ -100,7 +100,7 @@ git branch -d feat - **[LLM commit messages](/llm-commits/)** — generate commit messages from diffs - **[Merge workflow](/merge/)** — squash, rebase, merge, clean up in one command - **[Interactive picker](/switch/#interactive-picker)** — browse worktrees with live diff and log previews -- **[Share build caches](/step/#wt-step-copy-ignored)** — `target/`, `node_modules/`, etc are copy-on-write clones, so a new worktree starts warm without a second copy on disk +- **[Share build caches](/step/#wt-step-copy-ignored)** — `target/`, `node_modules/`, etc are copy-on-write clones where the filesystem supports it, so a new worktree starts warm without a second copy on disk - **[`wt list --full`](/list/#full-mode)** — [CI status](/list/#ci-status) and [AI-generated summaries](/list/#llm-summaries) per branch - **[PR checkout](/switch/#pull-requests-and-merge-requests)** — `wt switch pr:123` to jump straight to a PR's branch - **[Dev server per worktree](/tips-patterns/#dev-server-per-worktree)** — `hash_port` template filter gives each worktree a unique port diff --git a/plugins/worktrunk/skills/worktrunk/reference/README.md b/plugins/worktrunk/skills/worktrunk/reference/README.md index e0ebd656d..2ad9a8f91 100644 --- a/plugins/worktrunk/skills/worktrunk/reference/README.md +++ b/plugins/worktrunk/skills/worktrunk/reference/README.md @@ -90,7 +90,7 @@ git branch -d feat - **[LLM commit messages](https://worktrunk.dev/llm-commits/)** — generate commit messages from diffs - **[Merge workflow](https://worktrunk.dev/merge/)** — squash, rebase, merge, clean up in one command - **[Interactive picker](https://worktrunk.dev/switch/#interactive-picker)** — browse worktrees with live diff and log previews -- **[Share build caches](https://worktrunk.dev/step/#wt-step-copy-ignored)** — `target/`, `node_modules/`, etc are copy-on-write clones, so a new worktree starts warm without a second copy on disk +- **[Share build caches](https://worktrunk.dev/step/#wt-step-copy-ignored)** — `target/`, `node_modules/`, etc are copy-on-write clones where the filesystem supports it, so a new worktree starts warm without a second copy on disk - **[`wt list --full`](https://worktrunk.dev/list/#full-mode)** — [CI status](https://worktrunk.dev/list/#ci-status) and [AI-generated summaries](https://worktrunk.dev/list/#llm-summaries) per branch - **[PR checkout](https://worktrunk.dev/switch/#pull-requests-and-merge-requests)** — `wt switch pr:123` to jump straight to a PR's branch - **[Dev server per worktree](https://worktrunk.dev/tips-patterns/#dev-server-per-worktree)** — `hash_port` template filter gives each worktree a unique port diff --git a/plugins/worktrunk/skills/worktrunk/reference/worktrunk.md b/plugins/worktrunk/skills/worktrunk/reference/worktrunk.md index ed9fda274..c5678c5ed 100644 --- a/plugins/worktrunk/skills/worktrunk/reference/worktrunk.md +++ b/plugins/worktrunk/skills/worktrunk/reference/worktrunk.md @@ -72,7 +72,7 @@ git branch -d feat - **[LLM commit messages](https://worktrunk.dev/llm-commits/)** — generate commit messages from diffs - **[Merge workflow](https://worktrunk.dev/merge/)** — squash, rebase, merge, clean up in one command - **[Interactive picker](https://worktrunk.dev/switch/#interactive-picker)** — browse worktrees with live diff and log previews -- **[Share build caches](https://worktrunk.dev/step/#wt-step-copy-ignored)** — `target/`, `node_modules/`, etc are copy-on-write clones, so a new worktree starts warm without a second copy on disk +- **[Share build caches](https://worktrunk.dev/step/#wt-step-copy-ignored)** — `target/`, `node_modules/`, etc are copy-on-write clones where the filesystem supports it, so a new worktree starts warm without a second copy on disk - **[`wt list --full`](https://worktrunk.dev/list/#full-mode)** — [CI status](https://worktrunk.dev/list/#ci-status) and [AI-generated summaries](https://worktrunk.dev/list/#llm-summaries) per branch - **[PR checkout](https://worktrunk.dev/switch/#pull-requests-and-merge-requests)** — `wt switch pr:123` to jump straight to a PR's branch - **[Dev server per worktree](https://worktrunk.dev/tips-patterns/#dev-server-per-worktree)** — `hash_port` template filter gives each worktree a unique port diff --git a/skills/worktrunk/reference/worktrunk.md b/skills/worktrunk/reference/worktrunk.md index ed9fda274..c5678c5ed 100644 --- a/skills/worktrunk/reference/worktrunk.md +++ b/skills/worktrunk/reference/worktrunk.md @@ -72,7 +72,7 @@ git branch -d feat - **[LLM commit messages](https://worktrunk.dev/llm-commits/)** — generate commit messages from diffs - **[Merge workflow](https://worktrunk.dev/merge/)** — squash, rebase, merge, clean up in one command - **[Interactive picker](https://worktrunk.dev/switch/#interactive-picker)** — browse worktrees with live diff and log previews -- **[Share build caches](https://worktrunk.dev/step/#wt-step-copy-ignored)** — `target/`, `node_modules/`, etc are copy-on-write clones, so a new worktree starts warm without a second copy on disk +- **[Share build caches](https://worktrunk.dev/step/#wt-step-copy-ignored)** — `target/`, `node_modules/`, etc are copy-on-write clones where the filesystem supports it, so a new worktree starts warm without a second copy on disk - **[`wt list --full`](https://worktrunk.dev/list/#full-mode)** — [CI status](https://worktrunk.dev/list/#ci-status) and [AI-generated summaries](https://worktrunk.dev/list/#llm-summaries) per branch - **[PR checkout](https://worktrunk.dev/switch/#pull-requests-and-merge-requests)** — `wt switch pr:123` to jump straight to a PR's branch - **[Dev server per worktree](https://worktrunk.dev/tips-patterns/#dev-server-per-worktree)** — `hash_port` template filter gives each worktree a unique port From 19b219b4f0b951838714afac1c733f3db14f70cc Mon Sep 17 00:00:00 2001 From: Maximilian Roos Date: Sun, 6 Sep 2026 14:06:08 -0700 Subject: [PATCH 4/6] Reframe the homepage bullet around stacking worktrees "A second copy" described one duplication event; the cost someone weighing a many-worktree workflow cares about is the tenth. "Starts warm" also lost its pair when "skip cold starts" left this bullet, so the metaphor no longer had an anchor on the page. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01NrPJmECkKALUaqxb9GKCC5 --- README.md | 2 +- docs/src/content/docs/worktrunk.md | 2 +- plugins/worktrunk/skills/worktrunk/reference/README.md | 2 +- plugins/worktrunk/skills/worktrunk/reference/worktrunk.md | 2 +- skills/worktrunk/reference/worktrunk.md | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 2ad9a8f91..576bbb5ff 100644 --- a/README.md +++ b/README.md @@ -90,7 +90,7 @@ git branch -d feat - **[LLM commit messages](https://worktrunk.dev/llm-commits/)** — generate commit messages from diffs - **[Merge workflow](https://worktrunk.dev/merge/)** — squash, rebase, merge, clean up in one command - **[Interactive picker](https://worktrunk.dev/switch/#interactive-picker)** — browse worktrees with live diff and log previews -- **[Share build caches](https://worktrunk.dev/step/#wt-step-copy-ignored)** — `target/`, `node_modules/`, etc are copy-on-write clones where the filesystem supports it, so a new worktree starts warm without a second copy on disk +- **[Share build caches](https://worktrunk.dev/step/#wt-step-copy-ignored)** — `target/`, `node_modules/`, etc are copy-on-write clones where the filesystem supports it, so a new worktree is immediately ready, and ten of them share one copy on disk - **[`wt list --full`](https://worktrunk.dev/list/#full-mode)** — [CI status](https://worktrunk.dev/list/#ci-status) and [AI-generated summaries](https://worktrunk.dev/list/#llm-summaries) per branch - **[PR checkout](https://worktrunk.dev/switch/#pull-requests-and-merge-requests)** — `wt switch pr:123` to jump straight to a PR's branch - **[Dev server per worktree](https://worktrunk.dev/tips-patterns/#dev-server-per-worktree)** — `hash_port` template filter gives each worktree a unique port diff --git a/docs/src/content/docs/worktrunk.md b/docs/src/content/docs/worktrunk.md index 55ec37fff..b5e9e7d87 100644 --- a/docs/src/content/docs/worktrunk.md +++ b/docs/src/content/docs/worktrunk.md @@ -100,7 +100,7 @@ git branch -d feat - **[LLM commit messages](/llm-commits/)** — generate commit messages from diffs - **[Merge workflow](/merge/)** — squash, rebase, merge, clean up in one command - **[Interactive picker](/switch/#interactive-picker)** — browse worktrees with live diff and log previews -- **[Share build caches](/step/#wt-step-copy-ignored)** — `target/`, `node_modules/`, etc are copy-on-write clones where the filesystem supports it, so a new worktree starts warm without a second copy on disk +- **[Share build caches](/step/#wt-step-copy-ignored)** — `target/`, `node_modules/`, etc are copy-on-write clones where the filesystem supports it, so a new worktree is immediately ready, and ten of them share one copy on disk - **[`wt list --full`](/list/#full-mode)** — [CI status](/list/#ci-status) and [AI-generated summaries](/list/#llm-summaries) per branch - **[PR checkout](/switch/#pull-requests-and-merge-requests)** — `wt switch pr:123` to jump straight to a PR's branch - **[Dev server per worktree](/tips-patterns/#dev-server-per-worktree)** — `hash_port` template filter gives each worktree a unique port diff --git a/plugins/worktrunk/skills/worktrunk/reference/README.md b/plugins/worktrunk/skills/worktrunk/reference/README.md index 2ad9a8f91..576bbb5ff 100644 --- a/plugins/worktrunk/skills/worktrunk/reference/README.md +++ b/plugins/worktrunk/skills/worktrunk/reference/README.md @@ -90,7 +90,7 @@ git branch -d feat - **[LLM commit messages](https://worktrunk.dev/llm-commits/)** — generate commit messages from diffs - **[Merge workflow](https://worktrunk.dev/merge/)** — squash, rebase, merge, clean up in one command - **[Interactive picker](https://worktrunk.dev/switch/#interactive-picker)** — browse worktrees with live diff and log previews -- **[Share build caches](https://worktrunk.dev/step/#wt-step-copy-ignored)** — `target/`, `node_modules/`, etc are copy-on-write clones where the filesystem supports it, so a new worktree starts warm without a second copy on disk +- **[Share build caches](https://worktrunk.dev/step/#wt-step-copy-ignored)** — `target/`, `node_modules/`, etc are copy-on-write clones where the filesystem supports it, so a new worktree is immediately ready, and ten of them share one copy on disk - **[`wt list --full`](https://worktrunk.dev/list/#full-mode)** — [CI status](https://worktrunk.dev/list/#ci-status) and [AI-generated summaries](https://worktrunk.dev/list/#llm-summaries) per branch - **[PR checkout](https://worktrunk.dev/switch/#pull-requests-and-merge-requests)** — `wt switch pr:123` to jump straight to a PR's branch - **[Dev server per worktree](https://worktrunk.dev/tips-patterns/#dev-server-per-worktree)** — `hash_port` template filter gives each worktree a unique port diff --git a/plugins/worktrunk/skills/worktrunk/reference/worktrunk.md b/plugins/worktrunk/skills/worktrunk/reference/worktrunk.md index c5678c5ed..0bb64bb8a 100644 --- a/plugins/worktrunk/skills/worktrunk/reference/worktrunk.md +++ b/plugins/worktrunk/skills/worktrunk/reference/worktrunk.md @@ -72,7 +72,7 @@ git branch -d feat - **[LLM commit messages](https://worktrunk.dev/llm-commits/)** — generate commit messages from diffs - **[Merge workflow](https://worktrunk.dev/merge/)** — squash, rebase, merge, clean up in one command - **[Interactive picker](https://worktrunk.dev/switch/#interactive-picker)** — browse worktrees with live diff and log previews -- **[Share build caches](https://worktrunk.dev/step/#wt-step-copy-ignored)** — `target/`, `node_modules/`, etc are copy-on-write clones where the filesystem supports it, so a new worktree starts warm without a second copy on disk +- **[Share build caches](https://worktrunk.dev/step/#wt-step-copy-ignored)** — `target/`, `node_modules/`, etc are copy-on-write clones where the filesystem supports it, so a new worktree is immediately ready, and ten of them share one copy on disk - **[`wt list --full`](https://worktrunk.dev/list/#full-mode)** — [CI status](https://worktrunk.dev/list/#ci-status) and [AI-generated summaries](https://worktrunk.dev/list/#llm-summaries) per branch - **[PR checkout](https://worktrunk.dev/switch/#pull-requests-and-merge-requests)** — `wt switch pr:123` to jump straight to a PR's branch - **[Dev server per worktree](https://worktrunk.dev/tips-patterns/#dev-server-per-worktree)** — `hash_port` template filter gives each worktree a unique port diff --git a/skills/worktrunk/reference/worktrunk.md b/skills/worktrunk/reference/worktrunk.md index c5678c5ed..0bb64bb8a 100644 --- a/skills/worktrunk/reference/worktrunk.md +++ b/skills/worktrunk/reference/worktrunk.md @@ -72,7 +72,7 @@ git branch -d feat - **[LLM commit messages](https://worktrunk.dev/llm-commits/)** — generate commit messages from diffs - **[Merge workflow](https://worktrunk.dev/merge/)** — squash, rebase, merge, clean up in one command - **[Interactive picker](https://worktrunk.dev/switch/#interactive-picker)** — browse worktrees with live diff and log previews -- **[Share build caches](https://worktrunk.dev/step/#wt-step-copy-ignored)** — `target/`, `node_modules/`, etc are copy-on-write clones where the filesystem supports it, so a new worktree starts warm without a second copy on disk +- **[Share build caches](https://worktrunk.dev/step/#wt-step-copy-ignored)** — `target/`, `node_modules/`, etc are copy-on-write clones where the filesystem supports it, so a new worktree is immediately ready, and ten of them share one copy on disk - **[`wt list --full`](https://worktrunk.dev/list/#full-mode)** — [CI status](https://worktrunk.dev/list/#ci-status) and [AI-generated summaries](https://worktrunk.dev/list/#llm-summaries) per branch - **[PR checkout](https://worktrunk.dev/switch/#pull-requests-and-merge-requests)** — `wt switch pr:123` to jump straight to a PR's branch - **[Dev server per worktree](https://worktrunk.dev/tips-patterns/#dev-server-per-worktree)** — `hash_port` template filter gives each worktree a unique port From b5c03ed3ab1b2218757e53460186dfef6d22a7fd Mon Sep 17 00:00:00 2001 From: Maximilian Roos Date: Sun, 6 Sep 2026 14:13:04 -0700 Subject: [PATCH 5/6] Say the build-cache bullet once instead of twice Pairing "a new worktree is immediately ready" with "ten of them share one copy" built a singular/plural symmetry no neighbouring bullet has, and reads as constructed. Naming the filesystems replaces the abstract "where the filesystem supports it" and matches how the FAQ and step page already scope the claim. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01NrPJmECkKALUaqxb9GKCC5 --- README.md | 2 +- docs/src/content/docs/worktrunk.md | 2 +- plugins/worktrunk/skills/worktrunk/reference/README.md | 2 +- plugins/worktrunk/skills/worktrunk/reference/worktrunk.md | 2 +- skills/worktrunk/reference/worktrunk.md | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 576bbb5ff..974fd2bdc 100644 --- a/README.md +++ b/README.md @@ -90,7 +90,7 @@ git branch -d feat - **[LLM commit messages](https://worktrunk.dev/llm-commits/)** — generate commit messages from diffs - **[Merge workflow](https://worktrunk.dev/merge/)** — squash, rebase, merge, clean up in one command - **[Interactive picker](https://worktrunk.dev/switch/#interactive-picker)** — browse worktrees with live diff and log previews -- **[Share build caches](https://worktrunk.dev/step/#wt-step-copy-ignored)** — `target/`, `node_modules/`, etc are copy-on-write clones where the filesystem supports it, so a new worktree is immediately ready, and ten of them share one copy on disk +- **[Share build caches](https://worktrunk.dev/step/#wt-step-copy-ignored)** — `target/`, `node_modules/`, etc are copy-on-write clones on APFS, btrfs, and XFS, so ten worktrees share one copy on disk - **[`wt list --full`](https://worktrunk.dev/list/#full-mode)** — [CI status](https://worktrunk.dev/list/#ci-status) and [AI-generated summaries](https://worktrunk.dev/list/#llm-summaries) per branch - **[PR checkout](https://worktrunk.dev/switch/#pull-requests-and-merge-requests)** — `wt switch pr:123` to jump straight to a PR's branch - **[Dev server per worktree](https://worktrunk.dev/tips-patterns/#dev-server-per-worktree)** — `hash_port` template filter gives each worktree a unique port diff --git a/docs/src/content/docs/worktrunk.md b/docs/src/content/docs/worktrunk.md index b5e9e7d87..e1cda8fe8 100644 --- a/docs/src/content/docs/worktrunk.md +++ b/docs/src/content/docs/worktrunk.md @@ -100,7 +100,7 @@ git branch -d feat - **[LLM commit messages](/llm-commits/)** — generate commit messages from diffs - **[Merge workflow](/merge/)** — squash, rebase, merge, clean up in one command - **[Interactive picker](/switch/#interactive-picker)** — browse worktrees with live diff and log previews -- **[Share build caches](/step/#wt-step-copy-ignored)** — `target/`, `node_modules/`, etc are copy-on-write clones where the filesystem supports it, so a new worktree is immediately ready, and ten of them share one copy on disk +- **[Share build caches](/step/#wt-step-copy-ignored)** — `target/`, `node_modules/`, etc are copy-on-write clones on APFS, btrfs, and XFS, so ten worktrees share one copy on disk - **[`wt list --full`](/list/#full-mode)** — [CI status](/list/#ci-status) and [AI-generated summaries](/list/#llm-summaries) per branch - **[PR checkout](/switch/#pull-requests-and-merge-requests)** — `wt switch pr:123` to jump straight to a PR's branch - **[Dev server per worktree](/tips-patterns/#dev-server-per-worktree)** — `hash_port` template filter gives each worktree a unique port diff --git a/plugins/worktrunk/skills/worktrunk/reference/README.md b/plugins/worktrunk/skills/worktrunk/reference/README.md index 576bbb5ff..974fd2bdc 100644 --- a/plugins/worktrunk/skills/worktrunk/reference/README.md +++ b/plugins/worktrunk/skills/worktrunk/reference/README.md @@ -90,7 +90,7 @@ git branch -d feat - **[LLM commit messages](https://worktrunk.dev/llm-commits/)** — generate commit messages from diffs - **[Merge workflow](https://worktrunk.dev/merge/)** — squash, rebase, merge, clean up in one command - **[Interactive picker](https://worktrunk.dev/switch/#interactive-picker)** — browse worktrees with live diff and log previews -- **[Share build caches](https://worktrunk.dev/step/#wt-step-copy-ignored)** — `target/`, `node_modules/`, etc are copy-on-write clones where the filesystem supports it, so a new worktree is immediately ready, and ten of them share one copy on disk +- **[Share build caches](https://worktrunk.dev/step/#wt-step-copy-ignored)** — `target/`, `node_modules/`, etc are copy-on-write clones on APFS, btrfs, and XFS, so ten worktrees share one copy on disk - **[`wt list --full`](https://worktrunk.dev/list/#full-mode)** — [CI status](https://worktrunk.dev/list/#ci-status) and [AI-generated summaries](https://worktrunk.dev/list/#llm-summaries) per branch - **[PR checkout](https://worktrunk.dev/switch/#pull-requests-and-merge-requests)** — `wt switch pr:123` to jump straight to a PR's branch - **[Dev server per worktree](https://worktrunk.dev/tips-patterns/#dev-server-per-worktree)** — `hash_port` template filter gives each worktree a unique port diff --git a/plugins/worktrunk/skills/worktrunk/reference/worktrunk.md b/plugins/worktrunk/skills/worktrunk/reference/worktrunk.md index 0bb64bb8a..eec7e271f 100644 --- a/plugins/worktrunk/skills/worktrunk/reference/worktrunk.md +++ b/plugins/worktrunk/skills/worktrunk/reference/worktrunk.md @@ -72,7 +72,7 @@ git branch -d feat - **[LLM commit messages](https://worktrunk.dev/llm-commits/)** — generate commit messages from diffs - **[Merge workflow](https://worktrunk.dev/merge/)** — squash, rebase, merge, clean up in one command - **[Interactive picker](https://worktrunk.dev/switch/#interactive-picker)** — browse worktrees with live diff and log previews -- **[Share build caches](https://worktrunk.dev/step/#wt-step-copy-ignored)** — `target/`, `node_modules/`, etc are copy-on-write clones where the filesystem supports it, so a new worktree is immediately ready, and ten of them share one copy on disk +- **[Share build caches](https://worktrunk.dev/step/#wt-step-copy-ignored)** — `target/`, `node_modules/`, etc are copy-on-write clones on APFS, btrfs, and XFS, so ten worktrees share one copy on disk - **[`wt list --full`](https://worktrunk.dev/list/#full-mode)** — [CI status](https://worktrunk.dev/list/#ci-status) and [AI-generated summaries](https://worktrunk.dev/list/#llm-summaries) per branch - **[PR checkout](https://worktrunk.dev/switch/#pull-requests-and-merge-requests)** — `wt switch pr:123` to jump straight to a PR's branch - **[Dev server per worktree](https://worktrunk.dev/tips-patterns/#dev-server-per-worktree)** — `hash_port` template filter gives each worktree a unique port diff --git a/skills/worktrunk/reference/worktrunk.md b/skills/worktrunk/reference/worktrunk.md index 0bb64bb8a..eec7e271f 100644 --- a/skills/worktrunk/reference/worktrunk.md +++ b/skills/worktrunk/reference/worktrunk.md @@ -72,7 +72,7 @@ git branch -d feat - **[LLM commit messages](https://worktrunk.dev/llm-commits/)** — generate commit messages from diffs - **[Merge workflow](https://worktrunk.dev/merge/)** — squash, rebase, merge, clean up in one command - **[Interactive picker](https://worktrunk.dev/switch/#interactive-picker)** — browse worktrees with live diff and log previews -- **[Share build caches](https://worktrunk.dev/step/#wt-step-copy-ignored)** — `target/`, `node_modules/`, etc are copy-on-write clones where the filesystem supports it, so a new worktree is immediately ready, and ten of them share one copy on disk +- **[Share build caches](https://worktrunk.dev/step/#wt-step-copy-ignored)** — `target/`, `node_modules/`, etc are copy-on-write clones on APFS, btrfs, and XFS, so ten worktrees share one copy on disk - **[`wt list --full`](https://worktrunk.dev/list/#full-mode)** — [CI status](https://worktrunk.dev/list/#ci-status) and [AI-generated summaries](https://worktrunk.dev/list/#llm-summaries) per branch - **[PR checkout](https://worktrunk.dev/switch/#pull-requests-and-merge-requests)** — `wt switch pr:123` to jump straight to a PR's branch - **[Dev server per worktree](https://worktrunk.dev/tips-patterns/#dev-server-per-worktree)** — `hash_port` template filter gives each worktree a unique port From 1af7f33860223e499a7f1744d6b136c83a2412ab Mon Sep 17 00:00:00 2001 From: Maximilian Roos Date: Sun, 6 Sep 2026 14:17:51 -0700 Subject: [PATCH 6/6] Restore the readiness benefit to the build-cache bullet Dropping the constructed benefit pair took the readiness claim with it. Making "ten worktrees" the subject carries the stacking cost, and "without building or copying" names both costs avoided in one clause rather than two matched ones. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01NrPJmECkKALUaqxb9GKCC5 --- README.md | 2 +- docs/src/content/docs/worktrunk.md | 2 +- plugins/worktrunk/skills/worktrunk/reference/README.md | 2 +- plugins/worktrunk/skills/worktrunk/reference/worktrunk.md | 2 +- skills/worktrunk/reference/worktrunk.md | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 974fd2bdc..259e9701e 100644 --- a/README.md +++ b/README.md @@ -90,7 +90,7 @@ git branch -d feat - **[LLM commit messages](https://worktrunk.dev/llm-commits/)** — generate commit messages from diffs - **[Merge workflow](https://worktrunk.dev/merge/)** — squash, rebase, merge, clean up in one command - **[Interactive picker](https://worktrunk.dev/switch/#interactive-picker)** — browse worktrees with live diff and log previews -- **[Share build caches](https://worktrunk.dev/step/#wt-step-copy-ignored)** — `target/`, `node_modules/`, etc are copy-on-write clones on APFS, btrfs, and XFS, so ten worktrees share one copy on disk +- **[Share build caches](https://worktrunk.dev/step/#wt-step-copy-ignored)** — ten worktrees get `target/`, `node_modules/`, etc without building or copying them (on APFS, btrfs, and XFS) - **[`wt list --full`](https://worktrunk.dev/list/#full-mode)** — [CI status](https://worktrunk.dev/list/#ci-status) and [AI-generated summaries](https://worktrunk.dev/list/#llm-summaries) per branch - **[PR checkout](https://worktrunk.dev/switch/#pull-requests-and-merge-requests)** — `wt switch pr:123` to jump straight to a PR's branch - **[Dev server per worktree](https://worktrunk.dev/tips-patterns/#dev-server-per-worktree)** — `hash_port` template filter gives each worktree a unique port diff --git a/docs/src/content/docs/worktrunk.md b/docs/src/content/docs/worktrunk.md index e1cda8fe8..d9b40ae79 100644 --- a/docs/src/content/docs/worktrunk.md +++ b/docs/src/content/docs/worktrunk.md @@ -100,7 +100,7 @@ git branch -d feat - **[LLM commit messages](/llm-commits/)** — generate commit messages from diffs - **[Merge workflow](/merge/)** — squash, rebase, merge, clean up in one command - **[Interactive picker](/switch/#interactive-picker)** — browse worktrees with live diff and log previews -- **[Share build caches](/step/#wt-step-copy-ignored)** — `target/`, `node_modules/`, etc are copy-on-write clones on APFS, btrfs, and XFS, so ten worktrees share one copy on disk +- **[Share build caches](/step/#wt-step-copy-ignored)** — ten worktrees get `target/`, `node_modules/`, etc without building or copying them (on APFS, btrfs, and XFS) - **[`wt list --full`](/list/#full-mode)** — [CI status](/list/#ci-status) and [AI-generated summaries](/list/#llm-summaries) per branch - **[PR checkout](/switch/#pull-requests-and-merge-requests)** — `wt switch pr:123` to jump straight to a PR's branch - **[Dev server per worktree](/tips-patterns/#dev-server-per-worktree)** — `hash_port` template filter gives each worktree a unique port diff --git a/plugins/worktrunk/skills/worktrunk/reference/README.md b/plugins/worktrunk/skills/worktrunk/reference/README.md index 974fd2bdc..259e9701e 100644 --- a/plugins/worktrunk/skills/worktrunk/reference/README.md +++ b/plugins/worktrunk/skills/worktrunk/reference/README.md @@ -90,7 +90,7 @@ git branch -d feat - **[LLM commit messages](https://worktrunk.dev/llm-commits/)** — generate commit messages from diffs - **[Merge workflow](https://worktrunk.dev/merge/)** — squash, rebase, merge, clean up in one command - **[Interactive picker](https://worktrunk.dev/switch/#interactive-picker)** — browse worktrees with live diff and log previews -- **[Share build caches](https://worktrunk.dev/step/#wt-step-copy-ignored)** — `target/`, `node_modules/`, etc are copy-on-write clones on APFS, btrfs, and XFS, so ten worktrees share one copy on disk +- **[Share build caches](https://worktrunk.dev/step/#wt-step-copy-ignored)** — ten worktrees get `target/`, `node_modules/`, etc without building or copying them (on APFS, btrfs, and XFS) - **[`wt list --full`](https://worktrunk.dev/list/#full-mode)** — [CI status](https://worktrunk.dev/list/#ci-status) and [AI-generated summaries](https://worktrunk.dev/list/#llm-summaries) per branch - **[PR checkout](https://worktrunk.dev/switch/#pull-requests-and-merge-requests)** — `wt switch pr:123` to jump straight to a PR's branch - **[Dev server per worktree](https://worktrunk.dev/tips-patterns/#dev-server-per-worktree)** — `hash_port` template filter gives each worktree a unique port diff --git a/plugins/worktrunk/skills/worktrunk/reference/worktrunk.md b/plugins/worktrunk/skills/worktrunk/reference/worktrunk.md index eec7e271f..0f6cded40 100644 --- a/plugins/worktrunk/skills/worktrunk/reference/worktrunk.md +++ b/plugins/worktrunk/skills/worktrunk/reference/worktrunk.md @@ -72,7 +72,7 @@ git branch -d feat - **[LLM commit messages](https://worktrunk.dev/llm-commits/)** — generate commit messages from diffs - **[Merge workflow](https://worktrunk.dev/merge/)** — squash, rebase, merge, clean up in one command - **[Interactive picker](https://worktrunk.dev/switch/#interactive-picker)** — browse worktrees with live diff and log previews -- **[Share build caches](https://worktrunk.dev/step/#wt-step-copy-ignored)** — `target/`, `node_modules/`, etc are copy-on-write clones on APFS, btrfs, and XFS, so ten worktrees share one copy on disk +- **[Share build caches](https://worktrunk.dev/step/#wt-step-copy-ignored)** — ten worktrees get `target/`, `node_modules/`, etc without building or copying them (on APFS, btrfs, and XFS) - **[`wt list --full`](https://worktrunk.dev/list/#full-mode)** — [CI status](https://worktrunk.dev/list/#ci-status) and [AI-generated summaries](https://worktrunk.dev/list/#llm-summaries) per branch - **[PR checkout](https://worktrunk.dev/switch/#pull-requests-and-merge-requests)** — `wt switch pr:123` to jump straight to a PR's branch - **[Dev server per worktree](https://worktrunk.dev/tips-patterns/#dev-server-per-worktree)** — `hash_port` template filter gives each worktree a unique port diff --git a/skills/worktrunk/reference/worktrunk.md b/skills/worktrunk/reference/worktrunk.md index eec7e271f..0f6cded40 100644 --- a/skills/worktrunk/reference/worktrunk.md +++ b/skills/worktrunk/reference/worktrunk.md @@ -72,7 +72,7 @@ git branch -d feat - **[LLM commit messages](https://worktrunk.dev/llm-commits/)** — generate commit messages from diffs - **[Merge workflow](https://worktrunk.dev/merge/)** — squash, rebase, merge, clean up in one command - **[Interactive picker](https://worktrunk.dev/switch/#interactive-picker)** — browse worktrees with live diff and log previews -- **[Share build caches](https://worktrunk.dev/step/#wt-step-copy-ignored)** — `target/`, `node_modules/`, etc are copy-on-write clones on APFS, btrfs, and XFS, so ten worktrees share one copy on disk +- **[Share build caches](https://worktrunk.dev/step/#wt-step-copy-ignored)** — ten worktrees get `target/`, `node_modules/`, etc without building or copying them (on APFS, btrfs, and XFS) - **[`wt list --full`](https://worktrunk.dev/list/#full-mode)** — [CI status](https://worktrunk.dev/list/#ci-status) and [AI-generated summaries](https://worktrunk.dev/list/#llm-summaries) per branch - **[PR checkout](https://worktrunk.dev/switch/#pull-requests-and-merge-requests)** — `wt switch pr:123` to jump straight to a PR's branch - **[Dev server per worktree](https://worktrunk.dev/tips-patterns/#dev-server-per-worktree)** — `hash_port` template filter gives each worktree a unique port