Skip to content
Merged
Show file tree
Hide file tree
Changes from 18 commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
745f400
docs: group tips & patterns, fix stale recipes
max-sixty Sep 1, 2026
b9597b9
docs: publish shell integration; give each topic one home
max-sixty Sep 1, 2026
589acfc
docs: emit global options once per page; qualify duplicate config hea…
max-sixty Sep 1, 2026
6a54a96
docs: widen terminal figures; caption the demos
max-sixty Sep 1, 2026
b41ded5
docs: add a site footer with version, releases, and license
max-sixty Sep 1, 2026
b7b2893
docs: copy terminal commands per line; drop copy on reference frames
max-sixty Sep 1, 2026
a9483c4
docs: serve the new page as Markdown; guard the listing
max-sixty Sep 2, 2026
4b732a8
docs: cut global options at the reference, not the page
max-sixty Sep 2, 2026
fb5ce8d
docs: the FAQ's shell fallback covers both routes it offers
max-sixty Sep 2, 2026
d9e378a
docs: correct wt step prune, step eval -v, and the hook preview note
max-sixty Sep 2, 2026
03c6ae6
docs: one home for the two duplicated worktree-path recipes
max-sixty Sep 2, 2026
2d4ebb4
docs: refresh two pointers the page moves left stale
max-sixty Sep 2, 2026
95caf5f
docs: caption the two hand-written demo figures
max-sixty Sep 2, 2026
8b62bc7
docs: name a shape, not a deleted file, in the symlink examples
max-sixty Sep 2, 2026
fa2ea62
docs: pin the sidebar against each page's order
max-sixty Sep 2, 2026
a73f3f7
fix(plugin): point the Windows Terminal hint at the canonical install…
max-sixty Sep 2, 2026
e57a96c
Merge origin/main
max-sixty Sep 2, 2026
0439b67
Test the branches of take_global_options and the demo caption
max-sixty Sep 3, 2026
bf6475d
Merge origin/main
max-sixty Sep 3, 2026
e64e315
Merge branch 'main' into land/docs-site
max-sixty Sep 6, 2026
90b0ae6
Merge remote-tracking branch 'origin/main' into land/docs-site
max-sixty Sep 6, 2026
2af701e
docs: regenerate config references after main merge
max-sixty Sep 6, 2026
9832604
Merge remote-tracking branch 'origin/main' into land/docs-site
max-sixty Sep 6, 2026
6e05573
Merge origin/main
max-sixty Sep 11, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 2 additions & 7 deletions .config/lychee.toml
Original file line number Diff line number Diff line change
Expand Up @@ -88,12 +88,7 @@ exclude = [
exclude_path = [
# Generated plugin-skills mirror: a byte-identical copy of `skills/`, synced
# by `test_docs_are_in_sync`. Every file here is already link-checked at its
# authored `skills/` source, where `reference/README.md` is a symlink to the
# repo-root README and its relative `docs/public/logo.png` resolves. The sync
# dereferences that symlink into a real file, so under the mirror the
# repo-root-relative image path resolves to a nonexistent
# `plugins/worktrunk/skills/worktrunk/reference/docs/public/logo.png`.
# Excluding the redundant copy avoids that false positive without losing
# coverage (the authored source is still checked).
# authored `skills/` source, so checking the copy costs time and finds
# nothing new.
"plugins/worktrunk/skills/",
]
7 changes: 2 additions & 5 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,8 @@
# belong in the primary source (src/cli/mod.rs for command pages,
# docs/src/content/docs/*.md for everything else).
skills/worktrunk/reference/*.md linguist-generated=true
# Skill-only files and the top-level README symlink are primary sources — edited
# directly, not regenerated from docs/src/content/docs/. Exempt them so real edits stay
# visible in PR diffs.
skills/worktrunk/reference/README.md linguist-generated=false
skills/worktrunk/reference/shell-integration.md linguist-generated=false
# Skill-only files are primary sources — edited directly, not regenerated from
# docs/src/content/docs/. Exempt them so real edits stay visible in PR diffs.
skills/worktrunk/reference/troubleshooting.md linguist-generated=false
# The plugin skills tree is a real-file mirror of repo-root skills/, rewritten by
# `test_docs_are_in_sync`'s `sync_plugin_skills_mirror` stage. Nothing here is
Expand Down
2 changes: 1 addition & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ Load relevant skills before starting; reload when scope changes mid-session. Pro

## Documentation

Behavior changes require doc updates. `src/cli/mod.rs` (`after_long_help` plus clap attributes) is the PRIMARY SOURCE for command pages; their rendered mirrors in `docs/src/content/docs/` and `skills/worktrunk/reference/` are generated, as is all of `plugins/worktrunk/skills/` — but both directories also hold hand-edited primaries (non-command docs in `docs/src/content/docs/`, skill-only pages like `shell-integration.md` in the reference dir), so check which file is primary in the sync taxonomy before editing. Ask: "does `--help` still describe what the code does?" `cargo test --test integration test_docs_are_in_sync` checks doc sync; editing help text (`after_long_help`, `about`, arg docs) also changes the rendered `--help` snapshots, which that test leaves untouched — `cargo insta test --accept --test integration -- test_help` regenerates them (the pre-merge hook runs both). Sync taxonomy, help-text authoring (three render contexts, link text, config-TOML blocks): `docs/CLAUDE.md`.
Behavior changes require doc updates. `src/cli/mod.rs` (`after_long_help` plus clap attributes) is the PRIMARY SOURCE for command pages; their rendered mirrors in `docs/src/content/docs/` and `skills/worktrunk/reference/` are generated, as is all of `plugins/worktrunk/skills/` — but both directories also hold hand-edited primaries (non-command docs in `docs/src/content/docs/`, skill-only pages like `troubleshooting.md` in the reference dir), so check which file is primary in the sync taxonomy before editing. Ask: "does `--help` still describe what the code does?" `cargo test --test integration test_docs_are_in_sync` checks doc sync; editing help text (`after_long_help`, `about`, arg docs) also changes the rendered `--help` snapshots, which that test leaves untouched — `cargo insta test --accept --test integration -- test_help` regenerates them (the pre-merge hook runs both). Sync taxonomy, help-text authoring (three render contexts, link text, config-TOML blocks): `docs/CLAUDE.md`.

## Plugin Layout

Expand Down
14 changes: 13 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ A quick demo:

AI agents like Claude Code and Codex can handle longer tasks without
supervision, such that it's possible to manage 5-10+ in parallel. Git's native
worktree feature give each agent its own working directory, so they don't step
worktree feature gives each agent its own working directory, so they don't step
on each other's changes.

But the git worktree UX is clunky. Even a task as small as starting a new
Expand Down Expand Up @@ -238,6 +238,18 @@ The `-x` flag runs a command after switching; arguments after `--` are passed to
- [Open an issue](https://github.com/max-sixty/worktrunk/issues/new?title=&body=%23%23%20Description%0A%0A%3C!--%20Describe%20the%20bug%20or%20feature%20request%20--%3E%0A%0A%23%23%20Context%0A%0A%3C!--%20Any%20relevant%20context%3A%20your%20workflow%2C%20what%20you%20were%20trying%20to%20do%2C%20etc.%20--%3E) — feedback, feature requests, even a small friction or imperfect user message, or [a worktree pain not yet solved](https://github.com/max-sixty/worktrunk/issues/new?title=Worktree%20friction%3A%20&body=%23%23%20The%20friction%0A%0A%3C!--%20What%20worktree-related%20task%20is%20still%20painful%3F%20--%3E%0A%0A%23%23%20Current%20workaround%0A%0A%3C!--%20How%20do%20you%20handle%20this%20today%3F%20--%3E%0A%0A%23%23%20Ideal%20solution%0A%0A%3C!--%20What%20would%20make%20this%20easier%3F%20--%3E)
- Share: [X](https://twitter.com/intent/tweet?text=Worktrunk%20%E2%80%94%20CLI%20for%20git%20worktree%20management&url=https%3A%2F%2Fworktrunk.dev) · [Reddit](https://www.reddit.com/submit?url=https%3A%2F%2Fworktrunk.dev&title=Worktrunk%20%E2%80%94%20CLI%20for%20git%20worktree%20management) · [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fworktrunk.dev)

### Running the tests

```bash
cargo test
```

The shell integration tests need bash, zsh, fish, nushell, and pwsh, plus `jq`:

```bash
cargo test --test integration --features shell-integration-tests
```

> ### 📚 Full documentation at [worktrunk.dev](https://worktrunk.dev) 📚

### Star history
Expand Down
8 changes: 4 additions & 4 deletions dev/config.example.toml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 3 additions & 3 deletions dev/wt.example.toml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 6 additions & 6 deletions docs/CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -114,12 +114,12 @@ There are three source categories:
region in `docs/src/content/docs/{command}.md`, then generates the matching
`skills/worktrunk/reference/` page.
2. **Non-command pages**: files such as `claude-code.md`, `extending.md`,
`faq.md`, `llm-commits.md`, `tips-patterns.md`, and `worktrunk.md` are primary
in `docs/src/content/docs/`. The sync test derives the skill copy.
3. **Skill-only pages**: files such as `shell-integration.md` and
`troubleshooting.md` are primary in `skills/worktrunk/reference/` and have no
site page. When adding one, add a `linguist-generated=false` entry to
`.gitattributes`.
`faq.md`, `llm-commits.md`, `shell-integration.md`, `tips-patterns.md`, and
`worktrunk.md` are primary in `docs/src/content/docs/`. The sync test derives
the skill copy.
3. **Skill-only pages**: `troubleshooting.md` is primary in
`skills/worktrunk/reference/` and has no site page. When adding one, add a
`linguist-generated=false` entry to `.gitattributes`.

Never hand-edit a generated mirror.

Expand Down
1 change: 1 addition & 0 deletions docs/astro.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ export default defineConfig({
},
customCss: ['./src/styles/custom.css'],
components: {
Footer: './src/components/Footer.astro',
Head: './src/components/Head.astro',
PageTitle: './src/components/PageTitle.astro',
Pagination: './src/components/Pagination.astro',
Expand Down
2 changes: 1 addition & 1 deletion docs/public/.well-known/agent-skills/index.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 4 additions & 3 deletions docs/public/llms.txt

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions docs/public/shell-integration.md

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

51 changes: 51 additions & 0 deletions docs/src/components/Footer.astro
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
---
// Starlight's own footer carries only the edit link, so the site had nowhere
// to name its version, its releases, or its license, and /code-signing/ was
// reachable only from a collapsed block on the homepage. This wraps the
// default rather than replacing it, keeping the upstream merge surface to the
// one element added below.
import Default from '@astrojs/starlight/components/Footer.astro';

// The published version is whatever Cargo.toml says at build time; a second
// copy here would go stale on the next release. `?raw` resolves at build time
// relative to this file, unlike a runtime path in the bundled output.
import cargoToml from '../../../Cargo.toml?raw';

const repository = 'https://github.com/max-sixty/worktrunk';

const version = cargoToml.match(/^\[package\][\s\S]*?^version = "([^"]+)"$/m)?.[1];
if (!version) throw new Error('No [package] version in Cargo.toml');
---

<Default />

<footer class="wt-site-footer">
<a href={`${repository}/releases/tag/v${version}`}>v{version}</a>
<a href={`${repository}/releases`}>Releases</a>
<a href={`${repository}/blob/main/CHANGELOG.md`}>Changelog</a>
<a href="/code-signing/">Code signing</a>
<a href={`${repository}/blob/main/LICENSE`}>MIT OR Apache-2.0</a>
</footer>

<style>
.wt-site-footer {
display: flex;
flex-wrap: wrap;
gap: 0.4rem 1.25rem;
margin-top: 2.5rem;
border-top: 1px solid var(--sl-color-hairline);
padding-top: 1rem;
color: var(--sl-color-gray-3);
font-size: var(--sl-text-xs);
}

.wt-site-footer a {
color: inherit;
text-decoration: none;
}

.wt-site-footer a:hover {
color: var(--wt-copper);
text-decoration: underline;
}
</style>
11 changes: 7 additions & 4 deletions docs/src/content/docs/claude-code.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
title: "Agent Integration"
description: "Worktrunk plugins for Claude Code, Codex, OpenCode, and Gemini CLI: a configuration skill, wt list activity tracking, and Claude-only worktree isolation."
sidebar:
order: 23
order: 21
---
Worktrunk ships a plugin for each supported agent CLI. What a plugin provides depends on the hooks that CLI exposes:

Expand All @@ -11,9 +11,11 @@ Worktrunk ships a plugin for each supported agent CLI. What a plugin provides de
| Configuration skill | ✓ | ✓ | | ✓ |
| Activity tracking (🤖/💬 in `wt list`) | ✓ | ✓ | ✓ | ✓ |
| Worktree isolation | ✓ | | | |
| `/wt-switch-create` command | ✓ | | | |
| `/wt-switch-create` skill | ✓ | ✓\* | | ✓\* |

The configuration skill is documentation the agent reads to help set up LLM commits, hooks, and troubleshooting. Activity tracking shows which worktrees have running sessions. Worktree isolation needs worktree-lifecycle hooks and `/wt-switch-create` needs session working-directory switching — both Claude Code-only, so Codex, OpenCode, and Gemini users invoke `wt switch --create` and `wt remove` directly. Codex tracks activity through its own `Stop` and `SessionEnd` hooks.
\* Codex and Gemini load the `/wt-switch-create` skill from the same shared skill set, but neither lets a skill change the session's working directory, so it does nothing there.

The configuration skill is documentation the agent reads to help set up LLM commits, hooks, and troubleshooting. Activity tracking shows which worktrees have running sessions. Worktree isolation needs worktree-lifecycle hooks, which only Claude Code exposes, so Codex, OpenCode, and Gemini users invoke `wt switch --create` and `wt remove` directly. Codex tracks activity through its own `Stop` and `SessionEnd` hooks.

## Installation

Expand Down Expand Up @@ -125,7 +127,7 @@ Three things to get right:

Claude Code agents can run in isolated worktrees (`isolation: "worktree"`). By default, Claude Code creates these with `git worktree add`. The plugin's `WorktreeCreate` and `WorktreeRemove` hooks route this through `wt switch --create` and `wt remove` instead, so worktrees created by agents get worktrunk's naming conventions, hooks, and lifecycle management.

## `/wt-switch-create` command (Claude Code only)
## `/wt-switch-create` skill (Claude Code only)

`/wt-switch-create [<branch>] [<repo>] [-- <task>]` starts a task in a fresh worktree without leaving the session: it creates the worktree, switches into it, and runs the task (all arguments optional). The worktree shows up in `wt list`; merge or remove it with `wt merge` / `wt remove`.

Expand All @@ -142,6 +144,7 @@ Worktree state comes from the same cells [`wt list`](/list/) renders; Claude Cod
<source srcset="/assets/docs/dark/wt-statusline.gif" media="(prefers-color-scheme: dark)">
<img src="/assets/docs/light/wt-statusline.gif" alt="Claude Code statusline demo" width="1600" height="900">
</picture>
<figcaption>Switching to a worktree, then launching Claude Code with the statusline configured</figcaption>
</figure>

Add to `~/.claude/settings.json`:
Expand Down
3 changes: 1 addition & 2 deletions docs/src/content/docs/code-signing.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,7 @@
title: "Code Signing Policy"
description: "How Worktrunk's Windows release binaries are code-signed: certificate provenance, the build and signing pipeline, project roles, and per-release approval."
sidebar:
order: 26
hidden: true
order: 27
---
This page is Worktrunk's **code signing policy**. It describes what gets signed, which certificate is used, how the signing pipeline works, and who authorizes each release. It exists both to document the process for users and to satisfy the transparency requirements of the [SignPath Foundation](https://signpath.org/) open-source code signing program.

Expand Down
Loading
Loading