1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
[]
# crates.io package name. The bare `gwm` name is taken by an unrelated
# project (shutootaki/gwm), so we publish as `gwm-cli` — the installed
# binary and the library crate stay `gwm` (see [[bin]] / [lib] below),
# so `cargo install gwm-cli` still yields the `gwm` command.
= "gwm-cli"
= "1.6.1"
= "2021"
# MSRV is the floor required by every use in the crate, not just the newest
# one introduced here. Our own std usage sits far lower: `std::sync::LazyLock`
# (src/naming.rs) wants 1.80, `std::iter::repeat_n` (src/tui/ui.rs's countdown
# bar) wants 1.82. The floor comes from the dependency graph, and reading it
# takes a build rather than `cargo metadata`: the highest *declared*
# `rust-version` in the locked graph is 1.88 (the ratatui 0.30 stack, `time
# 0.3.47`), but `libsqlite3-sys 0.38.1`, a normal dependency pulled in by
# `rusqlite` with `bundled`, declares no `rust-version` at all and its build
# script uses `cfg_select!`, stable only since 1.95.0. Measured against the
# committed lockfile: `cargo +1.94 check --all-targets --locked` fails with
# `error[E0658]`, `cargo +1.95 check --all-targets --locked` passes.
#
# Two CI jobs hold this line. The clippy job catches an accidental *std-API*
# use above it (`clippy::incompatible_msrv` is warn-by-default, escalated to a
# hard error by `-D warnings`). The `msrv` job (#491) installs the toolchain
# declared right here and runs `cargo check --all-targets --locked`, which is
# the only check that sees a language/edition feature or a dependency that
# declares no floor of its own. See `docs/6.development/3.stability.md`
# §MSRV policy for the full story.
= "1.95"
= "git worktree manager — TUI + CLI, native libgit2, per-repo bootstrap"
= ["Kylian Bardini"]
= "MIT"
= "https://github.com/kbrdn1/gwm-cli"
= "README.md"
= ["git", "worktree", "tui", "cli", "ratatui"]
= ["command-line-utilities", "development-tools"]
# cargo-binstall (#27): pull the prebuilt binary from the GitHub
# Release instead of compiling git2/vendored-libgit2 from source.
# Mirrors the release workflows' artefact naming — `gwm-v{version}-
# {target}.tar.gz` (`.zip` on windows) — and the in-archive layout
# `gwm-v{version}-{target}/{gwm|gwm.exe}`. `tests/binstall_metadata_tests.rs`
# pins this block against drift.
[]
= "{ repo }/releases/download/v{ version }/gwm-v{ version }-{ target }.tar.gz"
= "tgz"
= "gwm-v{ version }-{ target }/{ bin }"
[]
= "{ repo }/releases/download/v{ version }/gwm-v{ version }-{ target }.zip"
= "zip"
# `.deb` packages (issue #377) — built + attached to each stable Release by
# `release.yml` via `cargo deb --no-build --target <triple>`. The package name
# is the crate name (`gwm-cli`, not `gwm`); the installed command stays `gwm`.
# `conflicts = "gwm"` is still needed because Debian's unrelated `gwm`
# window-manager package also owns `/usr/bin/gwm`, so the two can't coexist —
# dpkg refuses cleanly instead of erroring on the file clash at unpack time.
# `depends` is set explicitly (not `$auto`) so cargo-deb skips `dpkg-shlibdeps`
# — the binary vendors both libgit2 AND zlib statically (see the libz-sys dep
# above), so glibc is its only dynamic *library* dependency. Skipping shlibdeps
# is what lets the cross-built aarch64 package be produced from an x86_64
# runner. `git` is added as a runtime dependency because gwm shells out to the
# `git` binary (sync, worktree rename, clean, TUI previews) beyond the vendored
# libgit2 — shlibdeps would never catch an exec dependency (#388).
[]
= "Kylian Bardini <onepiecekylian@gmail.com>"
= "2026 Kylian Bardini"
= ["LICENSE.md", "0"]
= """
git worktree manager — a terminal UI and CLI over git worktrees. Native
libgit2, per-repo .gwm.toml bootstrap (file copies, regex guards, lifecycle
hooks), and a ratatui TUI. The installed command is `gwm`."""
= "utils"
= "optional"
# `>= 2.34`: the binaries are built on `ubuntu-latest`, whose CRT objects pull
# GLIBC_2.34, so this is a definite lower bound. Declaring it makes dpkg refuse
# cleanly on older glibc (RHEL 8 = 2.28, Ubuntu 20.04 = 2.31) instead of
# installing then failing at load. It is a conservative floor, not the exact
# per-arch ABI floor — computing that from the ELF in CI (and doing the same for
# the tarballs) is tracked as a follow-up (#386).
= "libc6 (>= 2.34), git"
= "gwm"
= [
["target/release/gwm", "usr/bin/", "755"],
["README.md", "usr/share/doc/gwm-cli/README.md", "644"],
["CHANGELOG.md", "usr/share/doc/gwm-cli/CHANGELOG.md", "644"],
]
# `.rpm` packages (issue #378) — built + attached by `release.yml` via
# `cargo generate-rpm --target <triple>`. `auto-req = "no"` disables rpm's
# dependency auto-detection (it needs the target's rpm tooling, unavailable
# when cross-packaging aarch64 from an x86_64 runner). With libgit2 and zlib
# both statically linked, glibc is the only dynamic *library* dependency; `git`
# is added as a runtime dependency because gwm shells out to the `git` binary
# (sync, worktree rename, clean, TUI previews) beyond the vendored libgit2
# (#388). Both are declared explicitly via `requires` so a minimal Fedora/RHEL
# still pulls them. (No `gwm` window-manager package exists on Fedora, so no
# rpm `conflicts` is needed.)
[]
= "git worktree manager — TUI + CLI, native libgit2, per-repo bootstrap"
= "MIT"
= "no"
= { = ">= 2.34", = "*" }
= [
{ = "target/release/gwm", = "/usr/bin/gwm", = "755" },
{ = "README.md", = "/usr/share/doc/gwm-cli/README.md", = "644" },
{ = "LICENSE.md", = "/usr/share/doc/gwm-cli/LICENSE.md", = "644" },
{ = "CHANGELOG.md", = "/usr/share/doc/gwm-cli/CHANGELOG.md", = "644" },
]
[]
= "gwm"
= "src/lib.rs"
[[]]
= "gwm"
= "src/main.rs"
[]
# `daemon` (issue #38, phase 2) gates the long-running JSON-RPC server
# over a unix domain socket. Default-on so the standard `cargo test` and
# release builds exercise it; `--no-default-features` drops the serving
# path for Windows / minimal builds (the socket impl is also
# `cfg(unix)`-gated, so it compiles to a clean runtime error there
# regardless). The cross-platform pure-RPC layer (parse / dispatch) is
# always compiled and unit-tested. No extra dependencies: the socket uses
# `std::os::unix::net`.
= ["daemon"]
= []
[]
= { = "4.5", = ["derive", "color"] }
= "4.5"
= "0.30"
# `osc52` pulls crossterm's `clipboard` module (`CopyToClipboard`) and, with it,
# base64 — the encoder OSC52 needs. Using the framing crossterm already ships,
# and which its own tests pin, beats hand-rolling the sequence here (#367).
= { = "0.29", = ["osc52"] }
= { = "0.21", = false, = ["vendored-libgit2"] }
# Force a statically-linked zlib (issue #377/#378 review). git2 pulls libz-sys,
# which by default links the system `libz.so.1` dynamically — so the release
# binary, and the .deb/.rpm built from it, would need a zlib runtime package too.
# Static-linking it means everything depends only on glibc, so the packages can
# declare accurate deps without per-distro zlib package names (zlib1g / zlib /
# zlib-ng) or arch-specific sonames, and the cross-built aarch64 package is
# correct too. Applied as a Cargo feature so it propagates inside the `cross`
# container without env passthrough.
= { = "1", = ["static"] }
= { = "1", = ["derive"] }
= "1"
= "1.1"
= "0.25"
= "1"
= "2"
= "6"
= "1"
= "3"
= { = "0.4", = ["serde"] }
= "8"
= "0.3"
= "0.3"
= "1"
= "3"
# Issue #35: PTY overlay for embedded lazygit / native terminal.
# portable-pty provides the cross-platform PTY pair; tui-term renders the
# vt100 parser output as a ratatui widget. tui-term 0.3 re-exports its own
# vt100 0.16 as `tui_term::vt100` — use that, not a standalone vt100 crate.
= "0.9"
= "0.3"
# Issue #95: SHA-256 over the raw bytes of `.gwm.toml` for the TOFU
# trust ledger. Whitespace-sensitive on purpose — `rm -rf /tmp/` and
# `rm -rf /tmp /` are visually close but semantically different, so
# we hash bytes, not parsed TOML.
= "0.11"
= "0.10.0"
= { = "0.40.1", = ["bundled"] }
# Unix-only: needed for `O_NOFOLLOW` in bootstrap's TOCTOU-safe copy
# primitives (issue #93). Already pulled in transitively by git2 /
# dirs / cc, declared here for explicit use in `src/bootstrap.rs`.
[]
= "0.2"
[]
= "2.4.2"
= "1.2.1"
= { = "0.61.2", = ["Win32_System_Pipes", "Win32_Foundation", "Win32_Security", "Win32_Security_Authorization", "Win32_System_Threading"] }
[]
= "2.4.2"
[]
= "2"
= "0.8"
= "3"
# Parse our own Cargo.toml in tests/binstall_metadata_tests.rs (#27) so
# the `[package.metadata.binstall]` contract is asserted structurally,
# not by string-matching. Same `toml` major as the runtime dependency.
= "1.1"
[[]]
= "commit_graph"
= false
[[]]
= "sidebar_recent_commits"
= false
[[]]
= "sidebar_cache_hit"
= false
[]
= 3
= "thin"
= 1
= true