All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
v1.7.1 - 2026-04-30
- Agent skill — moved the bundled Anvil agent instructions to
anvil-agent/SKILL.mdand installs them for Codex CLI as well as Claude Code.
- Project resolution — fixed dotted project names (for example
virovet-diagnostik.de) being saved as nested YAML, recovered previously corrupted global config entries on load, and made linked-project matching deterministic soanvil workcreates worktrees under the correct project slug.
- Removed the obsolete
.aiplanning directory from the repository.
v1.7.0 - 2026-04-01
- Smart project naming —
anvil linknow derives the project name from the origin remote URL instead of the directory name, preventing mismatches when a repo is cloned into a differently-named folder. Falls back to directory name when no remote is configured. Shows an info message when the names differ.
- Integration test templates — updated tests to use the truncation-safe
{{ .DatabaseName }}template variable instead of raw{{ .SiteName }}_{{ .DbSuffix }}
v1.6.0 - 2026-03-19
- Global prune —
anvil prunenow iterates every linked project from the global config instead of requiring CWD to be inside a linked repo, making it usable as a global housekeeping command - Remote-aware merge detection — prune fetches
originbefore checking merged status, comparing againstorigin/<default-branch>to avoid false negatives from stale local refs
v1.5.1 - 2026-03-19
- Herd detection — setup wizard now correctly detects Herd at
~/Library/Application Support/Herd(macOS standard path) in addition to~/.config/herd - Completion cache — after installing shell completion, anvil now removes
~/.zcompdumpand~/.zcompdump-*files so the new completion activates without a manual shell restart - AI skill overwrite — setup wizard now shows a unified diff before asking to overwrite an existing skill file; skips the prompt entirely when the file is already up to date
Full changelog: v1.5.0...v1.5.1
v1.5.0 - 2026-03-19
- Setup wizard —
anvil installnow runs a 5-step interactive wizard: PATH check, Herd/Valet detection, shell completion install, default projects root prompt, and AI CLI skill setup (installs a Claude Code skill file) - First-run detection — new users are prompted to run the setup wizard on their first command; skips automatically in CI and non-interactive environments
- Completion install by default —
anvil completion zsh|bash|fishnow installs the script to the appropriate system path; use--printto get the old stdout behavior. Piped usage (e.g.source <(anvil completion zsh)) continues to work unchanged
- Idiomatic Go improvements across scaffold, config, and preset packages (reduced abstraction layers, simplified pass-throughs)
- Improved error wrapping consistency throughout the codebase
anvil completion zsh|bash|fishpiped usage (e.g.eval "$(anvil completion zsh)") now correctly falls back to stdout instead of showing an interactive prompt- Light terminal color rendering — muted/text styles now use
AdaptiveColorfor correct contrast on light backgrounds anvil listtable display — removed row separators and fixed status column wrapping
Full changelog: v1.4.0...v1.5.0
v1.4.0 - 2026-03-11
- Shell completion — Tab completion for worktree names in
open,scaffold,info, andremovecommands. Generate scripts viaanvil completion zsh|bash|fish|powershell.
anvil scaffoldnow uses fuzzy worktree matching (likeinfoandopen) instead of joining the argument with the project path — fixes "worktree not found" for linked projects with centralized worktreesanvil opennow treatshttp://localhost(and variants with ports) as unconfigured and falls back tohttps://<folder-name>.testinstead of opening a Herd 404
Full changelog: v1.3.1...v1.4.0
v1.3.1 - 2026-03-11
anvil opennow treatshttp://localhost(and variants with ports) as unconfigured and falls back tohttps://<folder-name>.testinstead of opening a Herd 404
Full changelog: v1.3.0...v1.3.1
v1.3.0 - 2026-03-11
anvil opencommand — Open a worktree in your IDE and its Herd-linked site in the browser with a single command. Supports fuzzy matching by folder name, branch name, or partial match. Use--editoror--browserflags to open only one. IDE is configurable via--editor-cmdflag, per-project config, or global config (defaults tocursor).editor_cmdconfig option — Configure your preferred IDE globally or per-project in the anvil config.
- Strip ANSI escape codes from captured command output to prevent malformed
APP_KEYvalues with embedded color codes (e.g.[33m,[39m) - Add
--no-ansiflag tokey:generateartisan commands in Laravel and LaravelSharedDB presets
Full changelog: v1.2.0...v1.3.0
v1.2.0 - 2026-03-10
--skip-scaffoldflag foranvil work— Skip scaffold steps when creating a worktree for faster iteration. Runanvil scaffoldlater when ready.anvil pull-configcommand — Copyanvil.yamlfrom the default branch worktree to the project root. Supports--force,--dry-run, and--verboseflags.
- Remote branch detached HEAD fix — When selecting a remote branch (e.g.
origin/feature/foo) from the interactive picker, the remote prefix is now stripped to create a proper local tracking branch instead of a detached HEAD.
- Remove unused
sable-notifyworkflow - Align banner command listing spacing
Full changelog: v1.1.1...v1.2.0
v1.1.1 - 2026-03-10
- Fix worktree database names exceeding MySQL's 64-char identifier limit for long branch names (e.g.,
hotfix/track-collection-reflection-exception) - Extract
BuildDatabaseName()to ensure site name truncation applies consistently - Add
{{ .DatabaseName }}template variable for truncated database names in env.write steps
Full changelog: v1.1.0...v1.1.1
v1.1.0 - 2026-02-12
- Rename
cdcommand toinfoand drop--shellflag - Rename
tarspreset tolaravel-shared-db
1.0.0 - 2026-02-08
-
Project renamed from Arbor to Anvil - Binary, module path, config files, and all references renamed
- Module path changed from
github.com/artisanexperiences/arbortogithub.com/naoray/anvil - Config file renamed from
arbor.yamltoanvil.yaml - Local state file renamed from
.arbor.localto.anvil.local - Default worktree base changed from
~/.arbor/worktreesto~/.anvil/worktrees - Global config directory changed from
~/.config/arbor/to~/.config/anvil/
- Module path changed from
-
Removed
anvil initandanvil destroycommands - The legacy bare repository (.bare) approach has been removed entirely. Useanvil linkto register existing git repositories for centralized worktree management, andanvil unlink --cleanto unregister and clean up. -
Removed
.baredirectory support - Anvil now exclusively uses the linked project approach with worktrees stored in~/.anvil/worktrees/.
- TARS preset for shared-database worktrees — detects
config/tars.php, skips db.create, env.write for DB_DATABASE, migrate:fresh, and db.destroy to preserve the centralized database
anvil initcommand (useanvil linkinstead)anvil destroycommand (useanvil unlink --cleaninstead)CloneRepo,CloneRepoWithGH,FindBarePath,IsAnvilProjectinternal functionsIsLinkedfield fromProjectContext(all projects are now linked)BarePathfield renamed toGitDirinProjectContext
- Simplified all CLI commands by removing dual-path branching (
if pc.IsLinked) - Unified worktree function signatures:
CreateWorktree,RemoveWorktree,ListWorktreesnow operate on agitDirparameter - Updated banner to show
link,unlink, andcdcommands
- Preset availability test updated for new TARS preset
- Significantly improved
anvil syncauto-stash performance - Changed auto-stash to skip ignored files (node_modules, vendor, etc.) for much faster operation- Auto-stash now completes in seconds instead of minutes on large projects
- Changed from
git stash push --alltogit stash push --include-untracked - Still protects tracked modifications and untracked files
- Ignored files are safely skipped since git doesn't modify them during sync anyway
- Fixes hanging behavior on "Auto-stashing..." message with large projects
- Lint issues in codebase
- Release workflow now ensures gofmt and golangci-lint checks run
0.10.0 - 2026-02-04
- Display version in CLI banner output
- Automatic stashing in sync command to protect all local files during sync operations
- Ensure stash operation runs after sync confirmation
0.9.5 - 2026-02-04
No changes in this release.
0.9.4 - 2026-02-04
- Fix automated Homebrew formula updates using repository_dispatch
0.9.3 - 2026-02-04
- Homebrew formula now updates automatically on new releases
- Release workflow uses PAT to trigger subsequent workflows
- Solves GitHub Actions security limitation with GITHUB_TOKEN
- Added manual workflow_dispatch trigger as fallback
0.9.2 - 2026-02-04
- Homebrew Support - Anvil is now available via Homebrew
- Install with
brew tap artisanexperiences/tap && brew install anvil - Automated formula updates on new releases
- Support for macOS (arm64/amd64) and Linux (arm64/amd64)
- Install with
- BREAKING: Migrated repository from
michaeldyryndatoartisanexperiencesorganization- Module path changed from
github.com/michaeldyrynda/anviltogithub.com/naoray/anvil - All import paths updated across the codebase
- GitHub URLs updated in documentation
- Users installing via
go installmust update their commands
- Module path changed from
- MIT LICENSE file with proper copyright attribution
- Automated Homebrew formula update workflow
- Enhanced installation documentation with multiple installation methods
0.9.1 - 2026-02-04
- Laravel preset now captures and stores the generated app key for reuse
- App key is stored as
AppKeyvariable in scaffold context - Can be referenced in subsequent steps via
{{ .AppKey }}template - Automatically written back to
.envfile after generation
- App key is stored as
- Ensure consistency of variables being passed via ldflags during build
0.9.0 - 2026-02-04
-
Pre-flight checks to validate dependencies before scaffold execution
- Check for required commands, files, environment variables, and configuration
- Conditional evaluation support for complex dependency validation
- Clear error messages listing missing dependencies
- Abort scaffold early when dependencies are not met
-
Improved diagnostics and error messages for scaffold operations
- Correct ldflags path for version info in build configuration
0.8.1 - 2026-02-03
-
Prevent
anvil initfrom overwriting copied repository config- Now skips unnecessary SaveProject call when repo config is copied
- Only saves when explicitly setting a preset flag
-
Preserve YAML formatting and key ordering in config files
- Use AST-based yaml.Node instead of map serialization
- Maintain original structure, comments, and whitespace
- Only modify values that actually changed
0.8.0 - 2026-02-03
- Separate local state from team config
- New
.anvil.localfile for runtime state (gitignored) - Local state stores
db_suffixfor database naming - Automatic migration from old config format on first run
- No manual intervention required - seamless upgrade
- New
anvil.yamlnow contains only team-shared configuration- Scaffold steps and presets remain in team config
- Database suffix moves to local state file
- Cleaner separation between shared and local settings
- Deprecated worktree config helpers from config package
- Simplified configuration management
- Reduced code complexity
0.7.0 - 2026-02-02
- New
anvil synccommand for synchronizing worktrees with upstream branches- Fetch from remote and rebase (default) or merge with upstream
- Interactive prompts for upstream branch and strategy selection
- Configuration persistence to
anvil.yaml - Support for custom remotes (default: origin)
- Conflict detection with actionable error messages
- Pre-flight checks for detached HEAD, dirty worktree, and in-progress operations
- Added missing
repairandversioncommands to the CLI banner
0.6.0 - 2026-02-02
-
New
anvil repaircommand for fixing git configuration in existing projects- Configure fetch refspec in
.baredirectory for remote branch tracking - Automatically set up branch tracking for all local branches with remote counterparts
- Interactive prompts for remote URL confirmation and editing
--dry-runflag to preview changes without applying--refspec-onlyand--tracking-onlyflags for partial repairs- Idempotent - safe to run multiple times
- Configure fetch refspec in
-
Automatic branch tracking in
anvil workcommand- New worktrees automatically set up upstream tracking to origin
--no-trackflag to skip tracking setup when needed- Non-fatal errors - worktree creation continues even if tracking fails
-
Automatic fetch refspec configuration in
anvil init- Bare repositories now automatically configured for remote tracking
- Enables fetch, merge, and rebase operations from remote branches
-
New git helper functions for remote and branch management
ConfigureFetchRefspec()- Set up remote.origin.url and fetch refspecSetBranchUpstream()- Configure branch trackingGetBranchRefs()- List local and remote branchesHasFetchRefspec()andHasBranchTracking()- Check configuration state
- Windows CI failures resolved
0.5.0 - 2026-02-01
- Gradient block letter header with tree-themed styling for CLI commands
- New scaffold step
env.copyfor copying environment variables between worktrees - Step validation framework with
Validate()interface for all scaffold steps - File system interface abstraction for testable I/O operations
- Per-step configuration validation for early error detection
- Renamed
php.laravel.artisantophp.laravelfor consistency - Replaced Viper config library with yaml.v3 for cleaner config writes
- Migrated to embedded
BaseStepConfigfor all step configurations
- Implemented explicit step registry with ordered slice for deterministic iteration
- Introduced Command Executor interface for testable command execution
0.4.2 - 2026-02-01
- ARM64 architecture support for release binaries (macOS ARM64, Linux ARM64)
- Checksum generation for all release artifacts (SHA256)
- Reproducible builds with version information embedded in binary
- Resolve golangci-lint v2 errors
- Update documentation accuracy and cleanup config schema
- Upgrade golangci-lint to v2.1.2 for Go 1.24 compatibility
- Upgrade golangci-lint-action to v7 for golangci-lint v2 support
- Align Go versions across CI workflows
- Pin linter version for consistent builds
- Extract helpers for better code organization
- Implement deterministic preset detection
- Add condition accessors for cleaner code
- Return errors from step registry instead of silent failures
0.4.1 - 2026-01-30
- Output capture for scaffold steps with
store_asoption- Capture command output from
bash.run,command.run, and all binary steps - Store output as template variables for use in subsequent steps
- Automatic whitespace trimming of captured output
- Works with:
php,php.composer,php.laravel,node.npm,node.yarn,node.pnpm,node.bun,herd
- Capture command output from
0.3.1 - 2026-01-29
- Database naming now uses sanitized site name to handle hyphenated branch names correctly
- Laravel preset writes DB_DATABASE to .env after database creation to ensure migrations run against correct database
- Default branch worktrees now use saved SiteName instead of folder name to prevent Herd link collisions
- Scaffold command now correctly detects when running from project root vs worktree
- env.write step race conditions resolved with file locking for concurrent execution
- env.write now respects configured priority and creates parent directories as needed
- Removed priority system in favor of sequential step execution for predictable ordering
- Steps now execute in the exact order they appear in configuration
0.3.0 - 2026-01-28
- New scaffold steps: env.read, env.write, db.create, db.destroy
- Template variable system with dynamic substitution using Go's text/template
- Built-in template variables: Path, RepoPath, RepoName, SiteName, Branch, DbSuffix, SanitizedSiteName
- Custom variables from env.read steps available to subsequent steps
- Support for multiple databases with shared suffix generation
- DatabaseClient abstraction with mock support for testing
- Readable database name generation using adjective_noun word lists
- Automatic retry on database name collisions (up to 5 attempts)
- Persistent suffix storage in worktree-local config for cleanup
- Support for MySQL, PostgreSQL, and SQLite
- Mock implementations for database operations eliminate need for containerized tests
- Improved test coverage across scaffold steps
0.2.0 - 2026-01-20
- Complete interactive UI overhaul using Charm libraries
- Styled tables for 'anvil list'
- Interactive prompts for all commands
- Spinners for long-running operations
- Command output styling
- Root command banner and global flags
- Tree-themed color palette
- Enhanced 'anvil remove' command
- Add --delete-branch flag
- Interactive prompt for branch deletion
- Improved worktree picker when folder arg missing
- New 'anvil destroy' command for project cleanup
- Strip '+' prefix from branch names
- Force delete when user confirms branch deletion
- Prevent deletion of main worktree
- Ensure site name on init, folder name on work
- CI workflow updated to Go 1.24
- Various test fixes
- Show worktree picker when folder arg missing, regardless of --force
- Use IsInteractive() for initial arg prompts instead of ShouldPrompt
0.1.0 - 2026-01-20
- 'anvil list' command to display worktrees with their status
- Comprehensive documentation updates
- OS condition test to use runtime.GOOS
- Complete Phase 6 polish & cross-platform fixes
- Complete Phase 5 performance improvements
- Complete Phase 4 code consolidation
- Complete Phase 3 error handling improvements
- Complete Phase 2 quick wins
- Complete Phase 1 critical fixes
- Add Phase 0 safety net tests for refactor
0.0.2 - 2026-01-20
- 'anvil list' command to display worktrees
- Update documentation with list command
- Use tag annotation for release notes
0.0.1 - 2026-01-19
- Initial release
- Git worktree management
- Project initialization with scaffolding
- Laravel and PHP presets
- Interactive commands (work, prune)
- Multi-platform builds and CI/CD