Releases: libra-tools/libra
Release list
v0.18.91
Git Surface Expansion
Remotes & refspecs (v0.18.61)
- fetch now honors full refspec mappings: configured remote..fetch mappings, exact :, and one wildcard per side. Destination/reflog/remote-HEAD writes are transactional; non-fast-forward mappings without +/--force fail closed. --prune deletes tracking refs against the effective configured destination mapping.
- remote gains set-branches, set-head, and remote update (with remotes.default and remote-group expansion). rename transactionally migrates refspec destinations, branch upstreams, tracking refs, and reflogs, rolling back entirely on any namespace conflict.
Non-interactive merge/rebase/history controls (v0.18.62–
- rebase: --autostash, repeatable sandboxed --exec, --update-refs, --fork-point, --onto, --autosquash, --reapply-cherry-picks. - merge: the -s ours strategy, -X ours/theirs strategy ohistories, --log[=], plus the Libra extensions--dry-run (zero-write preview) and --restart. - reset: guarded --merge/--keep modes with snapshot-and-c-from-file/--pathspec-file-nul, and symlink-modefidelity. - cherry-pick/revert: --cleanup=, -X ours/theirs, utoupdate, multi-commit auto-continuation for revert, and a unified sequence_state cross-operation sequencer mutex.
The diff feature series (v0.18.65–0.18.76, six installments) - Review metadata controls: --src-prefix, --dst-prefix, - Pickaxe search: -S (occurrence-count change) and -G (regex-matched hunks). - Word-level diff: --color-words[=] (v0.18.70) an.71).
- Selectable algorithms: --diff-algorithm=<myers|minimal|patience|histogram> with --minimal/--histogram shorthands (v0.18.73; hardened under audit in v0.18.74/75).
- Anchored patience: --anchored= (v0.18.76).
Revision parsing & plumbing (v0.18.78/79)
- Typed peel ^{commit|tree|blob|tag|object}, recursive ^rs @{N}, and REV:path — wired uniformly throughrev-parse, cat-file (including batch modes), show-ref --dereference, and branch --points-at.
- New/extended plumbing: commit-tree (side-effect-free cree --index-file (scratch index that never touches theshared .libra/index).
Sandboxed repository hooks (v0.18.80)
- A .libra/hooks lifecycle covering commit, checkout/swill — structured arguments, allowlisted environment,offline required sandboxing, and bounded I/O. --no-verify and LIBRA_NO_HOOKS provide escape valves; .git/hooks is never executed.
Migration & interoperability (v0.18.82)
- fast-export/fast-import expanded (multiple revisions, ted tags, notes, inline blobs, copy/rename, atomicpublication); bundle gains --all/--branches/--tags, full checksum verification, and hash-kind-aware unbundle — covering SHA-256 repositories and system-Git round trips.
Mail patch workflow (v0.18.84–0.18.87)
- libra am (v0.18.84): a minimal mail patch sequencer with --continue/--skip/--abort, crash-safe recovery, and atomic branch advancement.
- libra mailinfo (v0.18.85): repository-independent mailone bounded parser with am.
- format-patch (v0.18.86): -1/--root, threaded cover letters, and strict format.* config defaults — proven by a seven-scenario Libra↔Git am
interoperability suite. - send-email (v0.18.87): explicitly documented as a non-sending policy surface.
Other improvements
- checkout - / switch - previous-target shortcut (v0.18.
- Installer: optional movable lba -> libra alias symlink (v0.18.88).
- Agent session list shows relative times; reset command
AI Agent Session-Capture Pipeline (plan-20260713 DR seri
- M1 (v0.18.72): the unified TranscriptSource seam (DR-0col with golden vectors; theagent_coverage_claim/revision gate schema with redact-before-digest and semantic type validation; a claim state machine with fenced
takeover; a single-transaction ref+catalog+revision+clai live path first. - M2 (v0.18.77): Claude session discovery (~/.claude/projects/ resolution with symlink rejection and root containment); bounded
fail-closed Codex rollout discovery; the transcript flus/02/03). Multiple hardening rounds followed: globalfan-out/deadline bounds, home-independent CODEX_HOME, authorized and bounded transcript preparation. - M3 (v0.18.81): the OpenCode export bridge (DR-04b) — ttrusted, sandboxed opencode export subprocess under arequired bwrap offline profile, coordinated by the agent_export_job generation/lease scheme, with cross-path digest parity. Hardened across
five Codex review rounds (RLIMIT_FSIZE cap, fd-pinned WAe pin closing the check-to-bind race, bounded bwrapprobe, and more). - M4 foundation: agent_import_identity + agent_import_to (DR-05c/DR-06), laying the groundwork forcrash-recoverable imports and tombstone propagation.
Robustness, Release Engineering & Documentation
- Future-schema config degradation (v0.18.89, P0-12): local commands now skip a future-schema global config store with a deduplicated
warning instead of failing with LBR-IO-001; all other reosed (pinned by a 12-case regression suite). - Unmerged conflict-code closure (v0.18.91, P0-01): all seven porcelain v1/v2 unmerged XY codes (DD/AU/UD/UA/DU/AA/UU) pinned by unit tests
plus real merge-conflict fixtures. - Benchmark tooling (v0.18.90): new benchmark/ suite (run.sh harness + test runner).
- Documentation: professional README overhaul for the opLAUDE.md trimmed; agent tracing docs synced to code truth (A0-02/A0-09).
- Test stability: concurrent-rollback contract stabilizegated, OID-pinned fixtures gated on presence.
- Note: v0.18.67–0.18.69 were version-contention resolution releases under the concurrent-push protocol (version numbers consumed, no standalone features).
v0.18.60
Libra 0.18.60 — Release Notes
Release date: 2026-07-13
Theme: feat(commit): honor status template defaults
This release completes Libra's "honor Git config defaults" line by making commit's editor status template Git-compatible by default, and it lands a hardened, resource-bounded implementation of the commit --dry-run / -a preview path. It also
ships a gitlink-directory safety fix for restore.
Highlights
commit: status template is now included by default (Git-compatible)
The commit-message editor template now seeds the working-tree status as #-commented lines by default, matching Git. Previously Libra omitted it unless you passed --status.
- commit.status=false disables the status section.
- --status / --no-status explicitly override the config for a single commit (last flag wins).
- The status lines are comments, so message cleanup always strips them — they never enter the final commit message.
- Only paths that can actually open an editor and strip comments read the key. -m, --dry-run/--porcelain, --json, and non-stripping cleanup modes (verbatim/whitespace/scissors) bypass it entirely, so the status can never leak into a message.
libra commit # editor template now includes the commented status
libra config commit.status false
libra commit --status # re-enable for just this commit
libra commit --no-status # omit for just this commit
commit.status follows the strict local → global → system cascade and accepts Git boolean forms (including numeric values). An invalid value fails fast with LBR-CLI-002, and an unreadable config store fails with LBR-IO-001 — both before -a,
hooks, object writes, or history updates.
Hardened, resource-bounded commit --dry-run / -a preview
The dry-run preview path was reworked to be safe, isolated, and bounded:
- Index isolation: --dry-run -a runs against a task-local temporary index. The live index is never replaced, and temporary auto-stage blobs, LFS backups, and tree objects are not persisted.
- No side effects: dry-run and porcelain previews skip the pre-commit hook, the editor, rerere updates, and post_commit automation because no commit occurs.
- Bounded verbose previews: every unique changed/staged/auto-staged blob is reserved before loading, with limits of 32 MiB per blob, 64 MiB aggregate scratch, and 4,096 objects. Over-limit declarations are rejected before decoding; the preview
reads existing pack indexes only and never rebuilds them; remote-only or index-missing blobs are refused up front. On a limit hit, Libra advises rerunning without -v and leaves the live index and object store untouched. - Bounded scratch: preview scratch lives under shared repository storage at .libra/tmp/commit-preview (shared by linked worktrees), is capped at 256 MiB across concurrent runs, and scavenges stale runs (older than 24h) on a bounded startup
scan. Runs with missing/unreadable reservation metadata fail closed rather than being charged as zero. - Symlink-safe auto-stage: tracked symlinks (including dangling links and LFS-pattern paths) are detected without being followed; the link-target bytes are hashed and mode 120000 is preserved in both real commits and previews.
- Durable real -a: blob/LFS materialization streams to a temporary snapshot, derives the pointer from those exact bytes, and atomically replaces any stale/truncated backup. Under --sync-data, staging and destination directories are fsync'd
around the atomic replacement (Windows uses a write-through atomic replace). - Fail-closed I/O: auto-stage read failures surface as LBR-IO-001; preview/LFS-backup/object-write failures as LBR-IO-002 — no panics. When status.showStash=true, an unreadable/non-file stash ref or corrupt stash log aborts template collection
with LBR-IO-001 before any hook, editor, or ref write.
restore: gitlink directory safety
restore can now safely remove an empty materialized gitlink directory or replace it with a regular file, symlink, deletion result, or rebuilt conflict-marker file (--merge / --conflict=diff3). All selected directory transitions are preflighted
before any write, and a non-empty directory is refused — so nested repositories and user files are never recursively deleted or left behind after a partial multi-path restore.
Compatibility
- COMPATIBILITY.md updates the commit row to document the new commit.status default, the preview resource boundary, and the durability guarantees, plus a new Restore gitlink directory safety section.
- No breaking CLI changes. The only behavior change is that commit's editor template now shows the commented status by default; set commit.status false (or pass --no-status) to restore the previous behavior.
Documentation
Updated command docs (EN + zh-CN) for commit and restore, and their development-doc counterparts.
Testing
Adds a suite of tests/compat/config_defaults_commit_status* guards covering the status-template default, auto-stage limits, I/O and recovery failure modes, verbose previews, and side-effect isolation, alongside updated commit/restore
integration tests.
v0.18.22
Maintenance release focused on Git-compatibility correctness for case-only renames, hardening of the AI agent/Code-UI runtime, and release-pipeline automation.
🐛 Bug Fixes
- libra add / libra status — case-only renames (#435). Renaming a tracked file or directory by case alone (e.g. slides/ → Slides/) no longer raises a false LBR-CASE-001 case-collision error. Such paths are now treated as aliases of the tracked entry, while genuine case-fold twins remain protected by same-file identity comparison. libra status no longer keeps reporting the old-cased path as untracked (?? Slides/) and now honors core.ignorecase consistently across its untracked-scan wrappers.
✨ Improvements & Hardening
- libra agent clean --gc now enforces stderr retention. The agent.retention.stderr_days setting (default 30) is now wired in: --gc prunes reviewer *.stderr.redacted.log files from aged, terminal review/investigate runs while preserving the aggregate record (state, manifest, findings, and stdout). This previously-dead configuration is now effective, with fail-closed guards against symlinked reviewer directories, non-terminal states, and time overflow.
- Deterministic headless Code-UI tool-call projection. Fixed a pre-existing race in the headless runtime where out-of-order on_tool_call_start/_end tasks could clobber a completed state with a late running, leaving plan / tool-call / transcript rows stranded (~40% flaky). An ordering barrier plus a monotonic upsert guard make the projection deterministic.
🚀 CI / Release Automation
- Homebrew tap auto-update on release (#436). The release workflow now updates the Homebrew tap automatically when a version is published.
📚 Documentation
- Added mainline gap-analytics documentation and refreshed the sandbox gap analysis.
- Recorded the tracing-plan §11 completion audit and documented deliberate deferrals (preview/opt-in external-discovery; MCP authz gating; web-only headless IntentSpec approval).
- Added docs/development/experience/pr.md, a development note for the future libra pr workflow.
Full Changelog: v0.18.21...v0.18.22
Want me to:
- Fix the bump commit / version mismatch (the subject says 0.8.22 — should I amend or add a follow-up so the tag/commit read 0.18.22)?
- Add this to CHANGELOG.md (the top [Unreleased] section currently has no 0.18.22 heading)?
- Trim it down to the minimal GitHub auto-notes style (just #435 / #436 + compare link)?
v0.18.21
v0.18.20
What's Changed
- fix(install): update canonical install URL to download.libra.tools by @genedna with @Copilot in #430
- chore: bump git-internal to 0.8.2 by @Ivanbeethoven in #428
- [codex] fix stash pop index preservation by @genedna in #429
- fix(reset): support git-style bare path reset by @genedna in #431
New Contributors
- @genedna with @Copilot made their first contribution in #430
- @Ivanbeethoven made their first contribution in #428
Full Changelog: v0.18.15...v0.18.20
v0.18.15
v0.18.7
v0.18.6
v0.18.1
v0.18.0
What's Changed
- feat(rebase): support autosquash options by @marshawcoco in #411
- feat(ls-files): expand compatibility for pathspec and script output by @Forcel48 in #415
- Add operation history layer with CLI integration and validation coverage by @MichaelCao0 in #407
- feat(format-patch) by @huimoubht in #416
New Contributors
- @Forcel48 made their first contribution in #415
- @MichaelCao0 made their first contribution in #407
- @huimoubht made their first contribution in #416
Full Changelog: v0.17.1513...v0.18.0