Releases
Changelog
Notable changes, newest first. Mirrored at build time from Heddle's
canonical CHANGELOG.md.
Unreleased
0.5.1 - 2026-06-27
Changed
- Upgraded the native-git substrate to sley
0.3.1and switched published Heddle crates back to the crates.io dependency instead of the sibling path. sley0.3.1adds a receive-pack input-size cap and unix-portability cfg-gates. - Hosted Git-overlay sync now sends Git-shaped data through the Git lane as packs, while Heddle-native captures, state, context, discussions, and visibility metadata remain on the Heddle lane.
heddle-grpcand@heddleco/grpcmove to0.7.2with the Git lane pack transfer protobuf surface and hosted spool API additions.
Fixed
- Heddle's Sley fetch call sites now pass the explicit
FetchOptions.atomicsetting required by sley0.3.1, preserving the previous non-atomic fetch behavior. .git/HEADsymref updates are now atomic (temp-file + rename + fsync), preventing a torn HEAD if the process is interrupted mid-write.- A corrupt or unreadable user config now fails closed with a clear error
instead of silently attributing captures/checkpoints to an
Unknown <unknown@example.com>identity. - A git-lane pull targeting a non-overlay repository now returns an error instead of silently discarding the transferred data.
- The fast short-status path now classifies staged-add-then-worktree-deleted
(
AD), renames (R), and copies (C) consistently with the full status path. - The worktree change scan now detects a new file added to an already-tracked
directory. Previously such a file could be missed by
status/captureuntil an unrelated change forced a rescan.
Security
heddle trynow sanitizes the spawned command's environment,env_clear()plus an allowlist, matchingheddle run, soGIT_DIR,GIT_WORK_TREE, and other inherited parent-process secrets no longer leak into commands run viatry.
0.5.0 - 2026-06-23
Native-git substrate jumps to sley 0.2.0, the storage seam lands, and the
embeddable heddle-core facade takes shape.
Added
heddle-coreembeddable facade. New facade crate with anExecutionContextand observability sinks, a query facade lifted out of the CLI, and a compute→render split exemplar (fsckcomputes aFsckReport; the CLI renders it). Groundwork for embedding heddle as a library. (#775, #780, #782)- New published crates
heddle-formatandheddle-schema, extracted as pure (behaviour-neutral) cores fromheddle-objectsand now part of the crates.io publish set. (#761)
Changed
- Native-git substrate upgraded to sley
0.2.0(~24 parity waves since0.1.0: multi-pack-index, reftable basics, fetch, gc, blame, worktree, split-index, mergetool, the diff-format crate extraction, and more). (#784) - Storage seam. Reads now flow through an
ObjectSourcesync/async seam;query_history/CommitGraphIndexare decoupled onto it with the cache as an optional accelerator; staleness and context-suggestion pure cores moved intoheddle-objects. (#762, #763, #764) clapconfined to theheddle-clicrate.heddle-ingestand the library crates no longer pullclap, shrinking the embeddable surface. (#781, #783)- Faster status scans: borrow entry names instead of cloning. (#774)
Removed
- The S3 object backend and its AWS dependency chain (a pre-seam leftover). (#765)
0.4.0 - 2026-06-19
Changed
- Breaking (crate surface): renamed the native Heddle wire/protocol
crate from
heddle-proto(crates/proto, Rust crateproto) toheddle-wire(crates/wire, Rust cratewire). The protobuf/gRPC IDL remains inheddle-grpcundercrates/grpc/proto/heddle/v1.
Added
@heddle/grpc: a generated TypeScript protobuf + Connect (v2) client package for the Heddle gRPC API, versioned withheddle-grpc(0.7.1), publishable to GitHub Packages for Tapestry consumption. New path-gatedts-grpc-clientCI workflow validates/typechecks/packs it and gates publish tomain.
0.3.0 - 2026-06-16
Git operations move onto a native-Rust substrate, the command surface is consolidated, lossless git round-trip becomes a hard guarantee, and the release ships signed macOS + Homebrew distribution.
Breaking
- Semantic merge is the default merge strategy; the redundant
--semanticflag is removed (#669) - Verb-surface consolidation: ~85 top-level verbs reduced to ~28 canonical ones. Save verbs collapse onto
commit/ready/land/sync(#478); redundant roots are deleted from the command tree, dispatch, catalog, and schemas, not just hidden (#681) git importrefuses lossy conversions by default; unrepresentable tree entries now fail hard, with explicit--lossyopt-in (#453)FullRematerializerefuses to run against a dirty worktree by default; the destructive discard is opt-in (#442)OutputMode::Autoremoved, output no longer silently switches to JSON when piped;--output jsonis explicit (#280)OpRecordv2 record variants collapsed and a schema-versioning migration added for legacy oplog repos (#670, #452)- RPC rename
AuthService.FinishWebAuthnRegistration→RegisterPublicKey(crates/grpc/proto/heddle/v1/service.proto; #63). The old name reflected WebAuthn ceremony state; the new name reflects what the call actually does, store a public key + attestation.BeginWebAuthnRegistrationkeeps its name (generic challenge-init); the request message is renamed in lockstep (FinishWebAuthnRegistrationRequest→RegisterPublicKeyRequest). All field numbers are preserved, so wire-compatible consumers that don't pin the message-type name keep decoding existing payloads, but consumers pinned to^0.2must update generated client/server stubs before upgrading
Changed
- Squash-by-default land: a landed thread exports as one atomic Git commit while preserving per-State Heddle history;
--no-squashand a[land] squashconfig override remain (#680) heddle start --pathis the canonical isolated-checkout path;thread create/thread promotedemoted off the advertised surface; thread checkouts land under.heddle/threads/for sandbox-friendliness (#685, #576)- Object reads and hashing route through a native-Rust
git_substrateadapter backed by sley0.0.3; remaininggixusage is cut over so there is no git shell-out on the hot path (#733, #738, #595) Repositorygenericized over its ref/object backends,dyndispatch replaced with type parameters, removing vtable overhead (#282, #293)- Native ref primitives:
parse_git_ref+RefSpec/NegativeRefSpecported from jj;.git/configremotes parsed viagix_configinstead of by hand (#296, #288) - Captured new files are marked intent-to-add in the colocated Git index, matching
git add -Nsemantics (#300) output_kindwire normalization across thread/operator envelopes and the read/stream paths (inspect/show, rebase JSONL, conflict-show), so--output jsonis stable end to end; an invariant lint guards the class (#671, #660, #281)- Help and onboarding overhaul: one-command first-run onboarding (#349), grouped advanced command list, single-sourced
--outputhelp,help threads/help advanced/Git-concept topics, and de-bloated per-command help (#663, #658, #688, #174)
Added
heddle oplog recover/ operator recover: reconstructs a truncated oplog from the EOF footer plus a salvage sidecar, so a truncated log no longer bricks a repo (#682, #736, #618)- Packed oplog v3: single-file tail format with an EOF footer carrying entry-offset, batch, and sorted
transaction_idindexes (#429) - Lossless git round-trip: git-fidelity fields (committer, tz offsets, verbatim message, ordered extra headers, GPG sig) captured on import with a format bump (#569); a byte-exact
reconstruct_commit_bytesserializer + conformance harness (#579); export reconstructs commit objects from state (#591); and abridge backfill-fidelitymigration for pre-bump repos (#587) - Automatic ed25519 state signing on capture/commit/merge, wiring the device key into every recorded state (#486)
- Function-level semantic merge driver: AST-aware three-way merge plus a native hunk-level (diff3-style) text merger; Rust
usere-exports merge as path-keyed items (#114, #84, #477) - Cross-thread undo, undoable rebase (transaction grouping),
FastForward/FastForwardV2merge undo, and a pre-undo recovery marker so undo never silently loses worktree edits (#112, #218, #109, #118, #314) heddle expand <oid|state|thread>reconstructs the constituent captures of a collapsed squashed land (#721)- Partial clone:
clone --depthandclone --filter blob:none(synonym for--lazy) wired through the Git-overlay clone, plus lazy on-read blob hydration via aBlobHydratortrait (#52, #51, #53) - Dynamic shell completion (
__complete) and aheddle shell promptsegment (#731) - Structured
blame --output jsonwith per-line principal + agent attribution (#322) - npm/TypeScript client: a transport-agnostic
Heddleclass over the CLI's JSON contract, backed by generated TS types and full JSON-contract coverage for harness ops (#592, #588) daemontransaction-replay state machine for crash recovery of leftover transaction sentinels (#47)push --mirrorfor ad-hoc dual-push (#227)- Device-key binding-signature fields on
RegisterPublicKeyRequest(crates/grpc/proto/heddle/v1/service.proto; tags 16/17/18). Let a client prove that the same WebAuthn authenticator that issued the attestation also signs the renewal-anchordevice_public_key, closing a gap where a client could attach an unrelated Ed25519 key to a real attestation. The challenge the assertion signs isbase64url(SHA256("heddle-device-binding-v1" || 0x00 || device_public_key))(#131)bytes device_binding_client_data_json = 16;bytes device_binding_authenticator_data = 17;bytes device_binding_signature = 18;
Fixed
- P0 semantic-merge corruption: containers modeled as first-class tree nodes so 3-way merge no longer silently mis-nests or erases subtrees (#506, #92)
- Conflict markers anchored at column 0; indented conflict-marker recognition fixed (#82, #724)
- Lossy attribution for cached git subtrees no longer double-counts on importer cache hits (#711)
undothreadbase_staterestore corrected; thread-base refresh now routes through the oplog so it round-trips (#677)- Mount/FUSE made to work end-to-end on Linux (three production-blocking bugs), with an out-of-process
heddle-fuse-workersubprocess for callback isolation; Windows ProjFS production-hardened (#85, #225, #96) - Fail-loud fixes across the read/sync/config paths: broken GitHub REST pagination, unreadable hydration state, and TLS/auth config-read failures now error instead of silently degrading (#450, #448, #446)
- Dozens of correctness and durability fixes across the oplog, pack, refs, and objects paths, checked arithmetic in the pack-size/offset decoder, per-entry content-hash validation on
install_pack, advisory-lock stale-lock reaping, atomic transaction-sentinel writes, and HEAD reconstruction from Snapshot/Goto records (#396, #395, #447, #527, #394, and others)
Security
- Path-traversal hardening: a
..-traversal bypass in namespace/repo access checks closed via a shared segment-aware helper; namespace scope grants downward access only (#638, #628) - Materialized symlink targets validated against the repo root (capture already checked them; materialization did not) (#430)
- Atomic secret-write primitive: temp files created
0600before any bytes are written, with hard errors on bad perms (#428) - Daemon hardening:
SO_PEERCREDpeer-identity enforcement, secured socket bind, and a validatedtransaction_idat the RPC boundary to close a path-traversal vector (#626, #699, #441) - Bounded received-blob sizes on redaction / state-visibility / native-pack transfers to cap untrusted input (#530, #417)
- Supply-chain gate:
cargo-audit+cargo-denyadded to CI; dropped a yanked dependency and scrubbed real personal data from example/test fixtures (#40, #376)
Performance
tree_diffrewritten as a sorted merge-join with deterministic order and no per-entry allocations; internal-iterationdiff_trees_visitfor streaming/early-exit consumers (#422, #399, #635)statussped up: deduped redundant git-overlay passes, an index stat fast-path, and reducedcompare_worktreeget_treeoverhead (#560, #556)- Pack and push hot paths: zero-copy
install_packvalidation, eliminated whole-packto_vec()clones, and dropped a redundant second proto-object encode on push (#421, #416, #544) adopt/import routed through the streaming pack builder and written as a single pack;O(entries²)oplog batch collection made single-pass;O(n²)reflog SHA dedup eliminated (#558, #719, #415, #704)- Native-git engine micro-benchmarks (hashing, compression, pack I/O, tree-diff, delta) and an oplog throughput bench, gated by a weekly scheduled CI workflow (#432, #433, #435)
Distribution
- Homebrew cask:
brew install --cask heddleco/heddle/heddle(tapheddleco/heddle), the default install on macOS, with a brew-audit-clean generated cask (#740) - Signed, notarized universal
Heddle.appDMG with the embedded FSKit module and version-aware enable UX ships alongside the CLI (#666, #686, #687) - Prebuilt binaries on GitHub Releases for macOS (arm64, x86_64), Linux (arm64, x86_64), and Windows (x86_64); the binary release pipeline cosign-keyless signs every artifact with a
SHA256SUMSmanifest (#69) - Linux builds pinned to a glibc 2.35 floor (Debian 12 / Ubuntu 22.04) for broad portability (#554)
- Workspace crates auto-publish to crates.io on push-to-main (#73)
sley (native git substrate)
The git substrate behind git_substrate reached crates.io 0.0.3 (20 sley-*
crates) and closed a large slice of git-parity over this window:
- Shared CLI-layer engines instead of per-command handlers: a parse-options engine +
DateMode,setup_revisions, sharedDiffOptions, astrbuf_expandformat substrate, agrep-sourceengine, and anunpack-treestree-merge engine, withlog,rev-list,branch,diff,show,for-each-ref,format-patch, and others migrated onto them (sley #51, #61, #56, #64, #71, #84) - Conformance gains against the git oracle:
fsck(object-content checker),reset(ORIG_HEAD, parse-options),status(config-aware format + submodule summary),format-patch(headers, cover letter, threading),am/apply(3-way fallback),rm, andupdate-ref --stdin(sley #94, #92, #88, #89, #100, #90, #103) - Read- and write-path perf: mmap commit-graph, loose-object presence cache, buffer reuse, and a once-per-command
.gitattributesmatcher (sley #98, #79, #101, #78)
0.2.4 - 2026-05-14
Added
RedactionTransfergRPC message + oneof variants (crates/grpc/proto/heddle/v1/service.proto). Out-of-pack transport for redaction sidecars on hosted-gRPC push and pull.- New
message RedactionTransfer { string blob_hash; bytes redactions_blob; }. - Added as variant 5 to
PushMessage.bodyoneof and variant 6 toPullMessage.bodyoneof. - Sender emits one per blob hash with an active redaction in the
state closure; receiver routes through
Repository::accept_wire_redactionsfor signature + trust-list verification.
- New
Sidecars live structurally outside .heddle/objects/ (so GC can't
reach them) and therefore can't ride the native-pack object
channel. This release closes the follow-up flagged in 0.2.3's
"hosted-gRPC redaction transport" note. Server-side biscuit
capability gating + the actual handler wiring lives downstream of
heddle (in weft-server), so this release is purely the wire-format
addition.
0.2.3 - 2026-05-14
Added
- Cross-replica redaction wire propagation (#12). A signed
Redactiondeclared on one replica now propagates via the existing object-transfer machinery and the receiver replays it: verifies the signature, checks the signer against the trust list, persists the sidecar, and replays anypurged_atbyte-removal locally.- New
wire::ObjectType::Redactionvariant;enumerate_state_closureemits a Redaction entry for every blob in the closure that has a sidecar. - New
ObjectStoretrait methods for sidecar access:has_redactions_for_blob,get_redactions_bytes_for_blob,put_redactions_bytes_for_blob,list_blobs_with_redactions. Default impls return empty;FsStoreandInMemoryStoreimplement. - New
Repository::accept_wire_redactions: decodes the incomingRedactionsBlob, refuses unsigned records, rejects signatures from untrusted keys, rejects tampered records, then merges via content-addressed idempotency. Records withpurged_at: Some(_)drive a localpurge_blob. - New
WireRejectionenum:Unsigned|Tampered|UntrustedKey { algorithm, public_key }. Trust gate is fail-closed: an empty trust list rejects every signed redaction. - New
[redact] trusted_keysrepo config section. Operators manage via the new CLI subcommands:heddle redact trust add --from-pem <path>(or--algorithm <a> --public-key <hex>)heddle redact trust listheddle redact trust remove <hex>
LocalSyncferries redaction sidecars during local→local copies. Propagation runs unconditionally on every state walk, so the redact-after-peer-fetched flow re-syncs correctly even when no new objects are copied.heddle fetch <remote>no longer short-circuits when the state is already present locally; the redaction sweep needs the walk to run.
- New
- Ignore-hint on
redact/purgeoutput (#12). After a redact/purge, the working-tree file is unchanged, the nextheddle capturewould re-snapshot the leaked bytes. The CLI now emits a hint pointing at.heddleignoreif the path isn't already covered by heddle's effective ignore set (.heddleignore+ repo configworktree.ignore). Coverage check uses gitignore-spec globs. .heddleignoreupgraded to full gitignore-spec (#12).*and**globs, character classes ([abc]),!negation rules, leading/for root-anchored matches, trailing/for directory-only. Both matchers (objects::worktree::should_ignoreand the compiledWorktreeIgnoreMatcher) delegate toignore::gitignore. Legacy patterns behave identically; the three root-admin special-cases (.heddle,.heddleignore,.git) stay root-anchored.
Changed
WorktreeIgnoreMatcher::fingerprinthashes raw pattern strings in declaration order (was: sorted). Gitignore semantics are order-sensitive,*.logthen!keep.logis not the same as the reverse. Cache keys reflect that now.wire::native_pack::build_native_packskipsRedactionentries; sidecars live structurally outside.heddle/objects/so GC can't reach them and they don't enter the content-addressed pack.wire::object_transfer::store_received_objectrefusesObjectType::Redactionso callers route viaRepository::accept_wire_redactions(forcing signature verification).
Security
- Closed a spoof vector in cross-replica redaction propagation:
before this release,
verify_wire_redactionaccepted any mathematically-valid signature because it verified using the public key embedded in the redaction itself. An attacker could mint a redaction, sign with their own key, and pass. The new trust gate ties acceptance to an operator-configured[redact] trusted_keyslist. Fail-closed default rejects every signed redaction until the operator explicitly trusts a key viaheddle redact trust add.
0.2.2 - 2026-05-14
Added
- New
heddle-clientcrate, the hosted-backend command implementations (auth,support,presence), the gRPC client wrappers, and the global credential store. Moved out of the closedweftworkspace and into OSS heddle so the workspace builds standalone with--all-featuresand third-party hosted clients can extend via the public gRPC protocol surface rather than a closed crate.
Changed
heddle-cli: optional depweft-client = "0.0"→heddle-client. The feature gating that dep renamedweft-client→client.heddle-cli-shared:UserConfig::weft_client_config→UserConfig::heddle_client_config.
Note
- The
weft-clientplaceholder crate on crates.io (v0.0.0) is now unreferenced. Safe to yank.
0.2.1 - 2026-05-14
Fixed
oplog:Repository::op_scopeno longer canonicalizes HEAD to its absolute filesystem path. Every recorded op was embedding the user's home directory and username (/Users/<name>/.../.heddle/HEAD) into the oplog. The fix records a blake3 digest of the canonical pointer path (wt-<16-hex>), stable per checkout, unique across worktrees that share an oplog backend, opaque on disk.
0.2.0 - 2026-05-13
First public release on crates.io. The CLI and its workspace ship as
heddle-* crates under Apache-2.0. The hosted backend is closed and
links these crates from a separate workspace.
Added
- Build flavors:
git-overlay,native, both, pick at install time via Cargo features weft-client-shimtrait surface for closed-side hosted-client integration- TTY-aware CLI flags, error hints, and inline examples on the most-used commands
Changed
- FsStore reads from packfiles before falling back to loose objects
gccommand creates packfiles instead of being a no-op
Fixed
git_import:timestamp_opt().unwrap()replaced with.single().ok_or_else(...), prevents panic on out-of-range Git commit timestampsinit:current_dir().unwrap()replaced with proper error propagation, prevents panic when working directory is inaccessiblepacked_refs:save()now uses a random temp-file suffix to prevent concurrent-write collisionsfs_pack:pack_objectsnow callssync_all()after writing pack and index files for crash durabilityfs_pack:prune_loose_objectshandlesNotFounderrors atomically instead of using a TOCTOUexists()checkrefs_manager:delete_trackdelegates toupdate_refsfor atomic, locked deletion of both loose and packed entriesrefs_manager:set_remote_trackusesok_or_elseinstead ofunwrap()onpath.parent()refs_manager:delete_remote_trackignoresNotFounderrors fromremove_fileto handle concurrent deletesrevert: validates target tree exists before proceeding instead of silently usingunwrap_or_default()clone:copy_worktreeandcopy_dir_recursivecorrectly handle symlinks instead of following themState::with_change_idinvalidates cached content hashes when it rewrites logical identityheddle-grpc: bundles the proto file inside the crate socargo publishships itheddle-cli: excludestests/realworld_git/fixtures/andtests/snapshots/from the published tarball to stay under the 10 MB crates.io limitheddle-ingest,heddle-daemon: forwardgit-overlay/nativefeatures through workspace dependencies
Tests
- 450+ tests passing across the OSS workspace
Documentation
- README.md: install paths + feature flavors
- AGENTS.md: updated known limitations and status
- docs: 2026-04-14 Rust workspace audit covering docs/code alignment, public surfaces, and verification results
- docs: 2026-05-12 CLI dep audit from dogfooding session
2026-05-12: OSS extraction prep
- Daemon trait extraction,
git-overlay/nativemode gating,weft/andtapestry/renames, SPDX headers across the workspace - CLI polish for OSS, TTY-aware flags, error hints, examples, docs
2026-05-11
- Workflow integration, 17 plan items, 24 Codex review fixes, OSS prep
- build: trim dev-profile debug info for faster incremental links
2026-05-09: Git-overlay foundation
- OSS Heddle CLI: git-overlay foundation, threads, real-world fixtures
- Native git-overlay replacement workflows
- Linked-worktree write-through
- Reflog UX and real-world Git stress fixtures
- Default
bridge git importpath to current repo - Tag-scoped git-overlay history guidance
2026-05-05: Mount and daemon
- feat(mount): virtualized threads, heddled daemon, reflink CoW worktrees
ContentAddressedMountprojects(StateId, overlay) → POSIX FSvia thePlatformShelltrait; stateless on the read path- Two-tier write model: in-memory buffers → CAS-promoted blobs on flush/release/idle
- Clock-driven safety sweep promotes idle buffers (default 5s)
- Heddled daemon (opt-in
--daemon): mounts stay alive across CLI invocations; shared scaffolding incrates/repo/src/daemon/ - Linux FUSE shell via
fuser, gated--features fuse - 39 mount tests including proptest, cross-thread dedup, crash recovery
2026-05-01
- perf: pack-batch snapshot blobs (32s → 117ms) + reload-on-miss for multi-instance
- Bridge ingest, provenance, and semantic-hotspots overhaul
2026-04-30
- Rename project [redacted] → Heddle
- 14 Rust crates renamed:
[redacted]-X→ bareX([redacted]-core→objects) - CLI binary:
[redacted]→heddle - Proto package:
[redacted].v1→heddle.v1 - Workspace
[lib]name overrides dropped so each crate's library name defaults to its package name
- 14 Rust crates renamed:
2026-04-23
- Claude Code hook integration + ingest matcher/loader fixes
2026-04-22
- Add constraint/invariant/rationale annotation taxonomy
AnnotationKind { Constraint, Invariant, Rationale }shipped end-to-end through object model, proto, gRPC, CLI, and web--kindflag on context subcommands (defaultrationale)- JSON output renders the kind alongside text
2026-04-21
- Workspace control tower + bare
Repository::initrefactorRepository::initis now a bare primitive;init_defaultseeds amainthreadseed_default_threadmade public; init is no longer undoablethread_is_unclaimed_bootstraplets the git bridge tolerate a seeded main while catching real divergence
- feat(ingest): import git history with agent attribution + reasoning annotations
2026-04-18
- Performance improvements
2026-04-13
- Improve local performance across status, history, and oplog paths
- Add low-ceremony workflow commands and sync thread metadata
2026-04-04
- Remove hosted CLI subcommand from the OSS surface; review pipeline lives in the closed workspace
2026-03-24
- Add semantic diff classification, noise filtering, and blast radius analysis
- Refactor: split oversized files, fix clippy warnings, and audit
unwrapusage
2026-03-20
- Make undo lane-local across parallel worktrees
- Refine thread-first CLI and workflow APIs
2026-03-15
- feat: semantic rename/move detection in three-way merge
- Three-signal composite scorer (delta similarity, tree-sitter AST similarity, path heuristics)
- Rename/rename and rename/delete conflict detection
- Directory rename inference from grouped file renames
- CLI output:
Rlines in text,renames/directory_renamesin JSON - 22 unit + 9 integration tests
2026-03-14
- fix: recursive three-way merge and tree materialization
three_way_mergerecurses into subtrees when both sides have a tree entry at the same nameapply_merged_tree(merge) andapply_tree_to_worktree(cherry-pick) delegate to recursive checkout instead of writing only top-level entries
- chore: clean up feature-gated builds and remove unused
state_pack
2026-03-13
- feat(core): add context annotations for file/symbol/line-range metadata
- Parallel context tree mirrors the content tree; content-addressed and version-tracked
- CLI:
context set / get / list / rm
2026-03-12
- feat(core): delta compression, V1/V2 pack format, and bridge migration tests
- Path-aware delta compression with sliding window base selection
- Git-style copy/insert delta encoding
- V2 varint-encoded pack format with raw zstd compression
- Auto-pack on import; improved pack reader and base selection
- refactor: extract
coreand thincli/server
2026-03-11
- refactor: extract
refsandoploginto workspace crates - feat: replace the custom wire protocol with gRPC transport
2026-03-09
- refactor: rename
tracks→threadsacross the codebase
2026-03-07
- Finish pure-Rust git transport merge, gitoxide bridge and fetch integrated; end-to-end transport and CLI coverage added
2026-02-20: Multi-agent worktrees
- feat: multi-agent parallel worktrees + security/correctness fixes
Repository::opendetects.heddleas a file (object-store pointer) for filesystem-isolated agent checkouts that share one storeRefManager::with_local_headgives each checkout its own HEAD file so concurrent agents on different threads don't contend on HEADworktree add <path> [--track] [--from]materializes a state into a new isolated directory with a.heddlepointer file- Lightweight agent session registry stored as TOML under
.heddle/agents/ - 22 multi-agent worktree integration tests
- fix: symlink validation bypass, unhandled symlinks in status, non-atomic oplog writes
- Replace
canonicalizefallback with lexical normalization to prevent path traversal via dangling symlinks - Atomic-write pattern (temp file +
sync_all+ rename) for oplog writes
- Replace
2026-02-19
- refactor: split all oversized files to comply with the 300-line limit; split
refs_transactionsbelow 300 lines - fix: packed-refs CAS bug
- fix: 14 panics, races, and durability issues from internal code review
2026-02-17: v0.1.1 (internal milestone)
- feat: extensible cryptographic state signing trait (Ed25519, RSA, P-256)
- feat: shallow clone support with
--depth N - feat: packfiles for efficient storage
- feat: hooks system for repository lifecycle events (
hook list/installfor pre/post snapshot/merge/rebase) - feat:
bridge git syncfor bidirectional git-heddle synchronization - feat:
file://protocol support for local repository sync - feat: proper blame and rebase with commit replay (
--abort,--continue) - feat: bisect session validation (requires
bisect startfirst);good/badaccept optional commit defaulting to HEAD - feat: clean, revert, stash, and merge commands
- feat: cherry-pick command for applying specific commits
- feat: fsck command for repository integrity verification
- feat: fetch and clone commands for remote repository bootstrapping
- feat: resolve command with
--ours,--theirs,--all,--abort - feat: completion command for shell completion scripts
- feat: tracing instrumentation for snapshot, tree, and store operations
- feat: merge-state tracking in
.heddle/MERGE_STATE - Tests: 395+ tests passing, 2 ignored (file:// protocol, macOS permissions)
2026-02-09
- Add
.heddleignoresupport and unified ignore handling - Improve CLI test coverage and state-spec resolution
- Add Apache-2.0 license and NOTICE metadata
2026-02-02: Foundation
Initial implementation of an AI-native version control system, landed as five phases over a single development sprint.
Phase 1: Foundation
- Initial project structure
- Object model:
Blob,Tree,State,Action - Basic CLI with clap
- Filesystem storage implementation
- Configuration management
Phase 2: Core VCS
- Content-addressed storage with BLAKE3
- Change IDs for stable identifiers
- Tracks and markers for branching
- Operation log with undo/redo
- Worktree management
snapshot,log,show,gotodiffandcompareforkandcollapse
Phase 3: Semantic diff
- Tree-sitter based code parsing
- Function-level change detection
- Rename detection across files
- Import/export analysis
- Semantic diff output format
Phase 4: Wire protocol primitives
- Length-delimited framing for the wire protocol
- MessagePack serialization for all protocol messages
- Capability negotiation between client and server
- Reference advertisement (
ListRefs/RefsList) - Object-transfer message shape with state-closure computation
- The
wireandgrpccrates publish asheddle-wireandheddle-grpc; consumers build their own client/server on top
Phase 5: Git bridge
- Bidirectional git-heddle synchronization
- Pure-Rust git transport via gitoxide
Next
- Install: pick a release and run it.
- GitHub releases: tagged builds with checksums.