dependabot[bot] fcb9b63bdb chore: bump jsonschema from 0.50.0 to 0.52.0 (#3967)
Bumps [jsonschema](https://github.com/Stranger6667/jsonschema) from
0.50.0 to 0.52.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/Stranger6667/jsonschema/releases">jsonschema's
releases</a>.</em></p>
<blockquote>
<h2>[CLI] Release 0.52.0</h2>
<p>No release notes provided.</p>
<h2>[Python] Release 0.52.0</h2>
<h3>Added</h3>
<ul>
<li>The <code>offline</code> argument, refusing to fetch references
outside <code>registry</code>.</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Canonicalization not idempotent where a
<code>patternProperties</code> <code>$ref</code> matches a key
<code>properties</code> names.</li>
<li>Type stubs omitting
<code>ValidationError.absolute_keyword_location</code>.</li>
<li>The <code>draft</code> argument and the
<code>Draft201909Validator</code> / <code>Draft202012Validator</code>
classes gating keywords on the vocabularies of the <code>$schema</code>
they override, so the validator accepted every instance.</li>
<li><code>is_valid</code> disagreeing with <code>validate</code>,
<code>iter_errors</code>, and <code>evaluate</code> on a schema that
reaches its own <code>$ref</code> twice, one of them under
<code>not</code>.</li>
</ul>
<h2>[Ruby] Release 0.52.0</h2>
<h3>Added</h3>
<ul>
<li>The <code>offline:</code> keyword argument, refusing to fetch
references outside <code>registry:</code>.</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Canonicalization not idempotent where a
<code>patternProperties</code> <code>$ref</code> matches a key
<code>properties</code> names.</li>
<li>The <code>draft:</code> keyword argument and the
<code>Draft201909Validator</code> / <code>Draft202012Validator</code>
classes gating keywords on the vocabularies of the <code>$schema</code>
they override, so the validator accepted every instance.</li>
<li><code>valid?</code> disagreeing with <code>validate!</code>,
<code>each_error</code>, and <code>evaluate</code> on a schema that
reaches its own <code>$ref</code> twice, one of them under
<code>not</code>.</li>
</ul>
<h2>[Rust] Release 0.52.0</h2>
<h3>Added</h3>
<ul>
<li><code>Evaluation::is_valid</code>.</li>
<li><code>Location::is_empty</code>.</li>
<li><code>Display</code> for <code>ErrorEntry</code>.</li>
<li><code>ValidationOptions::offline</code> and
<code>canonical::CanonicalizeOptions::offline</code>, refusing to fetch
references outside the registry.</li>
<li><code>idna</code> Cargo feature, enabled by default, gating the
<code>idn-hostname</code> and <code>idn-email</code> formats. <a
href="https://redirect.github.com/Stranger6667/jsonschema/issues/1313">#1313</a></li>
<li><strong>CLI</strong>: the <code>--offline</code> flag of
<code>jsonschema validate</code>, <code>jsonschema bundle</code> and
<code>jsonschema dereference</code>.</li>
</ul>
<h3>Changed</h3>
<ul>
<li><code>ValidationErrors</code>' <code>Display</code> gained the
instance path of each error.</li>
<li><strong>BREAKING</strong>: With <code>default-features =
false</code>, the <code>idn-hostname</code> and <code>idn-email</code>
formats now require the new <code>idna</code> feature. Without it they
are unknown formats, which are accepted by default, or rejected at build
time under <code>should_ignore_unknown_formats(false)</code>. Add
<code>idna</code> to the feature list to keep the previous
behavior.</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Canonicalization not idempotent where a
<code>patternProperties</code> <code>$ref</code> matches a key
<code>properties</code> names.</li>
<li><code>is_valid</code> disagreeing with <code>validate</code>,
<code>iter_errors</code>, and <code>evaluate</code> on a schema that
reaches its own <code>$ref</code> twice, one of them under
<code>not</code>.</li>
<li><code>format: email</code> and <code>format: idn-email</code>
rejecting an empty quoted string as the local part (it should be
accepted).</li>
<li><code>format: email</code> and <code>format: idn-email</code>
rejecting an address literal whose <code>IPv6:</code> tag is not written
in that exact case (the tag is case-insensitive).</li>
<li><code>format: email</code> accepting a non-ASCII character in the
local part (it should be rejected).</li>
<li><code>ValidationOptions::with_draft</code> gating keywords on the
vocabularies of the <code>$schema</code> it overrides, so the validator
accepted every instance.</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/Stranger6667/jsonschema/blob/master/CHANGELOG.md">jsonschema's
changelog</a>.</em></p>
<blockquote>
<h2>[0.52.0] - 2026-08-26</h2>
<h3>Added</h3>
<ul>
<li><code>Evaluation::is_valid</code>.</li>
<li><code>Location::is_empty</code>.</li>
<li><code>Display</code> for <code>ErrorEntry</code>.</li>
<li><code>ValidationOptions::offline</code> and
<code>canonical::CanonicalizeOptions::offline</code>, refusing to fetch
references outside the registry.</li>
<li><code>idna</code> Cargo feature, enabled by default, gating the
<code>idn-hostname</code> and <code>idn-email</code> formats. <a
href="https://redirect.github.com/Stranger6667/jsonschema/issues/1313">#1313</a></li>
<li><strong>CLI</strong>: the <code>--offline</code> flag of
<code>jsonschema validate</code>, <code>jsonschema bundle</code> and
<code>jsonschema dereference</code>.</li>
</ul>
<h3>Changed</h3>
<ul>
<li><code>ValidationErrors</code>' <code>Display</code> gained the
instance path of each error.</li>
<li><strong>BREAKING</strong>: With <code>default-features =
false</code>, the <code>idn-hostname</code> and <code>idn-email</code>
formats now require the new <code>idna</code> feature. Without it they
are unknown formats, which are accepted by default, or rejected at build
time under <code>should_ignore_unknown_formats(false)</code>. Add
<code>idna</code> to the feature list to keep the previous
behavior.</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Canonicalization not idempotent where a
<code>patternProperties</code> <code>$ref</code> matches a key
<code>properties</code> names.</li>
<li><code>is_valid</code> disagreeing with <code>validate</code>,
<code>iter_errors</code>, and <code>evaluate</code> on a schema that
reaches its own <code>$ref</code> twice, one of them under
<code>not</code>.</li>
<li><code>format: email</code> and <code>format: idn-email</code>
rejecting an empty quoted string as the local part (it should be
accepted).</li>
<li><code>format: email</code> and <code>format: idn-email</code>
rejecting an address literal whose <code>IPv6:</code> tag is not written
in that exact case (the tag is case-insensitive).</li>
<li><code>format: email</code> accepting a non-ASCII character in the
local part (it should be rejected).</li>
<li><code>ValidationOptions::with_draft</code> gating keywords on the
vocabularies of the <code>$schema</code> it overrides, so the validator
accepted every instance.</li>
</ul>
<h3>Performance</h3>
<ul>
<li><code>iter_errors</code> collects into a single buffer instead of
allocating and re-boxing an iterator at every schema node.</li>
</ul>
<h2>[0.51.0] - 2026-08-23</h2>
<h3>Added</h3>
<ul>
<li><code>ValidationOptions::with_vocabulary</code> and the
<code>vocabularies</code> attribute on
<code>jsonschema::validator</code>, declaring support for a vocabulary
this crate does not implement.</li>
<li>The <code>--vocabulary</code> flag of <code>jsonschema
validate</code>.</li>
</ul>
<h3>Changed</h3>
<ul>
<li><code>Vocabulary</code> gained the <code>FormatAssertion</code>
variant, which its Draft 2020-12 URI parses to instead of
<code>Vocabulary::Custom</code>, and is marked
<code>non_exhaustive</code>.</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>The <code>uniqueItems</code> length ceiling not reading an
<code>items</code> or <code>contains</code> schema written as a
<code>$ref</code>.</li>
<li>The Draft 2020-12 Format-Assertion vocabulary read as an annotation,
so a meta-schema requiring it accepted values its <code>format</code>
rejects.</li>
<li>An unrecognized <code>format</code> accepted under a meta-schema
requiring the Format-Assertion vocabulary (it should be rejected).</li>
<li>A meta-schema requiring a vocabulary this crate does not implement
accepted (it should be rejected).</li>
<li>The Draft 2019-09 Format vocabulary declared <code>true</code> read
as an annotation, so a meta-schema requiring it accepted values its
<code>format</code> rejects.</li>
<li>The bundled
<code>https://json-schema.org/draft/2020-12/meta/format-assertion</code>
meta-schema not declaring its vocabulary, so a schema written against it
annotated <code>format</code> instead of asserting it.</li>
<li>A meta-schema without <code>$id</code> keeping its
<code>$vocabulary</code> unread, so a schema written against it got
every Draft 2020-12 vocabulary.</li>
<li>A schema naming a bundled vocabulary meta-schema as its
<code>$schema</code> rejected as an unknown meta-schema (it should
build).</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/Stranger6667/jsonschema/commit/edeb4f2af95ddcf632dd8349de72cab04e48ae68"><code>edeb4f2</code></a>
chore(ruby): Release 0.52.0</li>
<li><a
href="https://github.com/Stranger6667/jsonschema/commit/c3080258c8de7339188a3246c5c25792611411bc"><code>c308025</code></a>
chore(rust): Release 0.52.0</li>
<li><a
href="https://github.com/Stranger6667/jsonschema/commit/7d8465cf8bb0ab4479eb370535a739639e6b1cca"><code>7d8465c</code></a>
feat(cli): the <code>--offline</code> flag of <code>jsonschema
validate</code>, <code>jsonschema bundle</code>...</li>
<li><a
href="https://github.com/Stranger6667/jsonschema/commit/5015aa66ef5fbe7bfb038e8498d7d0f16bc0365d"><code>5015aa6</code></a>
docs: Update docs</li>
<li><a
href="https://github.com/Stranger6667/jsonschema/commit/84048dd0d4e6196987bdbcd944b59601e1637375"><code>84048dd</code></a>
fix: <code>is_valid</code> disagreeing with <code>validate</code>,
<code>iter_errors</code>, and <code>evaluate</code> on...</li>
<li><a
href="https://github.com/Stranger6667/jsonschema/commit/610aa6bec667262b04a2dfb39e9f0d261d061436"><code>610aa6b</code></a>
fix(python): Type stubs omitting
<code>ValidationError.absolute_keyword_location</code></li>
<li><a
href="https://github.com/Stranger6667/jsonschema/commit/63b8dfaac2873ea8be7918e82a8a7e82aa8f280a"><code>63b8dfa</code></a>
fix: <code>ValidationOptions::with_draft</code> gating keywords on the
vocabularies of t...</li>
<li><a
href="https://github.com/Stranger6667/jsonschema/commit/8fc6ff7335df31a7830c709a5a76a9c8ad33d829"><code>8fc6ff7</code></a>
fix: Canonicalization not idempotent where a
<code>patternProperties</code> <code>$ref</code> match...</li>
<li><a
href="https://github.com/Stranger6667/jsonschema/commit/7368dcf1a62a311b85008dd861b80c0ffd6751a3"><code>7368dcf</code></a>
test: Generate random json schemas with hegel</li>
<li><a
href="https://github.com/Stranger6667/jsonschema/commit/e6e8b8d8882f7f58c785b9bd7d4562ea2d02b1dc"><code>e6e8b8d</code></a>
fix: Misc <code>email</code> format fixes</li>
<li>Additional commits viewable in <a
href="https://github.com/Stranger6667/jsonschema/compare/cli-v0.50.0...cli-v0.52.0">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=jsonschema&package-manager=cargo&previous-version=0.50.0&new-version=0.52.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-09-01 06:02:56 -07:00

Worktrunk logo  Worktrunk

Docs License: MIT OR Apache-2.0 CI Codecov Stars maintained with tend

September 2026: Worktrunk was released at the start of the year, and has quickly become the most popular git worktree manager. It's built with love (there's no slop!). Please let me know any frictions at all; I'm intensely focused on continuing to make Worktrunk excellent, and the biggest help is folks posting problems they perceive.

Worktrunk is a CLI for git worktree management, designed for running AI agents in parallel.

Worktrunk's three core commands make worktrees as easy as branches. Plus, Worktrunk has a bunch of quality-of-life features to simplify working with many parallel changes, including hooks to automate local workflows.

A quick demo:

Worktrunk Demo

📚 Full documentation at worktrunk.dev 📚

Context: git worktrees

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 on each other's changes.

But the git worktree UX is clunky. Even a task as small as starting a new worktree requires typing the branch name three times: git worktree add -b feat ../repo.feat, then cd ../repo.feat.

Worktrunk makes git worktrees as easy as branches

Worktrees are addressed by branch name; paths are computed from a configurable template. Commands that take a branch also accept the path of the worktree it is checked out in.

Start with the core commands

Core commands:

Task Worktrunk Plain git
Switch worktrees wt switch feat cd ../repo.feat
Create + start Claude wt switch -c -x claude feat
git worktree add -b feat ../repo.feat && \
cd ../repo.feat && \
claude
Clean up wt remove
cd ../repo && \
git worktree remove ../repo.feat && \
git branch -d feat
List with status wt list git worktree list (paths only)

Expand into the more advanced commands as needed

Workflow automation:

Multiple parallel agents, same simple commands:

Worktrunk omnibus demo: multiple Claude agents in Zellij tabs with hooks, LLM commits, and merge workflow

Install

Homebrew (macOS & Linux):

brew install worktrunk && wt config shell install

Shell integration allows commands to change directories.

Cargo:

cargo install worktrunk && wt config shell install
Windows & other

Windows. wt defaults to Windows Terminal's command, so Winget additionally installs Worktrunk as git-wt to avoid the conflict:

winget install max-sixty.worktrunk
git-wt config shell install

Alternatively, disable Windows Terminal's alias (Settings → Apps → Advanced app settings → App execution aliases → "Terminal"/"Terminal Preview") to use wt directly.

Free code signing provided by SignPath.io, certificate by SignPath Foundationpolicy.

Arch Linux:

sudo pacman -S worktrunk && wt config shell install

Conda / Pixi (community-maintained feedstock):

conda install -c conda-forge worktrunk && wt config shell install

Or with Pixi: pixi global install worktrunk && wt config shell install.

Quick start

Create a worktree for a new feature:

$ wt switch --create feature-auth
✓ Created branch feature-auth from main and worktree @ ~/repo.feature-auth

This creates a new branch and worktree, then switches to it. Do your work, then check all worktrees with wt list:

$ wt list
  Branch        Status        HEAD±    main↕     main…±  Remote⇅  Commit   Age   Message
@ feature-auth  +   ↑      +27   -8   ↑1       +31                4bc72dc  2h    Add authenticati…
^ main              ^⇡                                    ⇡1      0e631ad  1d    Initial commit

○ Showing 2 worktrees, 1 with changes, 1 ahead, 1 column hidden

The @ marks the current worktree. + means staged changes, ↑1 means 1 commit ahead of main, means unpushed commits.

When done, either:

PR workflow — commit, push, open a PR, merge via GitHub/GitLab, then clean up:

wt step commit                    # commit staged changes
gh pr create                      # or glab mr create
wt remove                         # after PR is merged

Local merge — squash, rebase onto main, fast-forward merge, clean up:

$ wt merge main
◎ Generating commit message and committing changes... (2 files, +53, no squashing needed)
  Add authentication module
✓ Committed changes @ a1b2c3d
◎ Merging 1 commit to main @ a1b2c3d (no rebase needed)
  * a1b2c3d Add authentication module
   auth.rs | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++
   lib.rs  |  2 ++
   2 files changed, 53 insertions(+)
✓ Merged to main (1 commit, 2 files, +53)
◎ Removing feature-auth worktree & branch in background (same commit as main, _)
○ Switched to worktree for main @ ~/repo

For parallel agents, create multiple worktrees and launch an agent in each:

wt switch -x claude -c feature-a -- 'Add user authentication'
wt switch -x claude -c feature-b -- 'Fix the pagination bug'
wt switch -x claude -c feature-c -- 'Write tests for the API'

The -x flag runs a command after switching; arguments after -- are passed to it. Configure post-start hooks to automate setup (install deps, start dev servers).

Next steps

Further reading

Contributing

📚 Full documentation at worktrunk.dev 📚

Star history

Star History Chart
S
Description
Guidance for Worktrunk (the wt CLI) — git worktree management, hooks, and config. Load when working out which worktree a wt command will act on, or…
Readme MIT 78 MiB
Languages
Rust 99.5%
Shell 0.2%
Nix 0.1%