Skip to content

Releases: joeinnes/cow

v0.1.10

Choose a tag to compare

@joeinnes joeinnes released this 19 Mar 21:55
97b3e03

Build artifact skipping, cow clean, and stale-ref fixes.

New

  • cow clean — remove build artifact directories (target/, .build/, DerivedData/, .turbo/) from pastures. Supports --dry-run and per-pasture targeting.
  • Build artifact skippingcow create now 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=false to prevent git rebase origin/main from 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_clone now copies symlinks verbatim instead of letting clonefile(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 stats switched from git-diff-based delta measurement to du(1), which correctly reports only uniquely-owned blocks on APFS.

v0.1.9

Choose a tag to compare

@joeinnes joeinnes released this 09 Mar 23:06
2731f8a

Turbopack monorepo support and Herd app icon.

Bug fixes

  • Turbopack monoreposcow create now detects turbo.json and performs a full clone instead of symlinking node_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

Choose a tag to compare

@joeinnes joeinnes released this 08 Mar 22:46
9f9713c

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 formulabrew install joeinnes/tap/herd builds Herd from source, no code signing required.

Docs

  • Herd section added to the homepage and command reference.

v0.1.7

Choose a tag to compare

@joeinnes joeinnes released this 07 Mar 09:52
5c8e301

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 to source_branch instead of name due to swapped clap annotations in SyncArgs. The command fell back to resolving the pasture from the current working directory, targeting the wrong pasture. Fixed by making name the bare positional argument and source_branch a --source-branch flag (consistent with all other commands).
  • fix cow materialise on Linux — the materialise command lacked a Linux implementation, causing a compile error on non-macOS targets. Now uses cp --reflink=always with graceful fallback to a plain cp -R (matching cow create behaviour).

Internal

  • test Integration test coverage improved from 78% to 87.6%. Dedicated test suites added for gc, stats, materialise, migrate, and fetch-from, covering the main happy paths and key error branches in each command.

v0.1.6

Choose a tag to compare

@joeinnes joeinnes released this 05 Mar 13:23
f8c0c19

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 next cow run invocation.

Improvements

  • improved cow list output is now sorted alphabetically by name, grouping pastures by project naturally.
  • improved cow install now sets up full tab completion for the cow binary: 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-run cow install.

v0.1.5

Choose a tag to compare

@joeinnes joeinnes released this 05 Mar 00:00
27f3137

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-local node_modules rather than the shared source. Sets COW_PASTURE, COW_SOURCE, and COW_PASTURE_PATH env 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 the cowcd shell function and tab completion in ~/.zshrc (zsh) or ~/.bashrc (bash) automatically. Idempotent.

cow create

  • new --worktree flag — 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-symlink flag — skips large-directory detection and always performs a full clone.

jj

  • improved cow status and cow list now 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, and cow_run tools added to the MCP server, completing full command coverage for agent-driven workflows.

v0.1.4

Choose a tag to compare

@joeinnes joeinnes released this 03 Mar 23:47
38c06b4

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/brightblur stores the workspace as brightblur/feature-x. Supply an explicit scope/name to override.
  • new Auto-generated names follow the same pattern: brightblur/agent-1, brightblur/agent-2, etc.
  • feat cow list redesigned — 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 separate jj describe step (jj repos only).
  • new cow remove -y/--yes — skip confirmation prompts without implying a safety override. Unlike --force (which bypasses dirty checks), --yes still shows dirty warnings — it just doesn't wait for input. Idiomatic for scripts and non-TTY contexts.

Improvements

  • feat cow list now shows a file count next to dirty workspaces (e.g. dirty (3)), giving a quick sense of change scope without running cow status.

v0.1.3

Choose a tag to compare

@joeinnes joeinnes released this 03 Mar 16:46
39f7625

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 create now 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 list now contracts the home directory to ~ in path output, keeping lines short on typical setups.

v0.1.2

Choose a tag to compare

@joeinnes joeinnes released this 03 Mar 10:32
66d2e7a

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 with jj workspace add and the old one forgotten; orphaned directories are registered in-place without cloning. Dirty candidates are skipped unless --force is passed. --dry-run prints the plan without making any changes.

Documentation

  • docs README: added cow migrate command reference and a Development section documenting the three root causes of the test coverage gap in migrate.rs (jj paths, subprocess integration tests, defensive error paths).
  • docs Homepage: updated CLI demo to include a migrate tab.

v0.1.1

Choose a tag to compare

@joeinnes joeinnes released this 02 Mar 23:20
a6b007f

What's changed

Performance

  • Replace cp -Rc subprocess with a direct clonefile(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 add before 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-context at the workspace root

Docs