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
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
[]
= "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/**/*",
]
[]
= true
= true
= true
= true
= true
= true
= { = true, = true }
= { = true, = true }
= true
= true
= true
= true
= true
= true
= true
= true
# `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.
= true
= { = true }
= true
= true
= true
= true
= true
= true
= true
= 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`.
= true
= true
= true
= true
= true
= true
= { = true, = true }
= true
= { = 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).
# `v5` derives deterministic per-thread push client_operation_ids (remote::push).
= { = true, = ["v5"] }
= 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.
[]
= { = true, = true }
[]
= { = true, = true }
[]
= { = true, = true }
[]
# The default `heddle` build ships the full workflow: local
# invisible-VCS plus the hosted `client` surface (push / clone / pull,
# discussions, context, review against a weft server). `client` is in
# the default set because the hosted flows are now core to how heddle
# is used — gating them behind `--features client` turned a first-run
# `heddle clone <hosted-url>` / `heddle push` into an opaque error. A
# slim, local-only build stays available via `--no-default-features
# --features git-overlay,native,semantic,zstd`. `semantic` is included
# in defaults because
# `heddle diff --semantic` and the
# agent-loop self-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 the hosted client stack. `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",
"client",
]
# `ci` gates the local `heddle ci` executor (constitutional later after
# treadle). Non-default: the everyday loop never invokes it, and the
# default binary should not carry the check runner.
= [
"dep:ci-config",
"dep:ci-engine",
"heddle-cli-args/ci",
"heddle-cli-contract/ci",
]
= []
# Repository mode features. At least one must be enabled. The default
# build enables both modes plus the hosted `client`. Slimmer builds opt
# out via `--no-default-features`: `git-overlay` only (works on top of
# existing Git repos; no native content-addressed init), `native` only
# (pure content-addressed VCS; no Git Projection import/export surface),
# or both — and each can drop `client` for a local-only CLI.
= [
"repo/git-overlay",
"ingest",
"heddle-cli-args/git-overlay",
"heddle-cli-contract/git-overlay",
]
= ["repo/native"]
# `client` is now a marker: the hosted stack itself (Iroh transport,
# credentials, biscuits, websockets, hosted sync) compiles inside
# `hosted-client`; enabling this just turns that crate's `client` feature on
# alongside the CLI-side client-gated surfaces.
= [
"api/reflection",
"agent-relay/client",
"dep:tokio-tungstenite",
"hosted-client/client",
"heddle-cli-args/client",
"heddle-cli-contract/client",
"heddle-cli-render/client",
]
# 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.
= ["heddle-cli-args/ingest", "heddle-cli-contract/ingest"]
= [
"dep:semantic",
"heddle-cli-args/semantic",
"heddle-cli-contract/semantic",
"verbs/semantic",
"repo/tree-sitter-symbols",
]
= ["semantic", "verbs/semantic-extended", "semantic?/extended-languages"]
# `telemetry` compiles OTLP support into the CLI. It stays opt-in so the
# default binary does not carry the exporter and HTTP/TLS dependency stack.
# Runtime initialization remains endpoint-gated when the feature is enabled.
= [
"config/telemetry",
"dep:opentelemetry",
"dep:opentelemetry-otlp",
"dep:opentelemetry_sdk",
"dep:tracing-opentelemetry",
"hosted-client/telemetry",
]
# 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",
"heddle-git-projection/zstd",
"verbs/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",
]
[]
# Test-only: hosted fixtures mint biscuits and stand up Iroh endpoints
# directly; the production CLI gets both through `hosted-client`.
= true
= true
= "0.8"
= { = true, = ["default", "test-utils"] }
= true
# Test-only: the in-memory object backend never ships in the binary.
= { = true, = ["memory-backend"] }
= { = "=1.0.3", = false, = ["server"] }
= true
= true
= true
= "0.14.8"
= true
= true
= true
[[]]
= "heddle"
= "src/main.rs"
[[]]
= "heddle-fsmonitor-worker"
= "src/bin/heddle-fsmonitor-worker.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"]
[[]]
= "heddle-ingest"
= "src/bin/heddle-ingest.rs"
= ["ingest"]
[]
= "cli"
= "src/lib.rs"
# Integration tests for cli live under `tests/` (auto-discovered) so
# that `cargo publish` can package the crate cleanly.
[[]]
= "ci_run_local"
= "tests/ci_run_local.rs"
= ["ci"]
[[]]
= "semantic_diff_integration"
= "tests/semantic_diff_integration.rs"
= ["semantic"]
[[]]
= "semantic_symbol_diff_cli"
= "tests/semantic_symbol_diff_cli.rs"
= ["semantic"]
[[]]
= "semantic_refs_cli"
= "tests/semantic_refs_cli.rs"
= ["semantic"]
[[]]
= "local_ops"
= false
= ["semantic"]
[[]]
= "capture_allocations"
= false
[[]]
= "clonefile_threads"
= false