wt config
Manage user & project configs. Includes shell integration, hooks, and saved state.
Examples
Install shell integration (required for directory switching):
wt config shell install
Create user config file with documented examples:
wt config create
Create project config file (.config/wt.toml) for hooks:
wt config create --project
Show current configuration and file locations:
wt config show
Configuration files
| File | Location | Contains | Committed & shared |
|---|---|---|---|
| User config | ~/.config/worktrunk/config.toml | Worktree path template, LLM commit configs, etc | ✗ |
| Project config | .config/wt.toml | Project hooks, dev server URL | ✓ |
Organizations can also deploy a system-wide config file for shared defaults — run wt config show for the platform-specific location.
User config — personal preferences:
# ~/.config/worktrunk/config.toml
worktree-path = ".worktrees/{{ branch | sanitize }}"
[commit.generation]
command = "CLAUDECODE= MAX_THINKING_TOKENS=0 claude -p --no-session-persistence --model=haiku --tools='' --disable-slash-commands --setting-sources='' --system-prompt=''"
Project config — shared team settings:
# .config/wt.toml
[pre-start]
deps = "npm ci"
[pre-merge]
test = "npm test"
User Configuration
Create with wt config create. Values shown are defaults unless noted otherwise.
Location:
- macOS/Linux:
~/.config/worktrunk/config.toml(or$XDG_CONFIG_HOMEif set) - Windows:
%APPDATA%\worktrunk\config.toml
Worktree path template
Controls where new worktrees are created.
Available template variables:
{{ repo_path }}— absolute path to the repository root (e.g.,/Users/me/code/myproject. Or for bare repos, the bare directory itself){{ repo }}— repository directory name (e.g.,myproject){{ owner }}— primary remote owner path (may include subgroups likegroup/subgroup){{ branch }}— raw branch name (e.g.,feature/auth){{ branch | sanitize }}— filesystem-safe:/and\become-(e.g.,feature-auth){{ branch | sanitize_db }}— database-safe: lowercase, underscores, hash suffix (e.g.,feature_auth_x7k)
Examples for repo at ~/code/myproject, branch feature/auth:
Default — sibling directory (~/code/myproject.feature-auth):
worktree-path = "{{ repo_path }}/../{{ repo }}.{{ branch | sanitize }}"
Inside the repository (~/code/myproject/.worktrees/feature-auth):
worktree-path = "{{ repo_path }}/.worktrees/{{ branch | sanitize }}"
Centralized worktrees directory (~/worktrees/myproject/feature-auth):
worktree-path = "~/worktrees/{{ repo }}/{{ branch | sanitize }}"
By remote owner path (~/development/max-sixty/myproject/feature/auth):
worktree-path = "~/development/{{ owner }}/{{ repo }}/{{ branch }}"
Bare repository (~/code/myproject/feature-auth):
worktree-path = "{{ repo_path }}/../{{ branch | sanitize }}"
~ expands to the home directory. Relative paths resolve from repo_path.
LLM commit messages
Generate commit messages automatically during merge. Requires an external CLI tool.
Claude Code
[commit.generation]
command = "CLAUDECODE= MAX_THINKING_TOKENS=0 claude -p --no-session-persistence --model=haiku --tools='' --disable-slash-commands --setting-sources='' --system-prompt=''"Codex
[commit.generation]
command = "codex exec -m gpt-5.1-codex-mini -c model_reasoning_effort='low' -c system_prompt='' --sandbox=read-only --json - | jq -sr '[.[] | select(.item.type? == \"agent_message\")] | last.item.text'"OpenCode
[commit.generation]
command = "opencode run -m anthropic/claude-haiku-4.5 --variant fast"llm
[commit.generation]
command = "llm -m claude-haiku-4.5"aichat
[commit.generation]
command = "aichat -m claude:claude-haiku-4.5"
See LLM commits docs for setup and Custom prompt templates for template customization.
Command config
List
Persistent flag values for wt list. Override on command line as needed.
[list]
summary = false # Enable LLM branch summaries (requires [commit.generation])
full = false # Show CI, main…± diffstat, and LLM summaries (--full)
branches = false # Include branches without worktrees (--branches)
remotes = false # Include remote-only branches (--remotes)
task-timeout-ms = 0 # Kill individual git commands after N ms; 0 disables
timeout-ms = 0 # Wall-clock budget for the entire collect phase; 0 disablesCommit
Shared by wt step commit, wt step squash, and wt merge.
[commit]
stage = "all" # What to stage before commit: "all", "tracked", or "none"Merge
Most flags are on by default. Set to false to change default behavior.
[merge]
squash = true # Squash commits into one (--no-squash to preserve history)
commit = true # Commit uncommitted changes first (--no-commit to skip)
rebase = true # Rebase onto target before merge (--no-rebase to skip)
remove = true # Remove worktree after merge (--no-remove to keep)
verify = true # Run project hooks (--no-hooks to skip)
ff = true # Fast-forward merge (--no-ff to create a merge commit instead)Switch
[switch]
cd = true # Change directory after switching (--no-cd to skip)
[switch.picker]
pager = "delta --paging=never" # Example: override git's core.pager for diff previewStep
[step.copy-ignored]
exclude = [] # Additional excludes (e.g., [".cache/", ".turbo/"])
Built-in excludes always apply: VCS metadata directories (.bzr/, .hg/, .jj/, .pijul/, .sl/, .svn/) and tool-state directories (.conductor/, .entire/, .pi/, .worktrees/). User config and project config exclusions are combined.
Aliases
Command templates that run as wt <name>. See the Extending Worktrunk guide for usage and flags.
[aliases]
greet = "echo Hello from {{ branch }}"
url = "echo http://localhost:{{ branch | hash_port }}"
Aliases defined here apply to all projects. For project-specific aliases, use the project config [aliases] section instead.
User project-specific settings
For context:
- Project config settings are shared with teammates.
- User configs generally apply to all projects.
- User configs also has a
[projects]table which holds project-specific settings for the user, such as worktree layout and setting overrides. That's what this section covers.
Entries are keyed by project identifier (e.g., github.com/user/repo). Scalar values (like worktree-path) replace the global value; everything else (hooks, aliases, etc.) appends, global first.
[projects."github.com/user/repo"]
worktree-path = ".worktrees/{{ branch | sanitize }}"
list.full = true
merge.squash = false
pre-start.env = "cp .env.example .env"
step.copy-ignored.exclude = [".repo-local-cache/"]
aliases.deploy = "make deploy BRANCH={{ branch }}"Custom prompt templates
Templates use minijinja syntax.
Commit template
Available variables:
{{ git_diff }},{{ git_diff_stat }}— diff content{{ branch }},{{ repo }}— context{{ recent_commits }}— recent commit messages
Default template:
[commit.generation]
template = """
<task>Write a commit message for the staged changes below.</task>
<format>
- Subject line under 50 chars
- For material changes, add a blank line then a body paragraph explaining the change
- Output only the commit message, no quotes or code blocks
</format>
<style>
- Imperative mood: "Add feature" not "Added feature"
- Match recent commit style (conventional commits if used)
- Describe the change, not the intent or benefit
</style>
<diffstat>
{{ git_diff_stat }}
</diffstat>
<diff>
{{ git_diff }}
</diff>
<context>
Branch: {{ branch }}
{% if recent_commits %}<recent_commits>
{% for commit in recent_commits %}- {{ commit }}
{% endfor %}</recent_commits>{% endif %}
</context>
"""
Squash template
Available variables (in addition to commit template variables):
{{ commits }}— list of commits being squashed{{ target_branch }}— merge target branch
Default template:
[commit.generation]
squash-template = """
<task>Write a commit message for the combined effect of these commits.</task>
<format>
- Subject line under 50 chars
- For material changes, add a blank line then a body paragraph explaining the change
- Output only the commit message, no quotes or code blocks
</format>
<style>
- Imperative mood: "Add feature" not "Added feature"
- Match the style of commits being squashed (conventional commits if used)
- Describe the change, not the intent or benefit
</style>
<commits branch="{{ branch }}" target="{{ target_branch }}">
{% for commit in commits %}- {{ commit }}
{% endfor %}</commits>
<diffstat>
{{ git_diff_stat }}
</diffstat>
<diff>
{{ git_diff }}
</diff>
"""
Hooks
See wt hook for hook types, execution order, template variables, and examples. User hooks apply to all projects; project hooks apply only to that repository.
Project Configuration
Project configuration lets teams share repository-specific settings — hooks, dev server URLs, and other defaults. The file lives in .config/wt.toml and is typically checked into version control.
To create a starter file with commented-out examples, run wt config create --project.
Hooks
Project hooks apply to this repository only. See wt hook for hook types, execution order, and examples.
pre-start = "npm ci"
post-start = "npm run dev"
pre-merge = "npm test"Dev server URL
URL column in wt list (dimmed when port not listening):
[list]
url = "http://localhost:{{ branch | hash_port }}"Forge platform override
Override platform detection for SSH aliases or self-hosted instances:
[forge]
platform = "github" # or "gitlab"
hostname = "github.example.com" # Example: API host (GHE / self-hosted GitLab)Copy-ignored excludes
Additional excludes for wt step copy-ignored:
[step.copy-ignored]
exclude = [".cache/", ".turbo/"]
Built-in excludes always apply: VCS metadata directories (.bzr/, .hg/, .jj/, .pijul/, .sl/, .svn/) and tool-state directories (.conductor/, .entire/, .pi/, .worktrees/). User config and project config exclusions are combined.
Aliases
Command templates that run as wt <name>. See the Extending Worktrunk guide for usage and flags.
[aliases]
deploy = "make deploy BRANCH={{ branch }}"
url = "echo http://localhost:{{ branch | hash_port }}"
Aliases defined here are shared with teammates. For personal aliases, use the user config [aliases] section instead.
Shell Integration
Worktrunk needs shell integration to change directories when switching worktrees. Install with:
wt config shell install
For manual setup, see wt config shell init --help.
Without shell integration, wt switch prints the target directory but cannot cd into it.
First-run prompts
On first run without shell integration, Worktrunk offers to install it. Similarly, on first commit without LLM configuration, it offers to configure a detected tool (claude, codex). Declining sets skip-shell-integration-prompt or skip-commit-generation-prompt automatically.
Other
Environment variables
All user config options can be overridden with environment variables using the WORKTRUNK_ prefix.
Naming convention
Config keys use kebab-case (worktree-path), while env vars use SCREAMING_SNAKE_CASE (WORKTRUNK_WORKTREE_PATH). The conversion happens automatically.
For nested config sections, use double underscores to separate levels:
| Config | Environment Variable |
|---|---|
worktree-path | WORKTRUNK_WORKTREE_PATH |
commit.generation.command | WORKTRUNK_COMMIT__GENERATION__COMMAND |
commit.stage | WORKTRUNK_COMMIT__STAGE |
Note the single underscore after WORKTRUNK and double underscores between nested keys.
Example: CI/testing override
Override the LLM command in CI to use a mock:
WORKTRUNK_COMMIT__GENERATION__COMMAND="echo 'test: automated commit'" wt merge
Other environment variables
| Variable | Purpose |
|---|---|
WORKTRUNK_BIN | Override binary path for shell wrappers; useful for testing dev builds |
WORKTRUNK_CONFIG_PATH | Override user config file location |
WORKTRUNK_SYSTEM_CONFIG_PATH | Override system config file location |
WORKTRUNK_PROJECT_CONFIG_PATH | Override project config file location (defaults to .config/wt.toml) |
XDG_CONFIG_DIRS | Colon-separated system config directories (default: /etc/xdg) |
WORKTRUNK_DIRECTIVE_CD_FILE | Internal: set by shell wrappers. wt writes a raw path; the wrapper cds to it |
WORKTRUNK_DIRECTIVE_EXEC_FILE | Internal: set by shell wrappers. wt writes shell commands; the wrapper sources the file |
WORKTRUNK_SHELL | Internal: set by shell wrappers to indicate shell type (e.g., powershell) |
WORKTRUNK_MAX_CONCURRENT_COMMANDS | Max parallel git commands (default: 32). Lower if hitting file descriptor limits. |
NO_COLOR | Disable colored output (standard) |
CLICOLOR_FORCE | Force colored output even when not a TTY |
Command reference
wt config - Manage user & project configs
Includes shell integration, hooks, and saved state.
Usage: wt config [OPTIONS] <COMMAND>
Commands:
shell Shell integration setup
create Create configuration file
show Show configuration files & locations
update Update deprecated config settings
approvals Manage command approvals
alias Inspect and preview aliases
plugins Plugin management
state Manage internal data and cache
Options:
-h, --help
Print help (see a summary with '-h')
Global Options:
-C <path>
Working directory for this command
--config <path>
User config file path
-v, --verbose...
Verbose output (-v: info logs + hook/alias template variable & output; -vv: debug logs +
diagnostic report + trace.log/output.log under .git/wt/logs/)
-y, --yes
Skip approval prompts
Subcommands
wt config show
Show configuration files & locations.
Shows location and contents of user config (~/.config/worktrunk/config.toml)
and project config (.config/wt.toml). Also shows system config if present.
If a config file doesn't exist, shows defaults that would be used.
Full diagnostics
Use --full to run diagnostic checks:
wt config show --full
This tests:
- CI tool status — Whether
gh(GitHub) orglab(GitLab) is installed and authenticated - Commit generation — Whether the LLM command can generate commit messages
- Version check — Whether a newer version is available on GitHub
Command reference
wt config show - Show configuration files & locations
Usage: wt config show [OPTIONS]
Options:
--full
Run diagnostic checks (CI tools, commit generation, version)
-h, --help
Print help (see a summary with '-h')
Output:
--format <FORMAT>
Output format (text, json)
Possible values:
- text: Human-readable text output
- json: JSON output
[default: text]
Global Options:
-C <path>
Working directory for this command
--config <path>
User config file path
-v, --verbose...
Verbose output (-v: info logs + hook/alias template variable & output; -vv: debug logs +
diagnostic report + trace.log/output.log under .git/wt/logs/)
-y, --yes
Skip approval prompts
wt config approvals
Manage command approvals.
Project hooks and project aliases prompt for approval on first run to prevent untrusted projects from running arbitrary commands. Approvals from both flows are stored together.
Examples
Pre-approve all hook and alias commands for current project:
wt config approvals add
Clear approvals for current project:
wt config approvals clear
Clear global approvals:
wt config approvals clear --global
How approvals work
Approved commands are saved to ~/.config/worktrunk/approvals.toml. Re-approval is required when the command template changes or the project moves. Use --yes to bypass prompts in CI.
Command reference
wt config approvals - Manage command approvals
Usage: wt config approvals [OPTIONS] <COMMAND>
Commands:
add Store approvals in approvals.toml
clear Clear approved commands from approvals.toml
Options:
-h, --help
Print help (see a summary with '-h')
Global Options:
-C <path>
Working directory for this command
--config <path>
User config file path
-v, --verbose...
Verbose output (-v: info logs + hook/alias template variable & output; -vv: debug logs +
diagnostic report + trace.log/output.log under .git/wt/logs/)
-y, --yes
Skip approval prompts
wt config alias
Inspect and preview aliases.
Aliases are command templates configured in user (~/.config/worktrunk/config.toml) or project (.config/wt.toml) config and run as wt <name>. See the Extending Worktrunk guide for the configuration format.
Examples
Show the template for deploy:
wt config alias show deploy
Preview an invocation without running it:
wt config alias dry-run deploy
wt config alias dry-run deploy -- --env=staging
Command reference
wt config alias - Inspect and preview aliases
Usage: wt config alias [OPTIONS] <COMMAND>
Commands:
show Show an alias's template as configured
dry-run Preview an alias invocation with template expansion
Options:
-h, --help
Print help (see a summary with '-h')
Global Options:
-C <path>
Working directory for this command
--config <path>
User config file path
-v, --verbose...
Verbose output (-v: info logs + hook/alias template variable & output; -vv: debug logs +
diagnostic report + trace.log/output.log under .git/wt/logs/)
-y, --yes
Skip approval prompts
wt config state
Manage internal data and cache.
State is stored in .git/ (config entries and log files), separate from configuration files.
Keys
- default-branch: The repository's default branch (
main,master, etc.) - previous-branch: Previous branch for
wt switch - - logs: Operation and debug logs
- ci-status: CI/PR status for a branch (passed, running, failed, conflicts, no-ci, error)
- marker: Custom status marker for a branch (shown in
wt list) - vars: Custom variables per branch
Examples
Get the default branch:
wt config state default-branch
Set the default branch manually:
wt config state default-branch set main
Set a marker for current branch:
wt config state marker set 🚧
Store arbitrary data:
wt config state vars set env=staging
Clear all CI status cache:
wt config state ci-status clear --all
Show all stored state:
wt config state get
Clear all stored state:
wt config state clear
Command reference
wt config state - Manage internal data and cache
Usage: wt config state [OPTIONS] <COMMAND>
Commands:
get Get all stored state
clear Clear all stored state
default-branch Default branch detection and override
previous-branch Previous branch (for wt switch -)
logs Operation and debug logs
hints One-time hints shown in this repo
ci-status CI status cache
marker Branch markers
vars [experimental] Custom variables per branch
Options:
-h, --help
Print help (see a summary with '-h')
Global Options:
-C <path>
Working directory for this command
--config <path>
User config file path
-v, --verbose...
Verbose output (-v: info logs + hook/alias template variable & output; -vv: debug logs +
diagnostic report + trace.log/output.log under .git/wt/logs/)
-y, --yes
Skip approval prompts
wt config state default-branch
Default branch detection and override.
Useful in scripts to avoid hardcoding main or master:
git rebase $(wt config state default-branch)
Without a subcommand, runs get. Use set to override, or clear then get to re-detect.
Detection
Worktrunk detects the default branch automatically:
- Worktrunk cache — Checks
git config worktrunk.default-branch - Git cache — Detects primary remote and checks its HEAD (e.g.,
origin/HEAD) - Remote query — If not cached, queries
git ls-remote— typically 100ms–2s - Local inference — If no remote, infers from local branches
Once detected, the result is cached in worktrunk.default-branch for fast access.
The local inference fallback uses these heuristics in order:
- If only one local branch exists, uses it
- For bare repos or empty repos, checks
symbolic-ref HEAD - Checks
git config init.defaultBranch - Looks for common names:
main,master,develop,trunk
Command reference
wt config state default-branch - Default branch detection and override
Usage: wt config state default-branch [OPTIONS] [COMMAND]
Commands:
get Get the default branch
set Set the default branch
clear Clear the default branch cache
Options:
-h, --help
Print help (see a summary with '-h')
Global Options:
-C <path>
Working directory for this command
--config <path>
User config file path
-v, --verbose...
Verbose output (-v: info logs + hook/alias template variable & output; -vv: debug logs +
diagnostic report + trace.log/output.log under .git/wt/logs/)
-y, --yes
Skip approval prompts
wt config state logs
Operation and debug logs.
View and manage log files — hook output, command audit trail, and debug diagnostics.
What's logged
Three kinds of logs live in .git/wt/logs/:
Command log (commands.jsonl)
All hook executions and LLM commands are recorded automatically — one JSON object per line. Rotates to commands.jsonl.old at 1MB (~2MB total). Fields:
| Field | Description |
|---|---|
ts | ISO 8601 timestamp |
wt | The wt command that triggered this (e.g., wt hook pre-merge --yes) |
label | What ran (e.g., pre-merge user:lint, commit.generation) |
cmd | Shell command executed |
exit | Exit code (null for background commands) |
dur_ms | Duration in milliseconds (null for background commands) |
The command log appends entries and is not branch-specific — it records all activity across all worktrees.
Hook output logs
Hook output lives in per-branch subtrees under .git/wt/logs/{branch}/:
| Operation | Log path |
|---|---|
| Background hooks | {branch}/{source}/{hook-type}/{name}.log |
| Background removal | {branch}/internal/remove.log |
All post-* hooks (post-start, post-switch, post-commit, post-merge) run in the background and produce log files. Source is user or project. Branch and hook names are sanitized for filesystem safety (invalid characters → -; short collision-avoidance hash appended). Same operation on same branch overwrites the previous log. Removing a branch clears its subtree; orphans from deleted branches can be swept with wt config state logs clear.
Diagnostic files
| File | Created when |
|---|---|
trace.log | Running with -vv |
output.log | Running with -vv |
diagnostic.md | Running with -vv when warnings occur |
trace.log mirrors stderr (commands, [wt-trace] records, bounded subprocess previews). output.log holds the raw uncapped subprocess stdout/stderr bodies. Both are overwritten on each -vv run. diagnostic.md is a markdown report for pasting into GitHub issues — written only when warnings occur, and inlines trace.log (never output.log, which can be multi-MB).
Location
All logs are stored in .git/wt/logs/ (in the main worktree's git directory). All worktrees write to the same directory. Top-level files are shared logs (command audit + diagnostics); top-level directories are per-branch log trees.
Structured output
wt config state logs --format=json emits three arrays — command_log, hook_output, diagnostic. Each entry carries a file (relative), path (absolute), size, and modified_at (unix seconds). Hook-output entries additionally expose branch, source (user / project / internal), hook_type (the post-* kind, or null for internal ops), and name. Filter with jq to pick out a specific entry.
Examples
List all log files:
wt config state logs
Query the command log:
tail -5 .git/wt/logs/commands.jsonl | jq .
Path to one hook log (e.g. the post-start server hook for the current branch):
wt config state logs --format=json | jq -r '.hook_output[] | select(.source == "user" and .hook_type == "post-start" and (.name | startswith("server"))) | .path'
Logs for a specific branch:
wt config state logs --format=json | jq '.hook_output[] | select(.branch | startswith("feature"))'
Clear all logs:
wt config state logs clear
Command reference
wt config state logs - Operation and debug logs
Usage: wt config state logs [OPTIONS] [COMMAND]
Commands:
get List all log file paths
clear Clear all log files
Options:
-h, --help
Print help (see a summary with '-h')
Output:
--format <FORMAT>
Output format (text, json) [default: text]
Global Options:
-C <path>
Working directory for this command
--config <path>
User config file path
-v, --verbose...
Verbose output (-v: info logs + hook/alias template variable & output; -vv: debug logs +
diagnostic report + trace.log/output.log under .git/wt/logs/)
-y, --yes
Skip approval prompts
wt config state ci-status
CI status cache.
Caches GitHub/GitLab CI status for display in wt list.
Requires gh (GitHub) or glab (GitLab) CLI, authenticated. Platform auto-detects from remote URL; override with forge.platform = "github" in .config/wt.toml for SSH host aliases or self-hosted instances. For GitHub Enterprise or self-hosted GitLab, also set forge.hostname.
Checks open PRs/MRs first, then branch pipelines for branches with upstream. Local-only branches (no remote tracking) show blank.
Results cache for 30-60 seconds. Indicators dim when local changes haven't been pushed.
Status values
| Status | Meaning |
|---|---|
passed | All checks passed |
running | Checks in progress |
failed | Checks failed |
conflicts | PR has merge conflicts |
no-ci | No checks configured |
error | Fetch error (rate limit, network, auth) |
See wt list CI status for display symbols and colors.
Without a subcommand, runs get for the current branch. Use clear to reset cache for a branch or clear --all to reset all.
Command reference
wt config state ci-status - CI status cache
Usage: wt config state ci-status [OPTIONS] [COMMAND]
Commands:
get Get CI status for a branch
clear Clear CI status cache
Options:
-h, --help
Print help (see a summary with '-h')
Output:
--format <FORMAT>
Output format (text, json) [default: text]
Global Options:
-C <path>
Working directory for this command
--config <path>
User config file path
-v, --verbose...
Verbose output (-v: info logs + hook/alias template variable & output; -vv: debug logs +
diagnostic report + trace.log/output.log under .git/wt/logs/)
-y, --yes
Skip approval prompts
wt config state marker
Branch markers.
Custom status text or emoji shown in the wt list Status column.
Display
Markers appear at the end of the Status column, after git symbols:
wt list
Branch Status HEAD± main↕ Remote⇅ Commit Age Message
@ main ^⇡ ⇡1 33323bc1 1d Initial commit
+ feature-api ↑ 🤖 ↑1 70343f03 1d Add REST API endpoints
+ review-ui ? ↑ 💬 ↑1 a585d6ed 1d Add dashboard component
+ wip-docs ? – 33323bc1 1d Initial commit
○ Showing 4 worktrees, 2 with changes, 2 ahead, 1 column hidden
Use cases
- Work status —
🚧WIP,✅ready for review,🔥urgent - Agent tracking — The Claude Code plugin sets markers automatically
- Notes — Any short text:
"blocked","needs tests"
Storage
Stored in git config as worktrunk.state.<branch>.marker. Set directly with:
git config worktrunk.state.feature.marker '{"marker":"🚧","set_at":0}'
Without a subcommand, runs get for the current branch. For --branch, use get --branch=NAME.
Command reference
wt config state marker - Branch markers
Usage: wt config state marker [OPTIONS] [COMMAND]
Commands:
get Get marker for a branch
set Set marker for a branch
clear Clear marker for a branch
Options:
-h, --help
Print help (see a summary with '-h')
Output:
--format <FORMAT>
Output format (text, json) [default: text]
Global Options:
-C <path>
Working directory for this command
--config <path>
User config file path
-v, --verbose...
Verbose output (-v: info logs + hook/alias template variable & output; -vv: debug logs +
diagnostic report + trace.log/output.log under .git/wt/logs/)
-y, --yes
Skip approval prompts
wt config state vars
Custom variables per branch.
Store custom variables per branch. Values are stored as-is — plain strings or JSON.
Examples
Set and get values:
wt config state vars set env=staging
wt config state vars get env
Store JSON:
wt config state vars set config='{"port": 3000, "debug": true}'
List all keys:
wt config state vars list
Operate on a different branch:
wt config state vars set env=production --branch=main
Template access
Variables are available in hook templates as {{ vars.<key> }}. Use the default filter for keys that may not be set:
[post-start]
dev = "ENV={{ vars.env | default('development') }} npm start -- --port {{ vars.port | default('3000') }}"
JSON object and array values support dot access:
wt config state vars set config='{"port": 3000, "debug": true}'
[post-start]
dev = "npm start -- --port {{ vars.config.port }}"Storage format
Stored in git config as worktrunk.state.<branch>.vars.<key>. Keys must contain only letters, digits and hyphens — dots conflict with git config's section separator, underscores with its variable name format.
Command reference
wt config state vars - [experimental] Custom variables per branch
Usage: wt config state vars [OPTIONS] <COMMAND>
Commands:
get Get a value
list List all keys
set Set a value
clear Clear a key or all keys
Options:
-h, --help
Print help (see a summary with '-h')
Global Options:
-C <path>
Working directory for this command
--config <path>
User config file path
-v, --verbose...
Verbose output (-v: info logs + hook/alias template variable & output; -vv: debug logs +
diagnostic report + trace.log/output.log under .git/wt/logs/)
-y, --yes
Skip approval prompts