Show HN: Oak – Git replacement designed for agents

Oak is a new Git-replacement tool specifically designed for AI agents to manage code repositories. It features a lazy working tree and is optimized for automated agent interactions rather than human-centric workflows.
Why it matters
As AI agents become more involved in software development, specialized tools like Oak are necessary to handle the unique requirements of machine-driven code management.
$ oak mount oak/oak Lazy working tree — no full clone $ oak space new oak New multi-repo agent space for the org Log in oak Reviews Files Reviews 0 open branches 3 merged · 24h 310 merged · all-time Recently active Least recently active Newest created Name (A–Z) Open 0 merge when ready Nothing here. Merged 265 Closed 45 Merged 265 shipped recently Summary Author Age Merged 9e5c7821 Make the oak CLI build and run on Windows Z zdgeier 13hr ago Merged 0f4dc780 zdgeier-37e279 Z zdgeier 16hr ago Merged a01eaf74 Harden permissions on the repo SQLite database (0600) Z zdgeier 17hr ago Merged 9126371f oak merge: recover from an already-closed branch instead of erroring Z zdgeier 1d ago Merged c69ef2f0 Restyle the oak login browser pages to the black & white oak.space design Z zdgeier 1d ago Merged baf24be5 Fix agent-facing branch review and triage JSON truthfulness. mrmrs 1d ago Merged e6d47b02 Release v0.99.0 Z zdgeier 1d ago Merged 9ffcfdb4 Deepen agent action metadata behind a command-aware module. mrmrs 1d ago Merged d8c14842 Fix launch action-contract drift found after the main landing. mrmrs 1d ago Merged 9c088210 Harden launch agent contracts: mount finish now preflights auth and remote reachability before local mutation and reports finish-phase JSON; branch review/triage action detail now reuses agent-state mutates/network/freshness semantics, avoids destructive resolve --clean, and includes n10/n100 scale gates; docs use JSON-first finish. mrmrs 2d ago Merged e68d4623 Align mount diff JSON paging and line stats with regular diff. mrmrs 2d ago Merged a36dadc9 Repair finish remote preflight to match push semantics. mrmrs 2d ago Merged 64e4f49f Make agent-state recommended_action.kind a closed enum. mrmrs 2d ago Merged 9ea09622 Fix commit --push JSON failure semantics. mrmrs 2d ago Merged 1a7db378 Fail closed when switch target root manifest is missing. mrmrs 2d ago Merged 7f3bcdd6 Hydrate missing local switch blobs from the remote. mrmrs 2d ago Merged 8080d5b5 Speed up git import and stop control-character authors aborting it Z zdgeier 2d ago Merged f2bba1cc Name mounted virtual branches after the task, not the repo Z zdgeier 3d ago Merged a8be887d Updates AGENTS.md with current Oak positioning, an explicit isolated-worker rule, and a finishing checklist requiring agents to commit, describe, and push reviewable branches. Why: agents working on oak/oak must not mutate canonical checkouts or leave local-only checkpoints invisible to reviewers. mrmrs 3d ago Merged ad690185 Adds a non-mutating release-proof target and runbook, plus current 0.98.0 README launch-copy sync. Why: the manual proof was running oakvcs-cli cargo publish --dry-run before oakvcs-core existed on crates.io, which is expected to fail and contradicted the real publish-crates workflow. The new proof encodes the workflow-correct core dry-run plus CLI build proxy, verifies version lockstep, and makes release signing smoke explicit/fail-closed when requested. mrmrs 3d ago Merged f82ca98a Reposition docs around "agentic substrate" Z zdgeier 3d ago Merged d8cd7b18 Make large-repo mount startup root-only and lazy over committed trees. mrmrs 3d ago Merged b0f8eb59 Remove unused docs, agent-skills, and duplicate core license/CLAUDE files Z zdgeier 4d ago Merged 550f832f Release v0.98.0 — bump workspace version 0.97.0 → 0.98.0 Z zdgeier 4d ago Merged 1252cb9d Fix CI: give the git backend a fallback identity so reflog writes work without user.name/email Z zdgeier 4d ago Merged 70a2c232 Sync agent docs with the launch contract: use oak switch --clean, replace manual space commit/push/desc/end instructions with the preflighted finish saga, and clarify that finish is retryable rather than rollback-atomic. mrmrs 4d ago Merged 9d86b901 Fix CI: reorder imports in merge.rs and review.rs to satisfy rustfmt Z zdgeier 4d ago Merged c3926cf1 High-contrast app icon + mount build-output guidance in the space template Z zdgeier 4d ago Merged 4b6efc38 Replace the macOS app icon with the new pixel-art compass mark Z zdgeier 4d ago Merged 23908cea Make `oak merge <branch>` merge main-parent branches without a checkout hop. mrmrs 4d ago Merged 27c0b9c9 Batch remote branch triage preparation for M6 branch-review scale. mrmrs 4d ago Merged 8264d689 Fix rustfmt formatting in cli/ to pass cargo fmt --all --check on pinned toolchain 1.94 Z zdgeier 5d ago Merged 3675f235 Support compact status JSON inside mounts. mrmrs 5d ago Merged 4c6cb60d M3 agent-state recommended_action vNext. mrmrs 5d ago Merged 5aabdcd1 M4 read-only purity plus git-backed write-sidecar repair. mrmrs 5d ago Merged 18ed3c71 Implement M2 finish preflight/saga reporting on current main. mrmrs 5d ago Merged 91f4ee5c Implement Milestone 1 of the agent-native launch contract. mrmrs 5d ago Merged 06ae9bf9 Reject empty/root-only manifest paths while preserving current tree-entry validation. mrmrs 5d ago Merged b1be6166 Apply workspace rustfmt to the landed push and resolve test changes. mrmrs 5d ago Merged 6a7be889 Fix repo-relative path resolution for missing-parent `..` paths without erasing symlink boundaries. mrmrs 5d ago Merged 2d6a4061 Reject every control character in commit identity fields. mrmrs 5d ago Merged 9e518f57 Require `.oak` repository markers to be directories. mrmrs 5d ago Merged faf39462 Use the shared owner/repo validator for push --repo linking. mrmrs 5d ago Merged 54c0f926 Validate clone repository specs before contacting the remote. mrmrs 5d ago Merged 5ce1af9a Validate Oak space organization slugs before using them as directory and API identifiers. mrmrs 5d ago Merged 3c5333e0 Reject all control characters in `oak site` organization slugs. mrmrs 5d ago Merged 9a49201f Reject all control characters in `org/repo` specs. mrmrs 5d ago Merged 069830a0 Reject all control characters in tree entry filenames. mrmrs 5d ago Merged bc1e5ba2 Preserve remote commit file metadata in log mrmrs 5d ago Merged 3cca7243 Speed up oak status and commit change computation by diffing scanned working-tree entries directly against HEAD instead of constructing a full Manifest just to diff. mrmrs 5d ago Merged 5a5d9e56 Make oak switch -c branch creation O(1) for local-main-empty agent repos. Diagnosis on current main: the expected dirty get_status scan is not hit in the benchmark-shaped local path; the O(N) cost was eagerly loading the 50k-entry seed manifest even though seeded_from_current=true means no materialization occurs. The fix loads the seed manifest only when switch -c will actually materialize the worktree, preserving branch/head/current-branch updates and dirty-work carrying semantics. Adds an integration test proving named switch -c preserves modified and new uncommitted files. Validated with cargo test -p oakvcs-cli, cargo clippy -p oakvcs-cli --all-targets -- -D warnings, cargo test --workspace, and release microbench: Oak branch-create 50k median 7.5ms vs Git 10.5ms; 5k remains faster than Git. mrmrs 5d ago Merged 016412e1 Add human-only CLI activity feedback mrmrs 5d ago Merged 3fee99ca Repair parent-main refresh when a local main head is only partially hydrated. mrmrs 5d ago Merged 05665c43 Rebuild pull and clone ingest crash-atomicity on current oak/oak main. mrmrs 5d ago Merged 5a3f1132 Require minisign verification for first-run Oak Mount app installs. The CLI already verified upgrade binaries, but the macOS Mount app auto-install path trusted only SHA-256 from the release server; this branch reuses the release public key to verify the app zip sidecar before checksum/install and adds fail-closed tests. Release and canary workflows now sign/publish OakMount.zip.minisig, and make upload-release refuses unsigned CLI or app artifacts so oak.space cannot publish a release clients will reject. mrmrs 5d ago Merged 40ad17db zdgeier-f3b5b9 Z zdgeier 5d ago Merged aaa99f7d Validate branch rename targets before mutation. mrmrs 5d ago Merged 9da297f5 Validate branch names before creating local branches. mrmrs 5d ago Merged 99d5035a Block oak export from writing inside the destination .git directory. mrmrs 5d ago Merged b1a8acf7 Preserve invalid credentials files when saving credentials. mrmrs 5d ago Merged 84d02db6 Validate release asset filenames before upload or deletion. mrmrs 5d ago Merged 7379fc15 Validate release tags before constructing release API requests. mrmrs 5d ago Merged 028bc14d Validate oak site organization slugs before API calls. mrmrs 5d ago Merged 66dc7c2a Reject remote-unsafe org/repo spec segments. mrmrs 5d ago Merged 210631fc Keep executable files during git-history import. mrmrs 5d ago Merged 683e0af6 Validate git-backed manifest paths before writing git trees. mrmrs 5d ago Merged dddf1de1 Reject duplicate direct names in Tree::new. mrmrs 5d ago Merged 6e45bbb7 Reject ambiguous tree path collisions before storing trees. mrmrs 5d ago Merged 7b8c60f2 Return a missing path when resolving inside the empty tree. mrmrs 5d ago Merged 13fd8b8b Reject out-of-repo restore paths before scanning them. mrmrs 5d ago Merged 1c66e714 Make oak restore . restore the repository root instead of matching no files.\n\nrestore normalized . to the empty repo-relative path but used a local matcher that only recognized exact file paths or target/children. The empty root filter matched nothing, so oak restore . could leave modified files untouched while claiming the requested paths were already at the source state. Normalize targets with the strict repo-relative resolver and reuse diff::path_matches so the empty filter means repository root. Add an integration test that modifies two files and verifies restore . restores both. mrmrs 5d ago Merged 1d17e16b Reject out-of-repo reset paths before walking them. mrmrs 5d ago Merged 71bf1983 Make oak reset . target the repository root instead of matching no files.\n\nreset normalized a root path like . to an empty repo-relative path, then used a local string matcher that only checked exact path equality or target + slash. The empty root filter matched nothing, so oak reset . could report a clean path while leaving modified files untouched. Normalize targets with the strict repo-relative resolver and reuse diff::path_matches, whose empty filter semantics mean repository root. Add an integration test that modifies two files and verifies reset . restores both. mrmrs 5d ago Merged e5f3ac1e Allow oak export to run from repository subdirectories.\n\nexport opened cwd/.oak/oak.db directly, unlike status, commit, restore, and other commands that first resolve upward to the Oak repository root. Running oak export from a nested directory therefore failed even though the process was inside a valid repository. Use the shared resolver to locate the repo database while keeping the export destination relative to the caller's cwd. Add an integration test that commits at the root, invokes export from sub/, and verifies the exported file is present. mrmrs 5d ago Merged 09b11c11 Prevent oak archive from following symlinks outside the repository.\n\nThe archive walker used Path::is_dir/is_file, which follows symlinks. A symlinked directory inside the repo could therefore cause oak archive to recurse into an external directory and include files that are not part of the repository. Classify entries with DirEntry::file_type instead, so symlinks are not traversed or read as regular files. Add a Unix regression test that points a repo symlink at an external temp directory and verifies the external file is absent from the zip. mrmrs 5d ago Merged b691fd7e Fix oak archive so the generated zip is not archived into itself.\n\nWhen oak archive uses its default output path, it creates <repo-name>.zip inside the directory it is about to walk. The previous walker treated that just-created file like normal input, so the archive could contain a partial copy of itself. Pass the output path through the walker and skip the matching entry, with a regression test that opens the default zip and asserts it contains the real tracked file but not the zip file. mrmrs 5d ago Merged b70545cc Harden Oak durability for agent concurrency. mrmrs 6d ago Merged aa6e59c3 zdgeier-07adb4 Z zdgeier 6d ago Merged df53f733 zdgeier-5f8fa3 Z zdgeier 6d ago Merged 10ac2a24 Restore missing JSON output compaction and agent-state schema v2. mrmrs 6d ago Merged 2de7c203 Reduce steady-state status stat-cache prune work mrmrs 6d ago Merged 67ed111c Guard metadata-only branch sync from stale lifecycle state. mrmrs 6d ago Merged ce33612e mrmrs-baf278 mrmrs 6d ago Merged ee7f52fc Exact target-risk detection for branch triage mrmrs 6d ago Merged f53996b6 Add exact branch-wins target-risk detection for conflicted branch triage. mrmrs 6d ago Merged dec0adbc LAND: reuse ephemeral dirty bytes for read-only diff rendering. mrmrs 6d ago Merged 4999f039 LAND: remove redundant can_finish from full agent-state JSON with a schema v2 bump. mrmrs 6d ago Merged c413c527 LAND: compact high-cardinality branch diff/review JSON without losing stats meaning. mrmrs 6d ago Merged bedbcf0f Reuse ephemeral dirty bytes for read-only diff rendering mrmrs 6d ago Merged 76b07e61 Release notes: point GitHub release 'Full Changelog' at the canonical Oak repo (oak.space/oak/oak) instead of GitHub auto-generated notes — this is a PR-less mirror Z zdgeier 6d ago Merged b1ed5517 Fix CI clippy under -D warnings: factor complex branch-row tuple into a type alias in core sqlite, and allow(too_many_arguments) on five triage/review/work_state fns (matching the repo's existing convention) Z zdgeier 6d ago Merged b5fe9531 Run cargo fmt --all on triage.rs to fix CI fmt --check Z zdgeier 6d ago Merged 6dc4e031 Bump version to v0.97.0 for release (workspace, oak-core dep, core crate, lockfile) Z zdgeier 7d ago Merged 233c66e2 zdgeier-6b3867 Z zdgeier 7d ago Merged 1a5b7647 Human conflict status/show output and delimiter-balance warnings on conflict take mrmrs 7d ago Merged 9b3bdf2a Add branch diff --diff-mode and arbitrary-branch merge dry-run mrmrs 7d ago Merged 3a608f73 Fix branch triage metadata call arity after close-reason merge mrmrs 7d ago Merged 892b72c5 Persist explicit close reasons on branch close for agent audit trails mrmrs 7d ago Merged d2d36e11 Allow proven superseded branch triage to close despite merge conflicts mrmrs 7d ago Merged ffbe7c40 Keep diff name-only read-only mrmrs 7d ago Merged 7f52af0a Add concise human oak info output mrmrs 7d ago Merged c5fdd10b Bound compact agent state changes mrmrs 7d ago Merged 226ad5c6 Teach agents the low-token Oak surfaces mrmrs 7d ago Merged 93d58073 Keep remote review recommendations checkout-free mrmrs 7d ago Merged c5d83724 Add recall-preserving branch JSON pagination mrmrs 7d ago Merged 1209bf87 Add bounded branch diff/review JSON output for agents mrmrs 7d ago Merged 0cfe1be0 Add JSON output for conflict take mrmrs 7d ago Merged 7c6c1c63 Prune Oak metadata during worktree scans mrmrs 7d ago Merged 9ae79df1 Classify unlinked repo failures as local config errors mrmrs 7d ago Merged d3b47b5f Explain Oak commit messages on -m mrmrs 7d ago Merged 25b74eb1 Avoid redundant dry-run recommendations in branch review JSON mrmrs 7d ago Merged 17b504d6 Add low-token Git HEAD aliases mrmrs 7d ago Merged c30b1073 Stream piped full diff output without buffering whole diff mrmrs 7d ago Merged ce14c79f Keep agent state read-only mrmrs 7d ago Merged 2b2ff6b0 Document low-token agent reads mrmrs 7d ago Merged 91372d7c Keep JSON diff read-only mrmrs 7d ago Merged 9ea93764 Use surfaced clean flag in init agent docs mrmrs 7d ago Merged 35f4c6af Prefer desc-file in top-level help mrmrs 7d ago Merged 044af875 Prefer finish in mount agent state mrmrs 7d ago Merged 17f25693 Use read-only clean probes for remote recovery mrmrs 7d ago Merged a13a433f Compute diff stat without rendering hunks mrmrs 7d ago Merged 65fad5b0 Polish compact JSON pagination metadata mrmrs 7d ago Merged 543688e1 zdgeier-8d30ae Z zdgeier 7d ago Merged e0a46857 Page worktree diff JSON changed files mrmrs 7d ago Merged d90a51c3 Add compact status JSON with recall metadata mrmrs 7d ago Merged 6a68a06b Avoid scanning all branches for show JSON mrmrs 7d ago Merged 2c237e9a Cap path-filtered log walks mrmrs 7d ago Merged 9a24f5e4 Make regular diff avoid dirty blob writes mrmrs 7d ago Merged 07b31689 Add git-compatible status and diff aliases mrmrs 7d ago Merged 503e8027 Accept oak log --oneline for compact history mrmrs 7d ago Merged 53c32c03 Add compact agent state JSON for lower-token preflight mrmrs 7d ago Merged f958c1a0 Status read-path no-blob-write + branch/agent JSON compactness (reviewed, recall-locked). (1) oak status no longer stores dirty-file blobs or writes stat-cache entries for them: store_misses gates BOTH the blob store and the stat-cache write-back, so status hashes dirty misses in-memory for classification only and never leaves a cache entry pointing at an unstored blob; commit stores its own blobs (store_misses=true) so nothing downstream depends on status pre-storing. status.dirty medians improved ~8-14%, recall stayed 1.000. (2) Compact branch diff/review/merge-preview JSON: omit default per-file fields (additions/deletions when None, binary_or_large when false, stats_available when true — honest encoding: Some(0) stays present, absent==unmeasured) and de-duplicate the embedded merge-preview changed_files against the review's, but ONLY when byte-identical (equality-gated, lossless); conflict_files always kept. diff/review 128KB->81KB, review+preview 255KB->82KB. (3) Empty progress_state.conflict_paths/next_commands omitted. Regression tests lock the load-bearing properties: status does-not-store-dirty-blob; the de-dup differ-case keeps the embedded changed_files and they equal the standalone preview while review!=preview; empty-array omission + per-file stats encoding. Full oakvcs-cli suite green (28 agent_json). mrmrs 8d ago Merged f6e51fa1 Make can_finish/finish_eligible honest about remotes: oak agent state --json no longer reports finish_eligible:true when the repo has no remote configured. oak finish commits THEN pushes, so without a remote the push fails (exit 6) after the commit already mutated the branch — an agent trusting finish_eligible would mutate-then-fail. blocking_reason now returns 'no_remote_configured' (checked after in_progress/no_current_branch, before needs_pull, since a remoteless repo can't have needs_pull) so can_finish/finish_eligible go false; the recommendation already gives 'oak commit' for that case, so the two now agree. Mount context always passes remote_configured=true (mounts are always remote-backed). Regression test for the unlinked dirty checkout (can_finish false, blocking_reason no_remote_configured, recommends commit not finish); the finish-eligibility test now links a remote to keep its eligible-path assertion honest. Completes the agent-workflow recommendation slice's tracked follow-up. cargo test -p oakvcs-cli green (28 agent_json). mrmrs 8d ago Merged dee8b106 oak merge on a dirty tree exits documented code 4 (dirty working tree blocked the operation) instead of generic 1: the refusal returns OakError::DirtyWorkingTree (exit_code => 4) rather than MergeFailed (=> 1), so agents branching on oak's documented exit-code taxonomy commit/reset instead of retrying or escalating. Message unchanged; the dirty check precedes any remote requirement so it reaches local-only repos. End-to-end regression test asserts exit 4 + remediation text via the real binary. Pure error-taxonomy correctness fix. mrmrs 8d ago Merged 39b5fdd4 oak agent state --json recommends 'oak finish --desc-file <file> --json' first for remote-configured dirty/unpushed checkouts: the one-command finish path (commit+push+describe) replaces the manual commit-then-push sequence for finish-eligible linked checkouts, with the decomposed commands kept as ordered fallback. Gated on remote_configured (owner+name+remote_url all present) since finish must push — local-only checkouts keep the old commit/push recommendation. Refactors repo metadata reads to compute remote_configured once. Regression-safe (recommendation text only, no measured-behavior change); agent_json test added (27 green). Follow-up tracked: finish_eligible/can_finish itself is still true without a remote, so an agent trusting that boolean (not the recommendation) can still mutate-then-fail-to-push — make eligibility reflect remote-configured next. mrmrs 8d ago Merged 7cf5af12 Piped oak commit prints bare <hash12> instead of 'commit <hash12>': the command name and success state are already in the agent's tool call and exit code, so the data channel repeats neither. Non-TTY snapshot output 20->13 bytes (-35%), estimated tokens 11->10; recall and full-diff pipe compatibility unchanged. Interactive TTY output unchanged. No internal consumer parses the piped commit prefix (release/pull/sync print their own human 'commit <hash>' summaries, unaffected). piped_output tests updated, 20 green. mrmrs 8d ago Merged e198dcff Fix oak branch rename Branch-not-found on fresh-clone local-only branches: a fresh clone's generated personal branch is local-only until first push, but rename always tried the server rename first and surfaced the remote 404 as Branch not found even though the local branch existed. Now a remote BranchNotFound (404 on the rename route) falls back to a local rename with an explicit 'renamed locally (remote branch was not found; run oak push to publish)' message and does NOT advance LastRenameId (no server event to replay); 409 name-conflict and all other remote errors still fail BEFORE any local mutation (atomic). Local rename uses the existing transactional rename_branch (orphan-head guarded). Regression test covers remote-404 + local-branch-exists fallback. cargo build/test green. mrmrs 8d ago Merged 6eeb2dca zdgeier-ee87c2 Z zdgeier 8d ago Merged 4ec1e372 zdgeier-cefdd0 Z zdgeier 8d ago Merged 7cd5800a zdgeier-9e464f Z zdgeier 8d ago Merged 0ba35ac5 Fix oak pull UNIQUE-constraint crash on branch_heads.branch_name during rename replay. Fresh clones can carry branch_heads rows for remote branches without matching branches rows; replaying a server rename whose target name is occupied by such an orphan head crashed with 'Database error: UNIQUE constraint failed: branch_heads.branch_name'. Defense in depth: core rename_branch now treats both branches.name and branch_heads.branch_name as reserved target names (UNION conflict check) so it returns a clean BranchAlreadyExists instead of a raw DB crash — this also fixes oak branch rename into an orphan-head name; pull's rename-replay additionally skips-with-warning when the target exists in either table, keeping pull idempotent. rename_branch was the sole branch_heads write that could hit the constraint (all others are INSERT OR REPLACE), so the class is fully covered. Regression tests in core (clean error, no partial apply) and cli/tests/pull.rs (skip warning, idempotent LastRenameId advance, heads preserved). core 192 + cli pull suite green. Follow-up worth filing: root cause of orphan branch_heads on fresh clone. mrmrs 8d ago Merged 282f4d63 Local branch JSON schema parity: oak branch list/show/--json BranchJson now carries schema_version (from work_state::SCHEMA_VERSION, the same constant the remote branch structs and rest of the agent JSON use), closing the inconsistency where local branch output lacked the version field that remote triage output already had. One shared struct, one construction site → covers all three local-branch JSON surfaces. agent_json tests extended to assert schema_version parity on both list and show. 26 agent_json tests green. mrmrs 9d ago Merged ea47a8bd Checkout-free remote branch triage for agents: oak branch list/show/diff/review and oak close gain --remote --json, reading branch metadata/manifests straight from the configured remote without switching the checkout or materializing files (tested: remote_branch_list_show_diff_review_do_not_switch_checkout, close_remote_branch_json_does_not_switch_checkout). Remote reads fail loudly on unreachable/auth/missing-branch (structured OakError, no silent local fallback); missing blob bodies mark line stats stats_available:false with explicit nulls instead of fabricating zeros; new remote JSON structs carry schema_version. review --merge-preview returns changed files + lineage + identical-file sample + caveats + recommendations + merge preview in one call. Also keeps a correct micro-opt in warn_tracked_now_ignored (skip ignore work when the commit deletes nothing). Agent skill/docs/space template updated. The dirty-status per-file parallelization experiment was rejected and reverted (regressed the target workloads); pre-existing rayon working-dir scan untouched. Build/clippy clean, full oakvcs-cli suite green incl. 26 agent_json tests. mrmrs 9d ago Merged bcd78621 Piped status/diff full path recall: piped oak status and oak diff now emit every changed path (via the existing print_status_porcelain helper and render_stat_with_limit None) instead of a 5-row sample, bringing piped text to parity with the JSON surface which already listed all changes. Fixes lossy inforecall (status.dirty/diff.dirty recall 0.005-0.010 -> 1.000) at the honest cost of more tokens/bytes; latency unchanged within noise. Deleted the now-unused print_compact_change_sample and rewrote the LOG_VERBOSE_FILE_SAMPLE doc to document why log -v keeps per-commit sampling. CLI tests cover full recall + no-truncation; 20/20 piped_output green, full oakvcs-cli suite green, release build clean (no warnings). mrmrs 9d ago Merged ab170c05 Rename oak histedit to oak split: the command, module, TUI, and messages are now split-first (histedit kept as a hidden alias). split appears in the oak --help Branches group, and oak split --help plus the agent-skill reference now document the headless --plan grammar with an example so agents can split commits non-interactively. Z zdgeier 9d ago Merged cdffc006 Fix mount log history walking mrmrs 9d ago Merged 2df74385 Fix all five clippy -D warnings failures on main: add a BranchSnapshot type alias for branch_snapshot's 5-tuple return (mount/mod.rs), collapse the nested unpushed-warning if (mount/mod.rs), use repeat_n in the repo_cache test helper, extract a state_file_path helper in conflict.rs replacing three obfuscated .then().unwrap_or_else() chains, and merge the identical local_work_commit_count/finish_eligible branches in work_state.rs. Supersedes branch zdgeier-d69753, whose remaining fixes were stale against main. mrmrs 10d ago Merged 81d32e18 Agent-facing JSON state, conflict inspection, branch review, finish orchestration, and conflict-take marker safety fixes. This includes hunk-preserving conflict take behavior, recorded-state fallback warnings, refresh degradation, JSON error envelopes, and updated agent skill docs. mrmrs 10d ago Merged e70af442 Replace the Oak Mount app icon with the Oak logo (green tree on dark background): regenerate all AppIcon.appiconset sizes (16–1024) from the new artwork and update the project.yml comment describing the icon source. Z zdgeier 10d ago Merged ea3f90cc fmt Z zdgeier 10d ago Merged 006ea585 Fix mount pull mode merges and deletion conflict resolution mrmrs 10d ago Merged 79c39900 Fix log path filters and mount pull merge safety mrmrs 10d ago Merged e3f80ea1 Document conflicted branch review workflow mrmrs 10d ago Merged d9ef7aca Add agent-ready structured Oak surfaces mrmrs 10d ago Merged 7a689253 Fix oak close branch status sync mrmrs 10d ago Merged 4c5d4f0b sync: pull always converges, push never dead-ends mrmrs 10d ago Merged c53f658d Encode branch names in API routes and cover mount branch resolution mrmrs 10d ago Merged 9252976e mount: persistent per-repo cache for remount fast path; concurrent head GETs mrmrs 10d ago Merged b7ad8530 http/mount: share one HTTP client process-wide; adaptive mount readiness poll mrmrs 10d ago Merged 8c8ed193 Document and test non-interactive repo creation for agents mrmrs 10d ago Merged 87e0d014 http/mount: share one HTTP client process-wide; adaptive mount readiness poll mrmrs 10d ago Merged 34e99f74 Update Oak agent docs for landed agent CLI commands mrmrs 10d ago Merged 2c05364d Add safe mount finish wrapper mrmrs 10d ago Merged 2ff59771 Replay clone --branch and switch --clean UX onto fresh main while preserving status/info parser changes. mrmrs 10d ago Merged 9f38937e Implement mount list JSON and clearer mount end refusal diagnostics mrmrs 10d ago Merged 3e9514e9 Implement status porcelain and info JSON structured output mrmrs 10d ago Merged 72f3af57 Implement desc --file input mrmrs 10d ago Merged 2c792aa1 zdgeier-4397c1 Z zdgeier 10d ago Merged afdda54f switch -c: seed from the current head when main has no commits mrmrs 10d ago Merged 71469282 mount end: compact piped teardown output and cheaper clean/unpushed checks mrmrs 11d ago Merged ddd51471 push: piped output is one result line; narration is terminal-only mrmrs 11d ago Merged d25859a4 commit: piped output prints only 'commit <hash>' mrmrs 11d ago Merged 36b69fce push/pull: cut sequential remote round trips mrmrs 11d ago Merged c86cc3de scan/store: parallel walk + streaming batched blob store; trim branch-create line mrmrs 11d ago Merged 0a3c8c61 Fix duplicate pull conflict diagnostics mrmrs 11d ago Merged 65e0e864 diff --print: over-cap notice uses standard 'Binary files ... differ' wording mrmrs 11d ago Merged 77f86c73 status/switch: drop piped-output overhead on the hottest agent read paths mrmrs 11d ago Merged 4483d9d8 log: densify piped output; add path-scoped log and -S pickaxe mrmrs 11d ago Merged bb37d518 Make the Oak CLI/core repo publishable and shippable with release CI, FSKit packaging, agent spaces, and recoverable SQLite migrations mrmrs 11d ago Merged 966e4e8d publish-crates: fix idempotency check — cargo info inside the workspace resolves the local ./core member, falsely skipping the core publish; query the crates.io API instead (with a User-Agent, which crates.io requires) Z zdgeier 11d ago Merged 5693b603 Bump GitHub Actions to Node 24 majors: checkout v6, upload-artifact v7, download-artifact v8 (Node 20 forced off runners June 16; setup-zig has no Node 24 release yet) Z zdgeier 11d ago Merged 57651207 Bump version to v0.96.0 for release (workspace, oak-core dep, core crate, lockfile) Z zdgeier 11d ago Merged d491f310 Verify blob hashes on download and scope parent-sync commits to the merge. Z zdgeier 11d ago Merged ae1210af zdgeier-c9cb92 Z zdgeier 11d ago Merged a372dadb zdgeier-16b24e Z zdgeier 11d ago Merged 2f75b2bb zdgeier-a9706c Z zdgeier 11d ago Merged 097c7234 zdgeier-6dad5e Z zdgeier 11d ago Merged a98df220 oak switch <name> now fetches branches that exist only on the remote (pull the branch's commits + content, resolve seeded heads via the branch-head endpoint, refuse closed/merged ones), and merged branches are removed from local history: oak merge / pull / fetch delete the merged branch row instead of leaving a closed tombstone, pull & clone stop materializing closed branches from the server, and a prune pass sweeps rows whose tips main's history records as squash-merged (branches with unmerged commits are kept). Adds Repository::delete_branch, head fallback from PullResponse.head, and head-less branch-row resolution on switch so a metadata-only row from clone can't wipe the worktree to an empty manifest. Z zdgeier 11d ago Merged 3a5a744b oak switch <name> now fetches branches that exist only on the remote (pull the branch's commits + content, resolve seeded heads via the branch-head endpoint, refuse closed/merged ones), and merged branches are removed from local history: oak merge / pull / fetch delete the merged branch row instead of leaving a closed tombstone, pull & clone stop materializing closed branches from the server, and a prune pass sweeps rows whose tips main's history records as squash-merged (branches with unmerged commits are kept). Adds Repository::delete_branch, head fallback from PullResponse.head, and head-less branch-row resolution on switch so a metadata-only row from clone can't wipe the worktree to an empty manifest. Z zdgeier 12d ago Merged c20365f7 Optimize Oak devloop performance for agents mrmrs 12d ago Merged d06a63ae Make branch descriptions reliably reach the server, and exit-code InvalidPath as a usage error. Plain 'oak desc' (outside a mount) now best-effort-syncs the branch row via push_branch_metadata, exactly like the mount path — previously it only wrote the local row, and a commit-less 'oak push' returns 'Already up to date' before sending branch metadata, so a description set after the last push (the documented commit/push/desc order) silently never reached the server and squash merges landed without their message. push_branch_metadata now also reads the PushResponse body and treats success:false as failure (the push endpoint signals rejection as HTTP 200 + success:false, so the mount path could print 'synced' on a refused sync). oak serve's push handler accepts the metadata-only shape (commits empty + branch row) instead of bouncing it off the global-head CAS with a bogus conflict, and explicitly applies pushed description/status updates — store_branch is insert-if-absent by design, so re-pushed metadata was silently ignored; a regression test also pins that a commit-less push never moves a branch head (the hosted server clobbered heads on this shape once). OakError::InvalidPath now exits 2 (usage) instead of 1 so agents can distinguish 'fix your input' from generic failure. Pinned by cli/tests/desc_sync.rs (sync shape, no-remote silence, success:false handling), two serve.rs handler tests, and a hostile-filename exit-code test. Note: the hosted server (oakspace repo) still needs the matching fixes — accept metadata-only pushes and never move heads on commits:[]. mrmrs 12d ago Merged c8e0bda6 Machine-readable CLI for agents: --json output, a stable exit-code contract, a real 'oak branch' command, and non-interactive safety for destructive prompts. 'oak status --json', 'oak log --json' (honors -n), and the new 'oak branch' (bare or 'list' enumerates branches — previously only possible via the interactive 'oak switch' picker, which fails without a TTY — plus 'show <name>' and 'rename <old> <new>', with --json on list/show) each emit one JSON document on stdout with data only; the version-update notice is suppressed in JSON mode. 'status --json' carries the full multi-line branch description that the human view elides, plus parent, head, open/closed status, unmerged-commit count, merge/sync-in-progress flags, and structured change entries. Errors now exit with a documented contract instead of a blanket 1: 2 usage, 3 repo locked (retryable), 4 dirty working tree (new core OakError::DirtyWorkingTree variant), 5 merge/sync conflict or merge in progress, 6 network/server, 1 otherwise — mapped in one exit_code() function in main.rs. 'oak reset' and 'oak restore' no longer read confirmations from a non-TTY stdin: EOF used to be treated as 'no', printing 'cancelled' with exit 0 (an unattended caller believed the discard succeeded), and an open pipe hung forever; without --force they now refuse fast with the dirty-tree exit code and an actionable message, keeping the interactive prompt for terminals. Pinned by new cli/tests/agent_json.rs integration tests: status/log/branch JSON shape, full-description fidelity, bare-'oak branch' default, reset's non-interactive refusal code, and the retryable lock code. mrmrs 12d ago Merged 88f3aee6 Consolidate the four divergent worktree materializers (switch/reset/restore/pull) into one shared cli/src/materialize.rs::apply_manifest that takes a &WorkdirLock witness, uses lstat-based classification (never follows symlinks), errors on missing blobs, and keeps the stat cache mirrored — fixing the symlink-following deletion in reset/restore that could delete files outside the repo. oak pull's fast-forward now applies upstream deletions (manifest diff old head → new head, with stat-cache pruning and emptied-dir cleanup) so deleted files no longer resurrect on the next unattended commit, and pull's sync phase drops its hand-rolled hash-only manifest merge for core's three_way_merge_manifests plus a conflict resolver shared with oak merge, so executable-bit changes survive the pull path. oak merge now refuses a dirty working tree and pushes the branch before requesting the server squash-merge, so it can no longer merge a stale tip and wipe unpushed work; previously-unlocked worktree mutations (sync phase 3, merge --continue/--abort, switch, branch seeding, histedit, and the init/git-clone imports) now hold the workdir lock, enforced at compile time by the witness parameter. Deliberate behavior changes: switch now errors on missing blobs instead of silently skipping (matching reset), reset/restore refresh the stat cache after materializing, pull prunes directories emptied by upstream deletions, and delete lists are structured paths instead of display strings (printed output unchanged). Each of the four bugs has a regression test in cli/tests/materialize.rs verified to fail with the fix reverted. mrmrs 12d ago Merged 1213b6e8 Harden the content-addressed format against injection and ambiguity without changing any existing hash. Tree entry names are now validated everywhere (Tree::new, build_tree, the CLI working-dir scan, from_canonical_bytes, and the tree wire conversion): \t/\n/NUL/'/'/empty/'.'/'..' are rejected with a clear InvalidPath error naming the file, closing the confirmed preimage-injection bug where a file named 'a\nb.txt' produced a tree that round-tripped into different entries, and closing '..' path traversal. Hash deserialization and oak serve's storage endpoints now require real lowercase hex of valid lengths (64 BLAKE3 / 40 git SHA-1), and commit creation rejects control characters in branch names and authors, making the \n-joined commit preimage unambiguous. A new dormant core/src/hash_format.rs implements the breaking v2 format (domain-prefixed oak-blob\0/oak-tree\0/oak-chunk\0/oak-commit\0 preimages, length-prefixed commit fields, files list included) behind a repo-level hash_format metadata flag that defaults to v1 and cannot be enabled by any command yet; golden tests pin current v1 hash values so future format work can't drift them silently. mrmrs 12d ago Merged c3bbf28b Make the mount/space lifecycle crash-safe. Mount idempotency now verifies liveness (is the path actually a mountpoint?) instead of trusting a registry entry: stale registrations from a crash/reboot auto-respawn the daemon over the intact state dir via a new internal __resume serve path, or are cleaned up and remounted fresh when the state dir is gone. Adds the previously-referenced-but-missing 'oak mount forget' (drops a stale registry entry, refusing live mounts without --force, never touching on-disk state). Teardown now protects committed-but-unpushed work: 'oak mount end' refuses (without --force) when the virtual branch holds commits past the recorded last-pushed head, the WorktreeRemove hook no longer force-discards (it skips dirty/unpushed mounts and reports them), and 'oak space clean' applies the same unpushed guard. Daemons no longer leak: the serve pid is recorded in the state dir, 'end' terminates it (TERM then KILL) after unmounting, the macOS daemon also exits on its own when its mountpoint disappears, and Windows 'end' refuses while the daemon is alive rather than deleting state under live virtualization. Cross-process races are closed with flock-based advisory locks around the index.json read-modify-write and overlay-meta mutation (daemon persist vs 'oak commit' clear), plus atomic write-then-rename for both files. Docs/templates aligned: AGENTS.md and the agent-skill no longer claim 'oak space new' wires worktree hooks, and the space settings allowlist gains 'oak space clean'. mrmrs 12d ago Merged aa6f1990 diff --stat: only count +/- lines inside @@ hunks (in_hunk flag) so content lines that merely resemble file headers (e.g. '-- sql comment', '++i;') are counted correctly; pinned by a new piped_output regression test. mrmrs 12d ago Merged fc675602 Fix the OakMount.zip/OakMounter.zip name mismatch that silently dropped the darwin-mounter asset from oakvcs.com: the release workflow zips the app as OakMount.zip but the Makefile's upload-release looked for OakMounter.zip and skipped quietly, so /api/releases never got the app and install.sh / oak mount first-run install couldn't fetch it. Canonicalize on OakMount.zip (matching the built 'Oak Mount.app' and both workflows), make upload-release fail with ::error:: when REQUIRE_MOUNTER=1 (release.yml now passes it whenever the app job built) and emit ::warning:: instead of a silent skip otherwise. Also fix the related stale rename in the CLI: APP_BUNDLE was 'Oak Mounter.app' while the build produces 'Oak Mount.app', so first-run auto-install would extract the app but then fail its own is_dir check and re-download on every mount; rename the constant and the remaining 'Oak Mounter' comments/messages. Z zdgeier 12d ago Merged e5c0e3a1 fmt Z zdgeier 12d ago Merged 80afad50 compact-piped-output mrmrs 12d ago Merged 31f2b290 Never emit ANSI escapes to non-terminal output. Colors are decided before formatting: the colors constants are now a Color type whose Display renders nothing when the stream doesn't want color (NO_COLOR > CLICOLOR_FORCE > TTY detection; stderr writers gate on stderr). No post-hoc stripping, so user content containing literal ESC bytes (diff contents, paths, descriptions) round-trips byte-for-byte, the pager path honors NO_COLOR, and disabled colors cost zero allocations. mrmrs 12d ago Merged 2bb406d5 space-per-org Z zdgeier 13d ago Merged c8d2e76f fskit-prod-fixes Z zdgeier 13d ago Merged def51cf3 mac-mounter-cli Z zdgeier 13d ago Merged d0a922de rename-oak-mount Z zdgeier 13d ago Merged 13c0c602 asdf Z zdgeier 13d ago Merged 8d7b0bb6 zdgeier-769636 Z zdgeier 13d ago Merged 3c01ea50 fix-merge-conflict-detection Z zdgeier 13d ago Merged 6c2d62b8 zdgeier-769636 Z zdgeier 13d ago Merged a7bf2203 fmt-hook Z zdgeier 13d ago Merged 898e696f sign-oak-mounter Z zdgeier 13d ago Merged d90a729f Make `oak switch -c` a predictable branch-start fast path for agents and humans. mrmrs 13d ago Merged 0b1a7dc7 zdgeier-421258 Z zdgeier 16d ago Merged 0df9b443 pull/clone: lower batch-download size to 40 to fit the Worker subrequest budget Z zdgeier 16d ago Merged 05636cf0 zdgeier-f61b20 Z zdgeier 17d ago Merged 98fde348 helptext-colors Z zdgeier 17d ago Merged 91d75602 mount-overlay-skip-ignored Z zdgeier 17d ago Merged 5b8d3407 update-space-workflow Z zdgeier 17d ago Merged e2ea2d30 fix-rustfmt Z zdgeier 17d ago Merged 62594e17 zdgeier-1b64e7 Z zdgeier 17d ago Merged 3c15d42f zdgeier-6e7f7f Z zdgeier 17d ago Merged 97b2d5a0 Distinguish FSKit mount failure modes: EPERM-on-TCC-protected-dir now gets a targeted Full Disk Access / use-another-path message instead of the generic 'extension isn't available' error. Verify extension registration positively via pluginkit. Z zdgeier 17d ago Merged 2e398477 zdgeier-ecbf50 Z zdgeier 17d ago Merged 6bb48a7e zdgeier-ade30b Z zdgeier 17d ago Merged 4b00a77f Compact local SQLite storage: trees as one zstd blob, compressed blobs, drop redundant index Z zdgeier 17d ago Merged 5c1f98e2 Fix stale unmerged status after web UI squash merges. mrmrs 17d ago Merged 4b1fd0a1 zdgeier-7e0666 Z zdgeier 17d ago Merged 9fed723b zdgeier-847add Z zdgeier 17d ago Merged b2f43c60 zdgeier-f23319 Z zdgeier 17d ago Merged 64483659 asdfasdf A anonymous 17d ago Merged 9a5859ac zdgeier-465860 Z zdgeier 18d ago Merged 088cbb89 zdgeier-019463 Z zdgeier 18d ago Merged a388daa1 zdgeier-3164b7 Z zdgeier 18d ago Merged 57b34fd6 zdgeier-03cd73 Z zdgeier 18d ago Merged 31962460 zdgeier-c483ef Z zdgeier 18d ago Merged 22595030 zdgeier-d29fe8 Z zdgeier 18d ago Merged e8fb8d86 zdgeier-1e0fd9 Z zdgeier 18d ago Merged fb30e9e9 zdgeier-db8329 Z zdgeier 18d ago Merged 592a7f71 CLI push confirmations now include a direct web URL for branch-scoped pushes. After the server accepts oak push, the CLI appends a clickable branch link to the Push complete success message for repo-shaped branch pushes, using the shared <remote>/<org>/<repo>/branches/<branch> web URL builder. The fallback success text remains unchanged for non-branch pushes, and oak commit auto-push gets the same behavior because it already routes through the shared push implementation. Z zdgeier 18d ago Merged ef742870 zdgeier-6410a4 Z zdgeier 19d ago Merged b13f2ff9 zdgeier-a71b16 Z zdgeier 19d ago Merged d3ed1768 Optimize manifest exact-rename detection in core diff path. Z zdgeier 19d ago Merged c5fcc7aa zdgeier-0328b2 Z zdgeier 19d ago Merged 2fcccf20 zdgeier-637a9f Z zdgeier 19d ago Merged 12c9bd5b zdgeier-fafeba Z zdgeier 19d ago Merged e033ba3e oak-test2 Z zdgeier 19d ago Merged 59e88b66 zdgeier-704a87 Z zdgeier 19d ago Merged 8d0bebe2 zdgeier-9f21f2 Z zdgeier 20d ago Merged 37c35728 zdgeier-bdf1b0 Z zdgeier 20d ago Merged 72ee3fce Make the OakFS FSKit extension build, sign, notarize, and register on macOS 26 Z zdgeier 20d ago Merged 1e465f41 Build + sign oak CLI in CI and distribute via GitHub Releases Z zdgeier 20d ago Merged 3449698d Migrate macOS mount backend from fuser/macFUSE to Apple FSKit (no kernel extension). Extract backend-neutral MountCore; reduce fuse_fs to a Linux-only adapter; add FSKit daemon backend (protocol/dispatch/IPC/lifecycle) + Swift OakFS extension scaffold; gate fuser to Linux. Rebased onto current main. Rust verified (cargo build/test/clippy --features mount green on macOS 26); Swift + XPC transport remain on-device integration. Z zdgeier 20d ago Merged 33ec18f7 cli-release-action Z zdgeier 20d ago Merged f0b60e37 Add 'oak histedit': reorder/drop a branch's commits and split them into independent branches off main (git rebase -i / sl histedit equivalent). Ships an interactive ratatui TUI and a scriptable --plan <file|-> mode (+ --dry-run) so coding agents can drive it headless. Replay uses three_way_merge_manifests so reordered/partial sequences compose and a segment that isn't independent of another surfaces a clean conflict instead of a broken branch. Engine unit-tested; verified end-to-end. Also rewords the stale 'view-dependency resolution' doc comments in blob_fetch.rs (the views feature was removed earlier) to describe current mount/scoped-pull hydration. Z zdgeier 21d ago Merged 5371ca10 zdgeier-61da72 Z zdgeier 21d ago Merged f9d09a55 docs-accuracy-pass Z zdgeier 21d ago Merged c794f886 zdgeier-310811 Z zdgeier 21d ago Merged 63096fef zdgeier-4a0d2a Z zdgeier 21d ago Merged 702e54e7 zdgeier-09e06a Z zdgeier 21d ago Merged e6dfeb35 Add CI for the public oak workspace: GitHub Actions (fmt/clippy/nextest on Rust 1.94) + a mirroring `make ci` target. Format pull.rs/serve.rs so fmt --check is green. Fix `make install` (--path . -> --path cli) and build-release-linux-mount package name (oak-cli -> oakvcs-cli), both broken when the cli package moved into cli/. Z zdgeier 21d ago Merged d607bf4b zdgeier-3a7265 Z zdgeier 21d ago Merged d029fce5 zdgeier-77f337 Z zdgeier 21d ago Merged ef2f3489 zdgeier-f10796 Z zdgeier 22d ago Merged c12e4cfa zdgeier-e3d49d Z zdgeier 22d ago Merged 2bc4125f Make the CLI publishable to crates.io as oakvcs-cli. Renamed the package oak-cli -> oakvcs-cli, removed publish=false, and added release metadata (description, homepage, repository=oakvcs.com/oak/cli, keywords, categories). Pinned [lib] name = oak_cli so main.rs/tests keep 'use oak_cli::' working under the new package name. The binary stays 'oak' (cargo install oakvcs-cli -> oak). Builds/clippy/tests clean; cargo publish --dry-run verifies against the published oakvcs-core. Z zdgeier 22d ago Merged 33d79bd8 zdgeier-1c7147 Z zdgeier 22d ago Closed 45 closed without merging Status Summary Author Age Closed release-v0.99-relaunch Release v0.99.0 zach 1d ago Closed agents-finalize-rule Add a 'Finishing a task — commit and push, every time' section to AGENTS.md so agents working on the Oak source finalize unattended (commit + push, no merge), mirroring the per-repo oak finish flow used inside spaces. Z zdgeier 3d ago Closed mrmrs-8012a2 Fix Rust formatting drift mrmrs 5d ago Closed zdgeier-3f4c74 zdgeier-3f4c74 Z zdgeier 5d ago Closed mrmrs-bb952a M7 mount startup perf: trimmed eager MountCore::new tree-builder allocation by pre-sizing the inode map and avoiding path Vec/join/OsString allocations in insert_path/lookup_path. Added ignored mount_core_new_entry_scaling_diagnostic to expose entry-count scaling without slowing default CI. Validation: cargo test -p oakvcs-cli --test mount_core; cargo test -p oakvcs-cli --test mount_lifecycle; cargo test -p oakvcs-cli. Timing in test profile: 1k/5k/10k entries ~6.9/81.6/82.0ms before, ~3.1/13.0/25.7ms after. Lazy tree hydration remains a larger follow-up. mrmrs 5d ago Closed mrmrs-0996bd Support compact status JSON inside mounts mrmrs 5d ago Closed mrmrs-8d1046 Make pull and clone publish usable repository state only after verified ingest. mrmrs 6d ago Closed mrmrs-98e842 Avoid rereading dirty worktree bytes in diff render paths mrmrs 7d ago Closed mrmrs-a64bae mrmrs-a64bae mrmrs 7d ago Closed branch-triage-batch-v1 Add batch oak branch triage JSON over shared derive_branch_triage adapter mrmrs 7d ago Closed branch-triage-batch-on-engine-v1-wrong-base branch-triage-batch-on-engine-v1-wrong-base mrmrs 7d ago Closed mrmrs-197f34 oak merge on a dirty tree exits documented code 4 (dirty working tree blocked the operation) instead of generic 1: the refusal now returns OakError::DirtyWorkingTree (exit_code => 4) rather than MergeFailed (=> 1), so agents branching on oak's documented exit-code taxonomy correctly commit/reset instead of retrying or escalating. Message unchanged. The dirty check runs before any remote requirement, so this reaches local-only repos too. End-to-end regression test asserts exit 4 + remediation text via the real binary. (Pure error-taxonomy correctness fix; the overnight contention 'regression' was high-load noise — an error-variant swap on the dirty-merge refusal path can't affect the contention hot loop.) mrmrs 8d ago Closed zdgeier-bfae5e zdgeier-bfae5e mrmrs 8d ago Closed zdgeier-bf5360 zdgeier-bf5360 Z zdgeier 8d ago Closed oak--0dcd8c1b cli: fix clippy warnings in the mount commands — use iter::repeat_n in the repo_cache test helper, replace branch_snapshot's 5-tuple of Option<String> with a named BranchSnapshot struct, and collapse a nested if in mount end's unpushed-commit warning mrmrs 10d ago Closed oak--754312c6 Run cargo fmt across the workspace: reformat import ordering and line wrapping in 10 cli/ files (no functional changes) mrmrs 10d ago Closed oak--e76b6fca Fix oak log inside mounts showing no history: walk the commit graph from the virtual-branch head via parent_hash (like the regular oak log) instead of filtering by commits.branch_name, which matched nothing on a fresh mount because the only cached commit — the trunk base — carries the trunk's branch name. Extracts the walk core from commands/log.rs as walk_history_from_head (truncation messaging stays caller-owned), reuses it in mount log/log_json, adds a 'No commits yet' empty fallback and a quiet '(older history not cached in this mount)' note when the chain bottoms out below the mount base. mrmrs 10d ago Closed zdgeier-d69753 Post-merge cleanup after syncing with main: main independently landed the file-mode-faithful parent fetch (entries_from_trees in sync.rs), subsuming this branch's version of the fix, so the sync resolved all conflicts in main's favor. This branch now adds the residue main needs to go green: remove a duplicate InfoJson struct in output.rs left by the textual merge (both sides had added one, in different spots), fix the three clippy -D warnings failures in the just-landed mount code (BranchSnapshot type alias for the 5-tuple return, repeat_n in repo_cache tests, collapsed nested if in mount end), and cargo fmt --all over the recent unformatted commits. mrmrs 10d ago Closed agent-state--ec27f1a0 Add compact agent state JSON preflight command mrmrs 10d ago Closed conflict-json--3d4701c6 Expose progress state in status/info JSON mrmrs 10d ago Closed finish-json--594e52be Add JSON output for oak mount finish mrmrs 10d ago Closed mount-structured--ef858466 Support structured status, info, and log output inside mounts mrmrs 10d ago Closed mrmrs-9b90f2 mrmrs-9b90f2 mrmrs 10d ago Closed mrmrs-44150f Fix oak close branch status sync mrmrs 10d ago Closed mrmrs-d79423 Encode branch names in API routes and cover mount branch resolution mrmrs 10d ago Closed mrmrs-7f71ef mount: persistent per-repo cache for remount fast path; concurrent head GETs mrmrs 10d ago Closed zdgeier-4f210d zdgeier-4f210d Z zdgeier 10d ago Closed mrmrs-5a72ab status: drop the piped summary header line (duplicate of merged 77f86c73) mrmrs 11d ago Closed mrmrs-5ea8a8 commit/switch: piped commit prints only 'commit <hash>'; git-style branch-create line mrmrs 11d ago Closed mrmrs-a737e7 status: format piped status as git-short rows (' M path', '??' untracked, 5-row cap) mrmrs 11d ago Closed mrmrs-af9152 scan/store: parallel walk + streaming batched blob store (duplicate of merged c86cc3de) mrmrs 11d ago Closed mrmrs-b0379d switch: drop '(parent: main)' from the branch-create success line (superseded by merged 8461cc7d) mrmrs 11d ago Closed mrmrs-c95e6d push: suppress piped progress lines; single 'Pushed to <remote>' result line mrmrs 11d ago Closed mrmrs-da9744 mount end: compact piped teardown output and cheaper clean/unpushed checks mrmrs 11d ago Closed mrmrs-f1aadf diff --print: 'Binary files' wording for over-cap notices (duplicate of merged 65e0e864) mrmrs 11d ago Closed mrmrs-fab6c3 repo-notes: commit a blocked benchmark session's notes directory into the repo root (no code change) mrmrs 11d ago Closed bump-version--dd14deb1 bump-version Z zdgeier 13d ago Closed zdgeier-a00a8e zdgeier-a00a8e Z zdgeier 18d ago Closed fskit-migration--8ec0c649 Migrate macOS mount backend from fuser/macFUSE to Apple FSKit (no kernel extension). Extract backend-neutral MountCore; reduce fuse_fs to a Linux-only adapter; add FSKit daemon backend (protocol/dispatch/IPC/lifecycle) + Swift OakFS extension scaffold; gate fuser to Linux. Rust verified (cargo build/test/clippy --features mount green on macOS 26); Swift + XPC transport remain on-device integration. Z zdgeier 20d ago Closed mrmrs-303570 No commits yet — — Closed mrmrs-7cbda0 No commits yet — — Closed mrmrs-88669f No commits yet — — Closed mrmrs-dadca1 No commits yet — — Closed name-mount-branches-by-task No commits yet — — Closed zach-idea-1 No commits yet — — 0 selected · merge into main Clear Merge selected 159 files 9e5c78217f41 .github cli core docs macos scripts .gitignore AGENTS.md BENCHLOG.md CLAUDE.md Cargo.lock Cargo.toml LICENSE Makefile README.md rust-toolchain.toml README.md 95 lines 3.9 KB Source Oak This repository is the open-source heart of Oak : version control at the speed of agents . It's developed as a Cargo workspace: a reusable VCS library plus the oak command-line client that agents drive.
The content is a technical announcement regarding a software tool, devoid of political or social bias.
Get smarter about the news
Sign up free for a feed built around what you actually care about, Dive Deeper research on any story, and the full text of every article.
Create free accountAlready have an account? Sign in