Releases: joeinnes/cow
Release list
v0.1.10
Build artifact skipping, cow clean, and stale-ref fixes.
New
- cow clean — remove build artifact directories (target/, .build/, DerivedData/, .turbo/) from pastures. Supports
--dry-runand per-pasture targeting. - Build artifact skipping —
cow createnow skips build artifact directories automatically. They are always reproducible and become orphaned CoW copies when the source rebuilds.
Bug fixes
- fix Stale-ref diff confusion — pastures now set
checkout.guess=falseto preventgit rebase origin/mainfrom creating a local branch that shadows the remote ref. A post-rewrite hook fast-forwards local tracking branches after every rebase. - fix Symlink safety —
selective_clonenow copies symlinks verbatim instead of lettingclonefile(2)follow them, fixing ENOENT errors with pnpm relative symlinks. - fix Dep dir candidates — dep dirs (node_modules, vendor, etc.) are now always added as symlink candidates even when a deeper candidate exists inside them.
Improvements
- perf
cow statsswitched from git-diff-based delta measurement todu(1), which correctly reports only uniquely-owned blocks on APFS.
v0.1.9
Turbopack monorepo support and Herd app icon.
Bug fixes
- Turbopack monorepos —
cow createnow detectsturbo.jsonand performs a full clone instead of symlinkingnode_modules, which Turbopack cannot follow. A note is printed explaining the slightly slower clone.
Herd
- App icon — cow emoji on cream background, shown correctly in Finder and the Dock.
v0.1.8
Herd: native macOS menubar companion for cow.
Adds Herd, a SwiftUI menubar app that gives a live view of all pastures without opening a terminal. Available via brew install joeinnes/tap/herd.
New
- Herd menubar app — pastures grouped by project, with hover actions to open in Finder, open in Terminal, sync from source, or remove with a confirmation prompt.
- Stats strip — real-time source size, pasture delta, and npm savings shown at a glance.
- Homebrew formula —
brew install joeinnes/tap/herdbuilds Herd from source, no code signing required.
Docs
- Herd section added to the homepage and command reference.
v0.1.7
Fix cow sync name parsing, Linux materialise reflink, and test coverage improvements.
Patch release fixing two bugs — a silent mismatch in cow sync argument parsing and missing Linux support in cow materialise — plus a major expansion of the integration test suite.
Bug fixes
- fix
cow sync <name>— the positional pasture name was silently assigned tosource_branchinstead ofnamedue to swapped clap annotations inSyncArgs. The command fell back to resolving the pasture from the current working directory, targeting the wrong pasture. Fixed by makingnamethe bare positional argument andsource_brancha--source-branchflag (consistent with all other commands). - fix
cow materialiseon Linux — the materialise command lacked a Linux implementation, causing a compile error on non-macOS targets. Now usescp --reflink=alwayswith graceful fallback to a plaincp -R(matchingcow createbehaviour).
Internal
- test Integration test coverage improved from 78% to 87.6%. Dedicated test suites added for
gc,stats,materialise,migrate, andfetch-from, covering the main happy paths and key error branches in each command.
v0.1.6
Fix silent hang in cow run, alphabetical list, better tab completion.
Patch release fixing a critical bug where cow run would hang silently for any non-install subcommand.
Bug fixes
- fix
cow run— PM shims recursed infinitely when called with non-install subcommands (e.g.pnpm run dev,npm test). The shim used/usr/bin/env <pm>to find the real binary, but since~/.cow/shims/is prepended to PATH the shim found itself and looped. Fixed by stripping the shims directory from PATH at the top of every shim. Existing stale shims are automatically regenerated on the nextcow runinvocation.
Improvements
- improved
cow listoutput is now sorted alphabetically by name, grouping pastures by project naturally. - improved
cow installnow sets up full tab completion for thecowbinary: subcommand completion at position 1, pasture name completion at position 2 for all name-taking commands (run,status,diff,remove,cd,materialise,fetch-from,recreate). Users with the old snippet are prompted to remove it and re-runcow install.
v0.1.5
Isolated run environment, worktree mode, and smarter dep dirs.
Five new commands, per-package dependency symlinks, git linked worktree support, and full MCP coverage for agent-driven workflows.
New commands
- new
cow run <name> <cmd>— runs a command inside a pasture's working directory. Auto-detects the package manager from lockfiles and injects shims so install subcommands write to the pasture-localnode_modulesrather than the shared source. SetsCOW_PASTURE,COW_SOURCE, andCOW_PASTURE_PATHenv vars for the subprocess. - new
cow materialise <name>— replaces symlinked dependency directories in a pasture with real APFS clonefiles, making the pasture fully independent of the source. - new
cow fetch-from <from>— fetches all refs from another pasture into this one, enabling cross-pasture rebase without touching any remote. - new
cow recreate <name>— removes a pasture and re-creates it from the same source, optionally on a different branch. - new
cow install— sets up thecowcdshell function and tab completion in~/.zshrc(zsh) or~/.bashrc(bash) automatically. Idempotent.
cow create
- new
--worktreeflag — creates a git linked worktree instead of an APFS clone. All worktree pastures share the same.git/objects/pack store, so cross-pasture rebase works without any remote dance. - improved Dependency directories (
node_modules,vendor,.venv,Pods, etc.) are now handled with per-package symlinks: each top-level entry is symlinked individually so existing packages are instantly available and new installs write locally to the pasture. - new
--no-symlinkflag — skips large-directory detection and always performs a full clone.
jj
- improved
cow statusandcow listnow show changed instead of dirty for jj pastures, reflecting jj semantics where the working copy is always materialised as a commit.
MCP
- new
cow_migrate,cow_materialise,cow_fetch_from, andcow_runtools added to the MCP server, completing full command coverage for agent-driven workflows.
v0.1.4
Scoped workspace names and better automation.
Workspace names are now scoped by source repository — feature-x becomes brightblur/feature-x automatically. cow list drops the SOURCE column (it's encoded in the name) and gets a cleaner layout. Adds flags for scripting and non-TTY use: --print-path on create, -y/--yes on remove, and -m/--message for jj.
Workspace naming
- new Names are automatically scoped by source repository basename:
cow create feature-x --source ~/repos/brightblurstores the workspace asbrightblur/feature-x. Supply an explicitscope/nameto override. - new Auto-generated names follow the same pattern:
brightblur/agent-1,brightblur/agent-2, etc. - feat
cow listredesigned — SOURCE column removed (source is now encoded in the scoped name). Branch column only appears when the branch differs from the workspace name suffix.
New flags
- new
cow create --print-path— suppress all output except the final workspace path, making it easy to capture in scripts:WS=$(cow create my-feature --print-path). - new
cow create -m/--message <MSG>— set the initial jj change description immediately after workspace creation. Removes the separatejj describestep (jj repos only). - new
cow remove -y/--yes— skip confirmation prompts without implying a safety override. Unlike--force(which bypasses dirty checks),--yesstill shows dirty warnings — it just doesn't wait for input. Idiomatic for scripts and non-TTY contexts.
Improvements
- feat
cow listnow shows a file count next to dirty workspaces (e.g.dirty (3)), giving a quick sense of change scope without runningcow status.
v0.1.3
Safer creates and tidier output.
Adds atomic rollback to cow create, a new --from flag for branching from an arbitrary revision, automatic pruning of stale worktree refs, and ~-contraction in cow list output.
Improvements
- feat
cow create --from <rev>— branch the new workspace from an arbitrary revision rather than always using the source HEAD. - fix
cow createnow performs atomic rollback on failure: any partially written workspace directory and git worktree entry are cleaned up before returning an error. - fix Stale git worktree refs left behind by a previous failed clone are pruned automatically on the next
cow create. - fix
cow listnow contracts the home directory to~in path output, keeping lines short on typical setups.
v0.1.2
Migrate existing worktrees into cow.
Adds cow migrate, which discovers git linked worktrees, jj secondary workspaces, and orphaned cow workspace directories and migrates them into proper cow-managed APFS clone workspaces — so you can adopt cow without starting your in-progress branches from scratch.
Commands
- new
cow migrate [--source] [--all] [--force] [--dry-run]— discover and migrate git worktrees, jj workspaces, and orphaned directories into cow-managed workspaces. Git worktrees are replaced with an APFS clone and the old worktree removed; jj workspaces are re-created withjj workspace addand the old one forgotten; orphaned directories are registered in-place without cloning. Dirty candidates are skipped unless--forceis passed.--dry-runprints the plan without making any changes.
Documentation
- docs README: added
cow migratecommand reference and a Development section documenting the three root causes of the test coverage gap inmigrate.rs(jj paths, subprocess integration tests, defensive error paths). - docs Homepage: updated CLI demo to include a
migratetab.
v0.1.1
What's changed
Performance
- Replace
cp -Rcsubprocess with a directclonefile(2)syscall. A 2 GB repository now clones in ~130 ms wall time with near-zero extra disk overhead until files are modified.
jj (Jujutsu) fixes
- Run
jj workspace addbefore copying untracked files, so the destination is empty when jj initialises it - Pass
signing.behavior="drop"to suppress SSH passphrase prompts on the workspace-init commit - Write cow metadata to
.jj/cow-context(invisible to jj tracking) instead of.cow-contextat the workspace root
Docs
- New command reference page
- New changelog page
- Fixed terminal demo output to match actual CLI, corrected benchmark and MCP config path