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
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
[]
= "heddle-cli"
= true
= true
= true
= true
= true
= true
= true
= true
= "../../README.md"
# Exclude bulky integration-test fixtures (~24 MB of git-shaped tarballs)
# from the published tarball — they push the package over crates.io's
# 10 MB limit and only matter for tests run inside the workspace.
= [
"tests/realworld_git/fixtures/*",
"tests/snapshots/**/*",
]
[]
# `anstyle` 1.x is already in our transitive deps via clap. Pinning it
# directly here makes `crates/cli/src/cli/style.rs` a first-class
# consumer; the version range matches what `cargo tree` resolves.
= "1"
= true
= true
= true
= true
= true
= true
= true
= true
= true
= true
= { = "../objects", = "heddle-objects", = "0.4", = ["memory-backend"] }
= { = "../crypto", = "heddle-crypto", = "0.4" }
= { = "../daemon", = "heddle-daemon", = "0.4" }
# `heddle-merge` is the native hunk-level text merge engine extracted from
# `heddle-semantic` so non-semantic builds (`--no-default-features`) retain
# text auto-merge. Always-on: the merge driver and rebase replay both call
# into it unconditionally.
= { = "../merge", = "heddle-merge", = "0.4" }
= { = "../grpc", = "heddle-grpc", = "0.7" }
= { = "../cli-shared", = "heddle-cli-shared", = "0.4" }
= { = "../client", = "0.4", = true }
= { = "../weft-client-shim", = "weft-client-shim", = "0.4" }
= true
# `default-features = false` here matches the pattern used for
# repo below: this crate's `zstd` feature controls the cascade
# end-to-end. Without these breaks, every dep's own default-on `zstd`
# would re-enable compression even when the user explicitly built
# with `--no-default-features`.
= { = "../ingest", = "heddle-ingest", = "0.4", = false }
= { = "../oplog", = "heddle-oplog", = "0.4" }
= { = "../wire", = "heddle-wire", = "0.4", = false }
= { = "../refs", = "heddle-refs", = "0.4" }
= { = "../repo", = "heddle-repo", = "0.4", = false }
= { = "../semantic", = "heddle-semantic", = "0.4", = true }
= true
= { = true, = true }
= { = true, = true }
= { = true, = true }
= true
= true
= true
= true
= true
= true
= true
= true
= true
= { = true, = true }
= true
= true
# `uuid::Uuid::new_v4().simple()` suffixes rebase transaction ids
# (`rebase_ops::mint_rebase_transaction_id`) so a nanosecond-resolution
# clock collision can't silently drop the later rebase's batch via
# `flush_rebase_batch`'s dedup (heddle#198 r3 / Codex PR #218 P2).
= true
# Health.Check probe for the local daemon UDS handshake. Only
# pulled in for the client side; the local daemon binary itself does
# not (yet) install a health reporter — see `client::local_daemon`.
= true
# `tower::service_fn` adapts `tokio::net::UnixStream::connect` into a
# `tower::Service<Uri>` that tonic's `connect_with_connector` accepts.
# 0.5 is what tonic itself resolves transitively; pinning to the same
# major version keeps the trait impls compatible.
= { = "0.5", = false, = ["util"] }
# `hyper-util`'s `TokioIo` adapter wraps a `UnixStream` into something
# that satisfies hyper's `Read`/`Write` traits — required by tonic
# 0.14's connector contract. Already a workspace dep used by the
# server crate; promoting it here for first-class consumption.
= true
= true
= true
= { = true, = true }
= true
= true
# Mount is platform-agnostic in source, but each adapter only
# compiles for one OS — FUSE on Linux (`fuse`), FSKit on macOS
# (`fskit`), ProjFS on Windows (`projfs`). We take the `mount`
# dep on each target separately so the CLI's `mount` feature can
# propagate the right per-OS backend without any one platform
# being forced to drag in another platform's kernel bindings.
[]
= { = "../mount", = "heddle-mount", = "0.4", = true }
[]
= { = "../mount", = "heddle-mount", = "0.4", = true }
[]
= { = "../mount", = "heddle-mount", = "0.4", = true }
[]
# Keep the default `heddle` build focused on the local invisible-VCS
# workflow. Heavier import/hosted surfaces are opt-in for release
# builds that need them. `semantic` is included in defaults because
# `heddle diff --semantic` and the
# agent-loop self-review (`/heddle-review`) all reach for it; gating
# the default install behind an extra `--features semantic` flag
# turns these documented commands into an opaque error for first-run
# users. The binary cost is the four `tree-sitter-*` parsers
# (Rust/Python/JS/TS) — a small fraction of the existing footprint
# from tonic + server. `semantic-extended` (Go/C/C++/Java) stays
# opt-in.
# `mount` is in the default set so a stock `cargo install heddle-cli`
# (or `cargo install --path crates/cli`) ships `heddle-fuse-worker`
# next to `heddle`. Without it, the sibling-binary lookup in
# `mount::worker::default_worker_binary` doesn't resolve and the
# mount lifecycle silently falls back to NFS on every Linux user
# who installed via the documented flow (heddle#190 r5 / Codex PR
# #225 P2). The platform-specific backends (`fuser` on Linux,
# `windows` on Windows, `cbindgen`/Swift on macOS) are target-gated
# inside `heddle-mount`, so default-on is platform-blind: each host
# pulls only its own native adapter plus the platform-agnostic NFS
# fallback (`nfsserve` + `tokio` async-trait). The OSS feature
# subsets that explicitly want a slim build (`--no-default-features
# --features git-overlay,...`) opt out the same way they do today.
= ["git-overlay", "native", "local", "mount", "semantic", "zstd"]
= []
# Repository mode features. At least one must be enabled. Released as
# three OSS CLI flavors: `git-overlay` only (works on top of existing
# Git repos; no native content-addressed init), `native` only (pure
# content-addressed VCS; no Git bridge), or both. The closed `heddle-hosted`
# build adds `client` on top of either / both.
= ["repo/git-overlay", "ingest"]
= ["repo/native"]
= ["dep:heddle-client", "dep:tokio-tungstenite"]
# Deep git import + AI-session reasoning extraction now backs every Git
# overlay import path. Kept as a feature name for existing feature sets,
# but the dependency is always present so no legacy bridge importer is
# compiled as a fallback.
= []
= ["repo/s3"]
= ["dep:semantic", "repo/tree-sitter-symbols"]
= ["semantic", "semantic?/extended-languages"]
= [
"dep:opentelemetry",
"dep:opentelemetry-otlp",
"dep:opentelemetry_sdk",
"dep:tracing-opentelemetry",
]
# Forward zstd compression to every layer that touches the pack
# format. The `?` syntax on optional deps activates the feature only
# when the dep itself is enabled (`ingest` is gated behind
# the `ingest` feature).
= [
"objects/zstd",
"wire/zstd",
"repo/zstd",
"ingest/zstd",
]
# Wire the content-addressed mount through the CLI. Off by
# default — each native backend pulls in a kernel-side dep that
# only exists on its target OS (`fuser` on Linux, `swiftc`-compiled
# FSKit shim on macOS, `windows` crate's ProjFS bindings on
# Windows). Activate with `cargo build --features mount` on any
# of the three; the per-target cfg gates in `crates/mount/src/lib.rs`
# select the correct native backend. Cargo features are
# platform-blind so all backend features propagate from this one —
# the inactive ones compile to zero code via the cfg gates.
#
# The `nfs` feature is the universal fallback: a platform-agnostic
# adapter that stands up an in-process NFSv3 server and asks the
# host's built-in NFS client to mount it. The CLI's mount
# lifecycle prefers the host's native adapter and falls back to
# NFS at runtime when the native one is unavailable (missing
# kernel module, missing System Extension, missing optional
# feature, etc).
= [
"dep:mount",
"mount?/fuse",
"mount?/fskit",
"mount?/projfs",
"mount?/nfs",
]
[]
= "0.8"
= true
= { = "../review", = "heddle-review" }
= true
= true
= true
= true
= true
= true
[[]]
= "heddle"
= "src/main.rs"
# Linux-only crash-isolation worker. Co-located in the CLI package
# so `cargo install --path crates/cli` (and `cargo install heddle`
# from crates.io) installs both `heddle` and `heddle-fuse-worker`
# into the same bin dir — the sibling-binary lookup in
# `mount::worker::default_worker_binary` only resolves when the two
# ship together. The file itself is `cfg(target_os = "linux",
# feature = "mount")`, so non-Linux and mount-less builds compile to
# nothing here.
[[]]
= "heddle-fuse-worker"
= "src/bin/heddle-fuse-worker.rs"
= ["mount"]
[]
= "cli"
= "src/lib.rs"
# Integration tests for cli live under `tests/` (auto-discovered) so
# that `cargo publish` can package the crate cleanly.
[[]]
= "semantic_diff_integration"
= "tests/semantic_diff_integration.rs"
= ["semantic"]
[[]]
= "local_ops"
= false
= ["semantic"]
[[]]
= "clonefile_threads"
= false