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.
0.6.0 - 2026-04-17
.lnkignorefile support for gitignore-style ignore patterns in source directories-nshort flag for--dry-run-Vshort flag for--version- Transactional execution with rollback for
adoptandorphanoperations
- BREAKING:
adoptnow uses positional arguments (<source-dir> <path...>) instead of--pathand--source-dirflags - BREAKING:
orphannow uses positional arguments (<source-dir> <path...>) instead of config-based source discovery - BREAKING: All commands require
<source-dir>as a positional argument instead of using config file link mappings - BREAKING: Target directory is always
~; no longer configurable via config file mappings - BREAKING: Simplified to two verbosity levels: normal and verbose
- BREAKING:
--ignoreaccepts a single pattern per flag (repeatable) instead of comma-separated list
- BREAKING:
versionsubcommand (use-Vor--versionflag) - BREAKING:
confighelp topic - BREAKING:
--quiet/-qflag - BREAKING:
--yes/-yflag and confirmation prompts - BREAKING:
--outputflag and JSON output format - BREAKING:
--configflag and JSON configuration system (.lnk.json,~/.config/lnk/config.json) - BREAKING:
--pathflag fromadoptandorphan - BREAKING:
--source-dirflag fromadopt - Progress indicators
0.5.0 - 2026-02-16
- Homebrew installation support (
brew install cpplain/tap/lnk)
- BREAKING: Simplified version output to
lnk <version>for--versionflag andversioncommand (removed commit hash and build date; dev builds showdev+timestamp)
- BREAKING:
make installtarget (use Homebrew for installation)
0.4.0 - 2026-02-14
- Comprehensive end-to-end testing suite
- Zero-configuration defaults with flexible config discovery (
.lnkconfigin source dir,~/.config/lnk/config,~/.lnkconfig) - Global flags:
--verbose,--quiet,--yes,--no-color,--output - Command suggestions for typos, progress indicators, confirmation prompts
- JSON output and specific exit codes for scripting
- Improved help system with standardized formatting and "See also" sections
- Better output formatting with consistent indicators (✓, ✗, !) and
~for home - BREAKING: Renamed project from cfgman to lnk (binary, config, module)
- BREAKING: Command names
link→create,unlink→remove - BREAKING: Source directories must be absolute paths; removed
--repo-dir - BREAKING: Explicit flags required (
adopt --path PATH --source-dir DIR) - BREAKING: Replaced
--forcewith global--yes;--jsonwith--output FORMAT
- BREAKING: Custom environment variables (
LNK_CONFIG,LNK_IGNORE,LNK_DEBUG) - BREAKING:
initcommand (built-in defaults work without config)
--yesflag now correctly skips confirmation inremoveandprune- Adopt command flag parsing (previously consumed by global flags)
- Config file errors now reported instead of silently falling back to defaults
- Progress indicators only show after 1 second; no terminal artifacts
- Output spacing consistency across all commands
- Circular symlink validation for existing correct symlinks
- Test environment isolation from system config
0.3.0 - 2025-06-28
- BREAKING: File-only linking - Removed directory linking feature. cfgman now ONLY creates individual file symlinks, never directory symlinks. This ensures:
- Consistent behavior across all operations
- No conflicts between different source mappings
- Ability to mix files from different sources in the same directory
- Local-only files can coexist with managed configs
- Configuration-driven design - All behavior now controlled by
.cfgman.jsonwith no hardcoded defaults - Simplified codebase - Removed obsolete features and redundant logic for cleaner, more maintainable code
- Improved create-links workflow - Better performance and reliability when creating multiple symlinks
- Better error messages - More descriptive errors throughout, especially for adopt command when source directory is not in mappings
0.2.0 - 2025-06-28
- Switched from beta versioning (v1.0.0-beta.x) to standard pre-1.0 versioning (v0.x.x) to better align with semantic versioning practices for pre-release software
0.1.1 - 2025-06-27
- Orphan command message order - Messages now correctly reflect the actual operation order:
- Remove symlink
- Copy content back to original location
- Remove file from repository
- Redundant orphan messages - Fixed duplicate confirmation messages when orphaning directories with multiple symlinks
- Untracked file removal - Fixed issue where files not tracked by git were left in the repository after orphaning. The orphan command now properly removes all files from the repository regardless of git tracking status.
0.1.0 - 2025-06-24
Initial release of cfgman.
- Directory-based operation - Works from repository directory (like git, npm, make)
- Simple configuration format - Single
.cfgman.jsonfile with link mappings - Built-in ignore patterns - Gitignore-style pattern matching without git dependency
- Flexible link mappings - Map any source directory to any target location
- Smart linking strategies - Choose between file-level or directory-level linking
- Safety features:
- Dry-run mode for all operations
- Confirmation prompts for destructive actions
- Cross-repository symlink protection
- Core commands:
status- Show all managed symlinks with their stateadopt- Move existing files into repository managementorphan- Remove files from management (restore to original location)create-links- Create symlinks based on configurationremove-links- Remove all managed symlinksprune-links- Remove broken symlinks
- Performance - Concurrent operations for status checking
- Zero dependencies - Pure Go implementation using only standard library