Skip to content

Changelog

All notable changes to vibe are documented here.

Released: 2026-09-03

  • [copy] dirs entries that another entry already contains are no longer copied twice. Cloning a already places a/b inside it, so a second entry for a/b met an existing destination: clonefile failed with EEXIST, which vibe treats as a soft error, and the copy fell back to a standard recursive walk that rewrote file-by-file what the clone had just placed — correct, silent, and slow. Ordinary configuration reaches this: dirs = ["**/node_modules"] expands to the root node_modules plus every nested one the package managers leave inside it, 31 entries in a representative repository with 27 contained in the root. Measured on 360MB across 17,789 files, vibe start goes from 3.43s to 0.48s, with the resulting worktrees byte-for-byte identical. Entries that are not contained by another are unaffected.

Released: 2026-09-03

  • Copy-on-Write cloning now works for nested [copy] dirs entries on macOS. clonefile(2) fails with ENOENT when the destination’s parent does not exist, and vibe treated that as a soft failure — so the copy fell back to a full recursive duplicate while still reporting success and still labelling the progress phase clonefile. Any entry whose intermediate directories are not yet present in a fresh worktree was affected — monorepo layouts such as packages/app/node_modules. Measured on APFS with a 360MB, 17,789-file node_modules, vibe start goes from 2.71s to 0.41s. Entries whose parent already exists were never affected and are unchanged.

Released: 2026-09-02

  • vibe list gains BASE, AGE and STATUS columns, so an abandoned dirty worktree is distinguishable from active work without cd-ing into each one. The same values appear additively in --json as name, base, head, last_commit_at, status and dirty_files; a value vibe cannot determine degrades to null rather than failing the listing.
  • vibe list gains filtering and sorting: --dirty / --clean, --base, --recent / --stale, --limit, --sort age|name|status and --reverse. Filters AND-compose and apply before the sort, and --reverse applies before --limit, so --sort age --reverse --limit 5 means “the five oldest”. The default most-recently-used ordering is unchanged.
  • An opt-in [summary] section in .vibe.toml lets vibe list show a SUMMARY column describing what each worktree is for. vibe pipes the cache-missed worktrees to your command as JSON on stdin and reads {name: summary} back from stdout. The command is arbitrary shell, so it rides the existing SHA-256 trust gate: changing it revokes trust. A content-addressed cache keys on each worktree’s HEAD and status, so a steady-state listing spawns nothing.
  • vibe clean --claude-code-worktree-hook now writes a fixed line to stderr when pre_start gated the worktree, so an agent learns what a human learns from the withheld cd. The stdout path and the zero exit code are unchanged.
  • Breaking: .vibe.toml files using *_prepend / *_append in a position where those fields were previously parsed but ignored now require re-running vibe trust. Making those positions effective turns dormant config into config that executes, and the trust hash covers a file’s bytes rather than how vibe interprets them — so an upgrade alone could have started running a post_start_append entry that had never run before. vibe now records a config-semantics revision alongside each trust entry and fails closed with a message naming the affected fields. Configs that do not use those positions are unaffected.
  • Breaking: the default-branch protection added in v3.1.0 is gone, along with the --allow-default-branch flag on vibe clean and vibe rename. Passing that flag is now an error. The guard inferred the default branch from refs/remotes/origin/HEAD, a ref git clone writes and git fetch never updates afterwards — refreshing it takes an explicit git remote set-head origin --auto; measured across 109 local repositories it disagreed with the remote’s real default in 7, and every disagreement was the same shape — a repository whose default had moved to develop while origin/HEAD still said main. It therefore announced protection while failing on the workflow it mattered most for. git branch -d still refuses to delete an unmerged branch or one checked out in another worktree, and vibe rename still refuses a branch that has been pushed, which covers every shared default branch.

Released: 2026-08-08

  • vibe list shows every worktree in the current repository, marking the current and scratch worktrees and ordering recent worktrees first. Use vibe list --json for scripting and editor integrations.
  • vibe start and vibe scratch can now carry untracked, non-ignored files and locally modified tracked files into a new worktree. Enable this per invocation with --copy-untracked / --copy-modified, or persist it with untracked = true / modified = true under [copy] in .vibe.toml.
  • [copy] symlink can share exact directories such as caches between the origin repository and its worktrees instead of duplicating them. Unsafe or unavailable links produce a warning without making the new worktree unusable, and existing real files or directories are never replaced.
  • vibe clean --delete-branch and vibe rename now protect the repository’s detected default branch. Use --allow-default-branch when the operation is intentional.
  • GitHub Release assets now include LICENSE and THIRD-PARTY-LICENSES.md, and the third-party license document reproduces the required notices for dependencies whose permissive license option was selected.

Released: 2026-08-02

  • vibe is now distributed under the MIT License instead of Apache-2.0. The permissions you get as a user only widen; no action is required. Alongside the relicense, the shipped artifacts now carry complete third-party license texts: THIRD-PARTY-LICENSES.md reproduces, verbatim, the notice files of every bundled dependency whose license requires it, and the .deb package ships a machine-readable Debian copyright file at /usr/share/doc/vibe/copyright.
  • vibe doctor — a new command that checks your environment for known problems. Today it detects a stale nushell or PowerShell wrapper: wrappers pasted into config.nu or a PowerShell profile before vibe 2.2.0 are never regenerated on upgrade, so those users silently kept the old, broken behavior. vibe doctor reads the known profile locations, reports each pasted wrapper as current or stale, prints the command to regenerate a stale one, and exits 1 when it finds something. It never rewrites your shell configuration. See vibe doctor for details.
  • vibe upgrade now appends a one-line hint pointing at vibe doctor when a stale wrapper is plausible — that is, when your $SHELL names nushell or PowerShell, or you are on Windows. The hint survives --quiet, because a user scripting vibe upgrade -q is exactly the user who would otherwise never learn their wrapper is broken.
  • zsh and fish completions now offer the doctor subcommand. Re-run vibe shell-setup --shell zsh --with-completion (or the fish equivalent) to pick it up. Note: this changes the generated completion bytes, which — together with the license change — is why this release is a major version, not because any existing command changed behavior.
  • Simplified Chinese documentation for the entire site. The docs, the README, and the specification documents are now available in Chinese alongside English and Japanese; use the language picker in the site header.
  • vibe doctor no longer reports a clean bill of health when it should not. It now probes the macOS nushell config directory under ~/Library/Application Support/nushell, decodes PowerShell profiles saved as UTF-16 or with a UTF-8 byte-order mark (the Windows PowerShell 5.1 defaults), recognizes export def wrappers, and reports an error instead of an all-clear when no usable profile location exists.
  • vibe doctor no longer tells you to replace a wrapper that is already current. Wrapper classification is now aware of quoting, comments, and PowerShell here-strings, so a marker appearing inside a string literal or a comment is no longer mistaken for real code — and vice versa. Long profiles are scanned further before giving up, and an inconclusive scan now says so instead of guessing.

Released: 2026-07-26

  • The nushell wrapper now actually works. The previous wrapper could never change your shell’s directory (nu -c ran cd in a child process), rejected every flagged invocation such as vibe start --dry-run (missing --wrapped), and could not handle paths containing a single quote. The new wrapper receives the worktree path as plain data, so vibe start / vibe jump land your nushell session in the right directory — including quoted paths. Action required: replace your pasted wrapper in config.nu with the new snippet from vibe shell-setup --shell nushell (requires vibe 2.2.0 or later; the old wrapper keeps the old behavior).
  • The PowerShell wrapper now handles paths containing single quotes or wildcard characters ([, ]) correctly, and no longer errors when a command produces no output (e.g. vibe config). Action required: re-paste the wrapper from the setup docs (requires vibe 2.2.0 or later).
  • bash, zsh, and fish are unaffected: their wrappers and output are byte-identical to previous releases.

Released: 2026-07-17

  • GitHub Releases no longer include stray package.json and THIRD-PARTY-LICENSES.md files among the downloadable assets. Release pages now list only the prebuilt binaries and .deb packages, so picking the right download is no longer confusing.

Released: 2026-06-23

  • .vibe.toml files inside git submodules are now loaded end-to-end. Trusted submodule configs are read, configs are picked up from inside worktrees (not just the origin checkout), and submodule directories are copied from the correct source so submodule contents are present at the worktree path. If your repository uses submodules, their .vibe.toml files now contribute to the merged configuration as you would expect.
  • The progress tree is now shown again during worktree creation. The interactive progress display had regressed and stayed hidden until the operation finished; it now streams as the worktree is created.

Released: 2026-06-19

  • Native Windows (x64) support. Installing @kexi/vibe via npm on Windows now pulls in the @kexi/vibe-win32-x64 binary package and runs the native binary. Copy-on-Write cloning is not available on Windows, so worktree creation falls back to a standard file copy; all commands and behavior otherwise match Linux and macOS.
  • vibe is now a standalone Rust binary instead of a Node.js/Bun application. The npm package (@kexi/vibe) ships a thin launcher shim that runs the prebuilt binary for your platform, pulled in as a per-platform optionalDependency. All commands, flags, output, and the SHA-256 trust model are unchanged — your existing eval "$(vibe start ...)" setup and .vibe.toml files keep working exactly as before. This is a major version bump to mark the runtime and distribution overhaul, not because of any change to CLI behavior.
  • Deno / JSR distribution (deno install jsr:@kexi/vibe) is no longer published. Install via npm, Homebrew, the .deb package, or a prebuilt binary instead.
  • vibe start --force now honors the flag. Previously it was parsed but ignored; it now skips the confirmation prompts — navigating to an existing branch’s worktree, or overwriting a conflicting worktree for a different branch.
  • vibe start --reuse (and vibe scratch --reuse) now honors the flag. Previously it was parsed but ignored; it now auto-selects “reuse the existing worktree” when the target path conflicts with a different branch (the opposite of --force). Passing both --force and --reuse together is rejected as contradictory.
  • vibe scratch now generates correctly-dated branch names on Windows. Previously the timestamp fell back to a broken date (always year 1970) on the Windows binary; it now produces a valid scratch/YYYYMMDD-HHMMSS name.
  • Hardened the worktree path emitted on stdout against newline injection, matching the existing protection on cd output, so a path containing a newline can no longer inject a second shell command.

Released: 2026-06-02

  • Homebrew-distributed binaries no longer abort at launch with a dyld error on non-Nix hosts. Release binaries are now built with the official Bun toolchain so they don’t depend on /nix/store dynamic libraries.

Released: 2026-06-01

  • Windows now has a native robocopy copy strategy. When copy-on-write is unavailable, vibe falls back to robocopy for faster, more reliable worktree file copies on Windows.
  • Documented how to mount a Btrfs volume inside WSL2 so that copy-on-write copies are enabled on Windows. See Installation.
  • Copy failures on Windows now surface the underlying robocopy stdout in the error message, making failed copies easier to diagnose.

Released: 2026-05-31

Maintenance release that hardens the Nix release pipeline. The flake version is now derived from package.json (a single source of truth) instead of a hardcoded literal, so a release tag can no longer carry a stale version. The post-release flake update was also scoped to leave the pnpm/native tool-version pins untouched — a blanket version rewrite had broken the v1.7.0 source build. No user-facing changes.


Released: 2026-05-31

  • Recipes documentation for integrating vibe with external tools — tmux, cmux, and direnv. See the Recipes overview.
  • The Nix flake’s default package (nix run github:kexi/vibe, nix profile install github:kexi/vibe) now builds vibe from source for a reproducible install instead of fetching a prebuilt release binary. If you prefer the prebuilt fast path, use the #binary output (e.g. nix run github:kexi/vibe#binary). See Installation → Nix.

Released: 2026-05-16

  • Zsh shell autocompletion for vibe. Add autoload -Uz compinit && compinit and eval "$(vibe shell-setup --shell zsh --with-completion)" to ~/.zshrc (in that order — compinit must run before the eval) to get tab completion for subcommands, flags, local branch names on vibe start <Tab>, and worktree branch names on vibe jump <Tab>. See Shell Setup and vibe shell-setup for details.

Released: 2026-05-16

Maintenance release that recovers v1.5.1. The first CI fix attempt (--force npm@11) still failed because the bundled npm 10.x in Node 22.22 was missing @npmcli/arborist’s promise-retry dependency and could not self-upgrade. This release switches the publish jobs to Node 24, whose bundled npm 11.x already supports OIDC trusted publishing — no self-upgrade needed. v1.5.0 / v1.5.1 user-facing changes (fish shell autocompletion) ship for the first time here.


Released: 2026-05-16

Maintenance release that recovers v1.5.0. The v1.5.0 tag was cut but never reached the npm registry — the publish workflow failed during npm install -g npm@latest (npm self-upgrade race surfacing as Cannot find module 'promise-retry'). This release pins the upgrade to npm@11 with --force and ships the v1.5.0 content (fish shell autocompletion) for the first time. See the v1.5.0 entry below for the feature description.


Released: 2026-05-16

  • Fish shell autocompletion for vibe. Run vibe shell-setup --shell fish --with-completion | source (or add the line to ~/.config/fish/config.fish) to get tab completion for subcommands, flags, local branch names on vibe start <Tab>, and worktree branch names on vibe jump <Tab>. See Shell Setup and vibe shell-setup for details.

Released: 2026-05-12

Maintenance release. Hardens the release and CI pipelines against supply chain attacks informed by recent npm compromise patterns. No user-facing changes.


Released: 2026-04-29

Maintenance release. Confirms the Nix flake auto-update pipeline runs to completion after the PAT permissions were corrected. No user-facing changes.


Released: 2026-04-29

Maintenance release. Validates the restored Nix flake auto-update pipeline end-to-end. No user-facing changes.


Released: 2026-04-29

  • Restored automated Nix flake updates after each release — Nix users will once again get up-to-date flake.nix / flake.lock on develop for every release

Released: 2026-04-28

  • vibe scratch command — creates a worktree with an auto-generated scratch/<YYYYMMDD-HHMMSS> branch name for quick experimentation
  • vibe rename command — renames the current worktree’s branch and moves its directory in one step, useful for promoting a vibe scratch worktree to a real name
  • vibe jump now excludes scratch worktrees from non-exact matching to keep transient scratches out of jump suggestions
  • vibe rename feat/hoge now preserves slashes in branch names (previously sanitized to feat-hoge)
  • vibe rename is now runnable from secondary worktrees

Released: 2026-04-27

  • Nix installation support — vibe can now be installed via Nix flakes for reproducible installs

Released: 2026-04-08

  • Fix --force flag placement in worktree removal command

Released: 2026-03-08

  • Support remote branch checkout in vibe start via DWIM (Do What I Mean) - automatically detects and checks out remote branches

Released: 2026-02-26

  • Remove vibe copy command

Released: 2026-02-26

  • vibe copy command to copy files and directories from main worktree using Copy-on-Write
  • Claude Code worktree hook integration (--claude-code-worktree-hook mode for start and clean commands)
  • WorktreeCreate / WorktreeRemove hook support for Claude Code
  • Path validation for --target option
  • Defensive directory change before worktree removal in hook mode

Released: 2026-02-13

  • Embed native module (vibe-native) in compiled release binaries
  • Add direct .node require fallback for Bun compiled binaries

Released: 2026-02-12

  • Enable CoW (Copy-on-Write) native cloning on Bun runtime

Released: 2026-02-10

  • Fuzzy matching support for jump command (enables matching even with typos or partial input)
  • MRU (Most Recently Used) sorting for jump command (recently used worktrees appear first)

Released: 2026-02-08

  • vibe shell-setup command for automatic shell wrapper generation
  • Correct indentation in start command console.log statements

Released: 2026-02-08

  • vibe jump command for quick worktree navigation by branch name (supports partial matching, word boundary matching, and interactive selection)
  • vibe home command to navigate back to the main worktree
  • Shell injection prevention: escape single quotes and special characters in cd output
  • Success messages now display in green instead of appearing as error output
  • NO_COLOR environment variable support for ANSI color output

Released: 2026-02-08

  • Fixed brew upgrade command to use fully qualified tap name

Released: 2026-02-07

  • Internal build configuration fix for tsdown compatibility

Released: 2026-02-07

  • --track option for start command: explicitly enable remote tracking branch creation with --base
  • Default behavior changed to --no-track when using --base, preventing automatic remote tracking branch creation
  • Homebrew formula no longer conflicts with vibe-beta, allowing both stable and beta versions to coexist

Released: 2026-02-02

  • Deno/JSR distribution: vibe can now be run directly via deno run jsr:@kexi/vibe
  • Beta channel: Homebrew beta formula available as vibe-beta for early feature testing

Released: 2026-01-31

  • Configurable copy concurrency with vibe.concurrency.copy config option

Released: 2026-01-26

  • Internal build configuration fix for tsdown v0.20.1 compatibility

Released: 2026-01-26

  • Error detection when main worktree has been deleted, with actionable error message
  • Native clone support now works correctly with proper import map configuration

Released: 2026-01-24

  • Internal build configuration fix for npm package

Released: 2026-01-24

  • --base option for vibe start command to explicitly specify base branch
  • Improved spinner stability by throttling render calls to prevent freezing

Released: 2026-01-19

  • XDG Trash support: vibe clean now uses system trash
    • Linux: XDG Base Directory spec compliant trash
    • macOS: Integration with Finder’s Trash
  • Improved vibe clean idempotency for concurrent execution stability

Released: 2026-01-18

  • Twitter announcement template for release workflow
  • Markdown file synchronization rules (_.md / _.ja.md pairs)
  • vibe-release-new-version Claude Code command for guided releases
  • PR review feedback addressed
  • JSR dependencies moved to devDependencies for proper build
  • JSR dependencies bundled to fix npx usage without registry config

Released: 2026-01-18

  • Multi-runtime support: Run vibe in Node.js/npm/npx and Bun environments
  • RuntimeAbstractionLayer: Unified runtime abstraction for Node.js and Bun
  • AppContext dependency injection: Improved testability through DI pattern
  • vibe-native: Migrated from C to Rust (napi-rs) for better safety and maintainability
  • vibe-native: Consolidated multiple packages into a single unified package
  • Improved native module error handling
  • Better Windows detection logic
  • Extended mise HTTP timeout for slower connections
  • Various e2e test fixes and improvements

Released: 2026-01-16

  • GNU Coding Standards compliant CLI options
    • --verbose / -V: Enable verbose output
    • --quiet / -q: Suppress non-essential output
    • -n short alias for --dry-run
    • Unknown option detection with helpful error messages
  • Fast remove for vibe clean command
    • O(1) instant directory removal by renaming to .vibe-trash-*
    • Background cleanup for improved user experience
    • Benchmark: 29s → 2s (342K files, 14x faster)
    • [clean] fast_remove config option (enabled by default)
  • Improved help text formatting with errorLog function
  • Shell injection prevention in clean command
  • Security improvements for clean operations

Released: 2026-01-14

  • vibe upgrade command to check for updates and show upgrade instructions
  • --dry-run option for vibe start to preview operations without executing
  • --delete-branch / --keep-branch options for vibe clean command
  • --force / -f option for vibe clean to skip confirmation prompts
  • [clean] delete_branch config option in .vibe.toml
  • Claude Actions switched from OAuth to API key authentication
  • Add --force flag when removing worktree with uncommitted changes

Released: 2026-01-13

  • OGP meta tags for SNS preview on documentation site
  • Converted to pnpm workspace with docs CI checks
  • Configured minimum release age for supply chain security
  • vibe clean now outputs cd command to return to main worktree

Released: 2026-01-13

  • Worktree path customization via external script
    • Configure path_script to dynamically determine worktree directory path
    • Environment variables: VIBE_REPO_NAME, VIBE_BRANCH_NAME, VIBE_SANITIZED_BRANCH, VIBE_REPO_ROOT
  • Unified deno compile commands into deno task

Released: 2026-01-13

  • Added --allow-ffi flag to all compile commands in CI/release workflows

Released: 2026-01-13

  • Documentation site (Starlight-based)
  • GitHub Star button in header
  • Windows, Nushell, PowerShell, and Linux installation guides
  • Automated documentation deployment via GitHub Actions
  • Parallelized directory copy for improved performance
  • Display copy strategy name during file operations

Released: 2026-01-10

  • --no-hooks option to skip hook execution during vibe start
  • --no-copy option to skip file copying during vibe start
  • GitHub Sponsors and Patreon funding configuration
  • Improved documentation for development workflows

Released: 2026-01-08

  • Copy strategies with performance optimization
    • Native clone using FFI (clonefile on macOS, FICLONE on Linux)
    • Copy-on-Write (CoW) support for APFS and Btrfs/XFS
    • rsync fallback for cross-filesystem copies
  • Directory copy support with glob patterns
  • Progress display improvements with new marker format
  • Refactored CopyService for better performance
  • Enhanced progress display with cleaner output
  • Resource leaks in CopyService tests
  • Empty marker lines in progress display

Released: 2026-01-02

  • Trust system for repository security
    • Repositories must be explicitly trusted before running hooks
    • vibe trust command for managing trusted repositories
    • Security-first approach to prevent malicious hook execution
  • Idempotent vibe start - running on existing worktree reuses it
  • Replaced Japanese UI messages with English for international users
  • Improved repository root path normalization
  • Repository root normalization issues

Released: 2025-12-28

  • Hook system for automated workflows
    • pre_start, post_start, pre_clean, post_clean hooks
    • files configuration for copying files to worktrees
  • Local configuration support (.vibe.local.toml)
  • vibe config command for managing settings
  • Enhanced worktree management
  • Improved shell integration

Released: 2025-12-28

  • Initial release
  • Basic worktree creation with vibe start
  • Worktree cleanup with vibe clean
  • Multi-shell support (Bash, Zsh, Fish, Nushell, PowerShell)
  • .vibe.toml configuration file support