Files
dependabot[bot] 4f70286fb2 chore: bump jsonschema from 0.53.0 to 0.56.0 (#4096)
Bumps [jsonschema](https://github.com/Stranger6667/jsonschema) from
0.53.0 to 0.56.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>[Python] Release 0.56.0</h2>
<h3>Added</h3>
<ul>
<li><code>canonical.RawReason</code>, what stopped a run from modeling a
document, and <code>RawView.reason</code> and
<code>RawView.pointer</code>, carrying it beside the subschema the run
stopped on.</li>
</ul>
<h3>Changed</h3>
<ul>
<li>Canonicalization of a <code>oneOf</code> whose branches share a
region too wide to expand, which spent the document's whole intersection
allowance on that choice and kept the document <code>Raw</code>.</li>
</ul>
<h3>Performance</h3>
<ul>
<li>Preparing or building a schema that names no base URI parses the
default one once for the process instead of once per schema.</li>
<li>Canonicalization reads the facets no checker covers once per node
instead of once per containment query.</li>
</ul>
<h2>[Ruby] Release 0.56.0</h2>
<h3>Added</h3>
<ul>
<li><code>JSONSchema::Canonical::RawReason</code>, what stopped a run
from modeling a document, and <code>RawView#reason</code> and
<code>RawView#pointer</code>, carrying it beside the subschema the run
stopped on.</li>
</ul>
<h3>Changed</h3>
<ul>
<li>Canonicalization of a <code>oneOf</code> whose branches share a
region too wide to expand, which spent the document's whole intersection
allowance on that choice and kept the document <code>Raw</code>.</li>
</ul>
<h3>Performance</h3>
<ul>
<li>Preparing or building a schema that names no base URI parses the
default one once for the process instead of once per schema.</li>
<li>Canonicalization reads the facets no checker covers once per node
instead of once per containment query.</li>
</ul>
<h2>[Rust] Release 0.56.0</h2>
<h3>Added</h3>
<ul>
<li><code>canonical::RawReason</code>, what stopped a run from modeling
a document, and <code>canonical::RawView</code>, carrying it beside the
document and a pointer to the subschema the run stopped on.</li>
<li><code>ValidationOptions::is_known_format</code>, whether a
<code>format</code> of that name is checked under a draft.</li>
</ul>
<h3>Changed</h3>
<ul>
<li><strong>BREAKING</strong>:
<code>canonical::CanonicalView::Raw</code> carries a
<code>canonical::RawView</code> in place of the document alone.</li>
<li>Canonicalization of a <code>oneOf</code> whose branches share a
region too wide to expand, which spent the document's whole intersection
allowance on that choice and kept the document <code>Raw</code>.</li>
</ul>
<h3>Performance</h3>
<ul>
<li>Preparing or building a schema that names no base URI parses the
default one once for the process instead of once per schema.</li>
<li>Canonicalizing several subschemas of one prepared document compiles
each pattern once for the document instead of once per call.</li>
<li>Canonicalization reads the facets no checker covers once per node
instead of once per containment query.</li>
</ul>
<h2>[Python] Release 0.55.1</h2>
<h3>Changed</h3>
<ul>
<li>Canonicalization of an <code>anyOf</code> over an <code>allOf</code>
through a <code>$ref</code> to a union, which left that union nested
inside the outer one.</li>
<li>Canonicalization of an <code>anyOf</code> whose branch narrowing
runs out of intersections, which left <code>true</code> as a branch
inside the union.</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.56.0] - 2026-09-10</h2>
<h3>Added</h3>
<ul>
<li><code>canonical::RawReason</code>, what stopped a run from modeling
a document, and <code>canonical::RawView</code>, carrying it beside the
document and a pointer to the subschema the run stopped on.</li>
<li><code>ValidationOptions::is_known_format</code>, whether a
<code>format</code> of that name is checked under a draft.</li>
</ul>
<h3>Changed</h3>
<ul>
<li><strong>BREAKING</strong>:
<code>canonical::CanonicalView::Raw</code> carries a
<code>canonical::RawView</code> in place of the document alone.</li>
<li>Canonicalization of a <code>oneOf</code> whose branches share a
region too wide to expand, which spent the document's whole intersection
allowance on that choice and kept the document <code>Raw</code>.</li>
</ul>
<h3>Performance</h3>
<ul>
<li>Preparing or building a schema that names no base URI parses the
default one once for the process instead of once per schema.</li>
<li>Canonicalizing several subschemas of one prepared document compiles
each pattern once for the document instead of once per call.</li>
<li>Canonicalization reads the facets no checker covers once per node
instead of once per containment query.</li>
</ul>
<h2>[0.55.1] - 2026-09-08</h2>
<h3>Changed</h3>
<ul>
<li>Canonicalization of an <code>anyOf</code> over an <code>allOf</code>
through a <code>$ref</code> to a union, which left that union nested
inside the outer one.</li>
<li>Canonicalization of an <code>anyOf</code> whose branch narrowing
runs out of intersections, which left <code>true</code> as a branch
inside the union.</li>
</ul>
<h2>[0.55.0] - 2026-09-06</h2>
<h3>Changed</h3>
<ul>
<li><strong>BREAKING</strong>:
<code>canonical::ObjectViolationView</code> gained the
<code>PatternValueFails</code> variant, which negation records for a
<code>patternProperties</code> entry.</li>
<li>Canonicalization of <code>not</code> over
<code>patternProperties</code>, which kept the entry under
<code>not</code> instead of recording the demand a key breaks.</li>
<li>Canonicalization of <code>unevaluated*</code> beside a conditional
reaching no key or index the node already evaluates, which spent a case
on it.</li>
<li>Canonicalization of a conditional split outgrowing its per-node case
budget, which kept documents like the Open API 3.2 meta-schema
<code>Raw</code>.</li>
<li>Canonicalization of an <code>anyOf</code> over objects sharing a
<code>properties</code> key under <code>patternProperties</code>, which
settled only on a second pass.</li>
<li>Canonicalization of <code>not</code> over an <code>allOf</code>
folded through a reference, which settled only on a second pass.</li>
<li>Canonicalization of a <code>multipleOf</code> divisor past
<code>f64</code> precision, which was not taken to divide itself.</li>
<li>Canonicalization of an <code>anyOf</code> over a value beside a
window pinned to it, which settled only on a second pass.</li>
<li>Canonicalization of <code>minProperties: 1</code> beside a
<code>not</code> that already demands a key, which settled only on a
second pass.</li>
</ul>
<h3>Fixed</h3>
<ul>
<li><code>absolute_keyword_location</code> naming the sibling keyword
whose validator carries the check: <code>maxLength</code> beside
<code>minLength</code>, <code>minItems</code>, <code>maxItems</code> or
<code>type</code> beside <code>items</code>, and a two-name
<code>required</code> beside <code>properties</code>. <a
href="https://redirect.github.com/Stranger6667/jsonschema/issues/1579">#1579</a></li>
<li><code>schemaLocation</code> in <code>evaluate</code> output naming
<code>minLength</code> for a <code>maxLength</code> failure. <a
href="https://redirect.github.com/Stranger6667/jsonschema/issues/1579">#1579</a></li>
</ul>
<h2>[0.54.0] - 2026-09-06</h2>
<h3>Added</h3>
<ul>
<li><code>backend = SerdeJson</code> on
<code>#[jsonschema::validator]</code>, generating a validator that reads
<code>serde_json::Value</code>.</li>
<li><code>PreparedDocument::unsatisfiable_pointers</code>, listing every
subschema no value satisfies.</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/Stranger6667/jsonschema/commit/c5ce51d883f25bcd0b35ee245f88c19f9871bd9d"><code>c5ce51d</code></a>
chore(ruby): Release 0.56.0</li>
<li><a
href="https://github.com/Stranger6667/jsonschema/commit/1e244c994dd81a1feb7801556a813c6bf2d45dad"><code>1e244c9</code></a>
chore(rust): Release 0.56.0</li>
<li><a
href="https://github.com/Stranger6667/jsonschema/commit/507d66a153dcbde9c4956a27042308dfff71b295"><code>507d66a</code></a>
build: Switch to weekly dependabot</li>
<li><a
href="https://github.com/Stranger6667/jsonschema/commit/776294298fd9a280478fb905098cc0afa0432136"><code>7762942</code></a>
build: Increase timeout for s390x test job</li>
<li><a
href="https://github.com/Stranger6667/jsonschema/commit/7d4b40dbbdfb3c730f02f9ad6b761df5bd55d8b5"><code>7d4b40d</code></a>
test: Update hegeltest to 0.41</li>
<li><a
href="https://github.com/Stranger6667/jsonschema/commit/b2622e56c735ac4c6710346d3b0d3750aec5033e"><code>b2622e5</code></a>
build(deps): bump taiki-e/install-action from 2.87.3 to 2.87.8</li>
<li><a
href="https://github.com/Stranger6667/jsonschema/commit/c983788ed6e7eb8a4cd975bba82546b789fde2a1"><code>c983788</code></a>
build(deps): update wasm-bindgen requirement from =0.2.127 to
=0.2.128</li>
<li><a
href="https://github.com/Stranger6667/jsonschema/commit/6e7e8f6899567a1ef8f1a79da4f62c3536c2bfb6"><code>6e7e8f6</code></a>
build(deps): bump crates/jsonschema/tests/suite</li>
<li><a
href="https://github.com/Stranger6667/jsonschema/commit/3f2c0a05118cdf5a380d7c371b2c8395b45a582c"><code>3f2c0a0</code></a>
perf: Preparing or building a schema that names no base URI parses the
defaul...</li>
<li><a
href="https://github.com/Stranger6667/jsonschema/commit/2b4f25b2727c4ac08ccf2d64477bf203cf0e8252"><code>2b4f25b</code></a>
perf: More benchmarks</li>
<li>Additional commits viewable in <a
href="https://github.com/Stranger6667/jsonschema/compare/ruby-v0.53.0...ruby-v0.56.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.53.0&new-version=0.56.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-13 22:24:13 -07:00

375 lines
16 KiB
TOML

[workspace]
members = ["tests/helpers/wt-perf"]
# Include the helper package so a workspace `cargo test` runs its in-package
# CLI tests (which build its binary).
default-members = [".", "tests/helpers/wt-perf"]
# cargo-affected input→test rules. cargo-affected selects tests by Rust-line
# coverage overlap, so a file a test reads at *runtime* (never recorded in
# coverage) maps to no test and would slip through `cargo affected run`. Each
# rule force-selects the owning tests when a matching path changes. `[*.metadata]`
# is excluded from cargo-affected's fingerprint, so editing a rule is
# cache-neutral. See https://github.com/max-sixty/cargo-affected#input-rules.
# insta `.snap` snapshots are read at test time and never appear in coverage, so
# a snapshot edit maps to no test. Route each snapshot to the binary that owns
# it — the finest granularity available without a snapshot→test map. Integration
# snapshots live under tests/; unit-test snapshots under src/, split across the
# lib (`worktrunk`) and the `wt` binary (`worktrunk::bin/wt`).
[[workspace.metadata.affected.rule]]
globs = ["tests/**/*.snap"]
filterset = "binary_id(=worktrunk::integration)"
[[workspace.metadata.affected.rule]]
globs = ["src/**/*.snap"]
filterset = "binary_id(=worktrunk) | binary_id(=worktrunk::bin/wt)"
# tests/integration_tests/readme_sync.rs reads each of these at runtime (via
# fs::read_to_string) and asserts the committed copies stay in sync — both the
# sources (README.md, docs/src/content/docs Markdown, src/cli/mod.rs,
# src/llm.rs, the skill references, Taskfile.yaml)
# and the generated artifacts it regenerates and compares against (the
# dev/*.example.toml files, docs/public/llms.txt, the agent-skills index.json).
# Editing any of them flips the test, but coverage can't link a runtime-read
# file to it.
[[workspace.metadata.affected.rule]]
globs = [
"README.md",
"docs/**/*.md",
"docs/public/llms.txt",
"docs/public/.well-known/agent-skills/index.json",
"docs/src/generated/terminal-styles.json",
"dev/*.toml",
"src/cli/mod.rs",
"src/llm.rs",
"Taskfile.yaml",
"skills/**/*.md",
]
filterset = "test(/readme_sync/)"
# The AUR PKGBUILD hand-copies the fish completion `fish_completion_content`
# generates; `test_aur_pkgbuild_ships_the_current_fish_completion` reads it at
# test time (fs::read_to_string), so coverage can't link the two.
[[workspace.metadata.affected.rule]]
globs = [".github/aur/PKGBUILD"]
filterset = "test(/aur_pkgbuild/)"
[package]
name = "worktrunk"
version = "0.77.0"
edition = "2024"
rust-version = "1.97"
build = "build.rs"
repository = "https://github.com/max-sixty/worktrunk"
homepage = "https://worktrunk.dev"
description = "A CLI for Git worktree management, designed for parallel AI agent workflows"
license = "MIT OR Apache-2.0"
default-run = "wt"
exclude = [".agents/skills/**"]
[package.metadata.release]
# Allow releases from any branch (GitHub Actions uses detached HEAD)
allow-branch = ["*"]
consolidate-commits = true
[package.metadata.cargo-udeps.ignore]
# `which` is used only on Windows (#[cfg(windows)] in src/shell_exec.rs).
# `petname-macros` is not referenced in code — its exact pin keeps the proc
# macro version aligned with `petname` (see the dependency comment below).
normal = ["which", "petname-macros"]
[features]
# Disabled: Enable testing for shells that require extra installation steps (nushell, powershell, elvish, xonsh, oil)
# tier-2-integration-tests = []
# Enable syntax highlighting for bash commands in output (requires tree-sitter)
# This is optional to avoid C compilation issues on some platforms
default = ["cli", "syntax-highlighting"]
# Enables the `wt` binary and everything specific to the CLI: argument parsing,
# interactive picker, rich terminal rendering, and the markdown help pager.
# Library consumers (e.g. `worktrunk-sync`) should depend on worktrunk with
# `default-features = false` to avoid pulling these in.
cli = [
"dep:clap",
"dep:clap_complete",
"dep:crossterm",
"dep:humantime",
"dep:skim",
"dep:ratatui",
"dep:ansi-to-tui",
"dep:tokio",
"dep:arboard",
"dep:open",
"dep:termimad",
"dep:tracing-log",
"dep:tracing-subscriber",
]
syntax-highlighting = ["dep:tree-sitter-bash", "dep:tree-sitter-highlight"]
# Enable shell/PTY integration tests (needs bash, zsh, fish, nu, pwsh, and jq on PATH)
# Includes: shell wrapper tests, PTY-based approval prompts, TUI select, progressive rendering
shell-integration-tests = []
# Enable benchmarks whose fixture is too large for hosted CI: the
# large-repository prune fixture (multi-gigabyte linked worktrees, cached under
# target/wt-perf/bench-repos). The daily benchmarks workflow runs plain `cargo bench`
# and must never build it; opt in locally with
# `cargo bench --bench prune --features large-repository-benches`.
large-repository-benches = []
# Install git-wt binary so `git wt` works as a git subcommand
git-wt = []
[lib]
name = "worktrunk"
path = "src/lib.rs"
[[bin]]
name = "wt"
path = "src/main.rs"
required-features = ["cli"]
# Also install as git-wt so `git wt <command>` works as a git subcommand.
# Primarily useful on Windows where `wt` conflicts with Windows Terminal.
# See: https://github.com/max-sixty/worktrunk/issues/133
# Install with: cargo install worktrunk --features git-wt
[[bin]]
name = "git-wt"
path = "src/git_wt.rs"
required-features = ["cli", "git-wt"]
# `git_wt.rs` is `include!("main.rs")`, so its unit tests are byte-identical
# duplicates of the `wt` binary's. Running them adds no coverage and breaks
# under `cargo hack test --feature-powerset`: insta derives snapshot filenames
# from the crate name, so the duplicates look for `git_wt__*.snap` files that
# don't exist (only `wt__*`). The `check` powerset still compiles this target.
test = false
# The integration suite execs the `wt` binary (needs `cli`) and snapshots its
# rendered output, which bakes in syntax highlighting (needs
# `syntax-highlighting`). Declaring both lets `cargo hack test
# --feature-powerset` skip this target on combinations that can't satisfy it
# rather than fail; lib and doc tests still run on every combination.
[[test]]
name = "integration"
path = "tests/integration.rs"
required-features = ["cli", "syntax-highlighting"]
# Deliberately a second binary rather than another module under `integration`:
# it latches process-wide cancellation state, which would take out any test
# running beside it in the same process. See the file's module docs.
[[test]]
name = "cancel_background"
path = "tests/cancel_background.rs"
[dependencies]
anyhow = "1.0.102"
anstream = "1.0"
anstyle = "1.0.13"
ansi-str = "0.9"
color-print = "0.3.7"
askama = { version = "0.16", default-features = false, features = ["derive", "std"] }
# Floor is 0.4.31, not 0.4: `DateTime::from_timestamp` (utils.rs, statusline.rs,
# backup.rs) landed in chrono 0.4.31. `-Z minimal-versions` otherwise resolves
# 0.4.0 and our own lib fails to compile.
chrono = "0.4.31"
# `unstable-markdown` renders our `///` doc-comments as styled help (bold inline
# code, literal `[experimental]`). skim 0.20 pulled it in transitively; skim 4
# (default-features = false) does not, so depend on it explicitly to keep help
# output stable rather than reverting to raw text.
clap = { version = "4.6", features = ["derive", "unstable-ext", "wrap_help", "unstable-markdown"], optional = true }
clap_complete = { version = "4.6", features = ["unstable-dynamic"], optional = true }
crossbeam-channel = "0.5"
crossterm = { version = "0.29", optional = true }
indexmap = { version = "2.14", features = ["serde"] }
etcetera = "0.11"
# `log` is still used pervasively for application logging; events flow into
# `tracing` via `tracing-log::LogTracer` (CLI binary only).
log = "0.4.31"
# 0.1.30 added the `enabled!` macro `src/trace/emit.rs::Span::drop` uses to
# elide span emission when the subscriber doesn't care. Older versions only
# expose the per-level macros and dispatcher checks.
tracing = "0.1.35"
# Compatibility shim: forward `log::*` macros into `tracing`. ~100 call sites
# across the codebase keep using `log::debug!` etc.; only the routing layer
# moved.
tracing-log = { version = "0.2.0", optional = true }
# Layered subscribers do the routing today's `Route` enum used to. `env-filter`
# replaces env_logger's RUST_LOG parsing; `fmt` provides the writer + format
# scaffolding; `registry` composes layers. Pinned to ≥ 0.3.17: that's when
# `EnvFilter::builder().with_default_directive(...).from_env_lossy()` (used in
# `src/logging.rs`) stabilized on top of the per-layer filtering rework.
tracing-subscriber = { version = "0.3.17", default-features = false, features = ["ansi", "env-filter", "fmt", "registry"], optional = true }
# Only enable needed features - saves ~200KB by excluding debug, macros, multi_template
minijinja = { version = "2.20", default-features = false, features = ["builtins", "serde", "std_collections"] }
rayon = "1.12"
serde = { version = "1.0.228", features = ["derive"] }
serde_json = "1.0.145"
shell-escape = "0.1"
shellexpand = "3.1"
strsim = "0.11.1"
strum = { version = "0.28", features = ["derive"] }
synoptic = "2"
terminal_size = "0.4.3"
toml = { version = "1.0", features = ["preserve_order"] }
toml_edit = { version = "0.25", features = ["serde"] }
# tree-sitter-bash may lag behind tree-sitter-highlight (0.25.x works with
# tree-sitter-highlight 0.26.x).
# These are optional dependencies controlled by the "syntax-highlighting" feature.
# To build without C compilation requirements, use: cargo install worktrunk --no-default-features --features cli
tree-sitter-bash = { version = "0.25.1", optional = true }
tree-sitter-highlight = { version = "0.26", optional = true }
unicode-width = "0.2.1"
wrap-ansi = "0.1"
osc8 = "0.1.0"
supports-hyperlinks = "3"
home = "0.5.12"
humantime = { version = "2.2", optional = true }
once_cell = "1.21.4"
dirs = "6.0"
normalize-path = "0.2.1"
path-slash = "0.2"
pathdiff = "0.2"
which = "8.0.2"
# Cross-platform path canonicalization that avoids Windows verbatim paths (\\?\)
# which external tools like git cannot handle. On Unix, it's a no-op wrapper.
dunce = "1.0"
termimad = { version = "0.35.1", optional = true }
urlencoding = "2.1"
regex = "1.12.3"
ignore = "0.4"
reflink-copy = "0.1"
# Atomic, no-overwrite rename (renameat2 / renamex_np / MoveFileExW) for
# `--clobber` backups — closes the check-then-rename TOCTOU. Keeps the FFI
# (and its `unsafe`) out of this crate, which is `unsafe_code = "forbid"`.
renamore = "0.3"
dashmap = "6.2.1"
fs2 = "0.4.3"
sanitize-filename = "0.6.0"
schemars = { version = "1.2.1", features = ["derive"] }
# SHA-256 is used for persistent cache keys (e.g., summary diff hashes in
# `.git/wt/cache/summary/`). stdlib's `DefaultHasher` is not guaranteed
# stable across Rust versions, so we need a deterministic algorithm on disk.
sha2 = "0.11"
# Wordlists for the `codename` template filter. PINNED EXACT — bumping this
# can silently shift every existing user's codename-derived worktree path,
# orphaning their on-disk worktrees. Coordinate any version change as a
# breaking-change rollout (see `test_codename_outputs_are_stable` and
# `src/config/expansion.rs::codename`). We use only the static wordlists,
# not the random-name generator, so `default-rng` and `clap` stay off.
petname = { version = "=3.2.0", default-features = false, features = ["default-words"] }
# PINNED EXACT to match `petname`: its caret dependency otherwise permits a
# different proc-macro version, but the generated code and runtime re-exports
# require an exact match. Keep both pins in lockstep.
petname-macros = "=3.2.0"
tempfile = "3.27"
# Timed waits on child processes (`Cmd::timeout`, `Cmd::delayed_stream`, the
# picker's pager). Replaced `wait-timeout`, whose SIGCHLD handler aborts the
# process when its self-pipe write fails — see "Timed waits" in `shell_exec`.
shared_child = "1.1"
# Interactive picker (`wt switch`) TUI stack, pulled in only by the `cli`
# feature's `dep:` entries. These are platform-neutral (skim 4.x is the
# ratatui/crossterm rewrite, which supports Windows), so they live in the main
# table — not under `[target.'cfg(unix)']` — or the picker fails to compile on
# Windows.
#
# skim 4.x is the ratatui-based rewrite; the 0.20 line used the now-abandoned
# tuikit backend (we previously vendored a patched skim-tuikit fork). The
# picker feeds rows as a custom `SkimItem` whose `display()` returns a ratatui
# `Line`, so `ratatui` + `ansi-to-tui` below convert the picker's pre-rendered
# ANSI rows into styled lines.
#
# `default-features = false` drops skim's own CLI (`clap` / `clap_mangen` / …):
# worktrunk embeds the picker as a library and never shells out to the `sk`
# binary. `frizbee` keeps skim's default fuzzy matcher.
# Floor is 4.8, not 4: the picker is written against 4.8's `ratatui 0.30.1`
# API, and earlier 4.x compile against an incompatible ratatui (`-Z
# minimal-versions` otherwise resolves skim 4.6 against ratatui 0.30.1 and fails
# to build).
# skim 5.3.1 (bumped in #3526) regressed the picker on the legacy Windows
# console — every picker PTY test failed with "Keyboard progressive enhancement
# not implemented for the legacy Windows API", reddening the Windows test job,
# so the pin held at the last-Windows-green 5.1.0. 5.5.0 guards that path ("Do
# not panic on push/pop keyboard enhancement flags failure") and is
# Windows-green again. Kept as an exact pin; it can relax to a range now that
# the keyboard-enhancement path no longer regresses the legacy console.
skim = { version = "=5.6.6", optional = true, default-features = false, features = ["frizbee"] }
# Pinned to skim's ratatui line so the `Line` type `display()` returns is the
# same one skim consumes. `ansi-to-tui` parses ANSI SGR codes into ratatui spans.
# Floor is 0.30.1: 0.30.0 is a broken release (its `#[instability::unstable]`
# attribute fails to compile).
ratatui = { version = "0.30.1", optional = true }
ansi-to-tui = { version = "8.0.1", optional = true }
# Already in the tree via skim (its event loop is tokio-based). The picker drives
# skim through the public `Skim::init`/`run` API rather than the all-in-one
# `Skim::run_with` so it can grab `event_sender()` and push `Event::Render` while
# collect mutates rows in place — skim 4.x renders on demand, not on a heartbeat.
# `Runtime::new()` needs `rt-multi-thread`; `event_sender()` is a `sync::mpsc`.
tokio = { version = "1.52.3", optional = true, default-features = false, features = ["rt-multi-thread", "sync"] }
# Picker row shortcuts: `alt-y` copies the selected branch to the system
# clipboard, `alt-o` opens its PR/MR URL in the browser. Both are cross-platform
# (so they sit in the main table alongside the picker stack, not under
# `[target.'cfg(unix)']`). `arboard` drops `default-features` to skip the `image`
# crate — the picker only copies text — while keeping `wayland-data-control` so
# Linux Wayland clipboards work alongside X11 and macOS.
arboard = { version = "3.4", optional = true, default-features = false, features = ["wayland-data-control"] }
open = { version = "5.3", optional = true }
[target.'cfg(unix)'.dependencies]
# Unix-only syscall crates: `nix` (process/signal) backs the fsmonitor reap and
# `signal-hook` forwards Ctrl-C to child process groups. Gating keeps both out of
# the Windows dependency graph.
nix = { version = "0.31.3", default-features = false, features = ["process", "signal"] }
signal-hook = "0.4.1"
[build-dependencies]
vergen-gitcl = { version = "10.0.0", features = ["build"] }
[dev-dependencies]
insta = { version = "1.47.2", features = ["yaml", "redactions", "filters"] }
insta-cmd = "0.7"
rstest = "0.27"
tempfile = "3.27"
toml = "1.0"
criterion = "0.8"
portable-pty = "0.9"
regex = "1.12.3"
vt100 = "0.16.2"
wt-perf = { path = "tests/helpers/wt-perf" }
similar = "3.1.1"
jsonschema = { version = "0.56", default-features = false }
[[bench]]
name = "alias"
harness = false
[[bench]]
name = "completion"
harness = false
[[bench]]
name = "list"
harness = false
[[bench]]
name = "time_to_first_output"
harness = false
[[bench]]
name = "remove"
harness = false
[[bench]]
name = "prune"
harness = false
[[bench]]
name = "picker_preview"
harness = false
[lints.rust]
unsafe_code = "forbid"
# The profile that 'dist' will build with
[profile.dist]
inherits = "release"
lto = "thin"