Changelog¶
All notable changes to Genifest will be documented in this page.
This project adheres to Semantic Versioning.
v1.0.0-rc6 2025-11-17¶
-
Output Mode Support: Flexible output formatting for different use cases and environments
- Multiple output modes supporting color, plain, markdown, and auto detection
- TTY detection automatically switches between color and plain modes based on terminal context
- Markdown output for documentation generation and integration with documentation workflows
- Consistent interface across validate and run commands with --output flag
- Backwards compatibility maintaining existing behavior when no output mode specified
-
Installation Script Improvements: Enhanced user documentation and binary optimization
- Documentation added to install script explaining each step and why sudo is required
- Binary size optimization with build flags
-s -wto strip debugging information - User reassurance with clear explanations of what the install script is doing
- Variable expansion fix in sudo command to properly handle download URLs
v1.0.0-rc5 2025-09-21¶
Complete revamp of tag system with groups-based selection, multi-format support, enhanced value generation, and improved developer experience.
-
Groups-Based Tag System: Revolutionary new approach to tag selection and organization
- Groups configuration with customizable tag expression patterns for organizing changes
- Default "all" group containing
["*"]for backward compatibility with existing workflows - Tag expressions supporting wildcards (
*), negations (!tag-name), and directory scoping (dir:tag) - Expression evaluation with sequential processing where later expressions override earlier ones
- Flexible matching allowing complex combinations like
["*", "!secret-*", "secret-foo"]
-
Enhanced CLI Argument Structure: Modernized command-line interface with intuitive argument handling
- Zero arguments: Uses "all" group in current directory (
genifest run) - One argument: Group name in current directory OR directory path with "all" group
- Two arguments: Specified group name in specified directory (
genifest run dev examples/guestbook) - Intelligent parsing that distinguishes between group names and directory paths
- --tag option for adding additional tag expressions to any group selection
- Zero arguments: Uses "all" group in current directory (
-
Multi-Format Configuration Support: Extended beyond YAML to support additional configuration formats
- TOML support with complete read/write capabilities for
.tomlconfiguration files - Format detection automatically identifies file format from extension (
.yaml,.yml,.toml) - Universal processing allows changes to be applied to any supported format
- Extensible architecture in
internal/fileformat/for future format additions - Format-agnostic operations with unified AST representation for all formats
- TOML support with complete read/write capabilities for
-
Enhanced Value Generation System: Expanded ValueFrom types with new capabilities
- Environment variable support with new
envReftype for reading environment variables - Default value handling for environment variables when not set or empty
- Transient changes in file inclusion allowing temporary modifications during file embedding
- Document context preservation for
documentRefoperations within included files - Validation improvements with filename context in error messages for better debugging
- Environment variable support with new
-
File Inclusion Enhancements: Advanced file embedding with on-the-fly modifications
- Transient changes apply modifications to included files without persisting changes to disk
- DocumentSelector support for targeting specific documents in multi-document included files
- Tag-based filtering allowing conditional application of transient changes
- Context-aware operations preserving document references and variable scoping
- Non-destructive processing ensuring original files remain unmodified
-
Directory-Scoped Tag Expressions: Advanced scoping system for complex project structures
- Scoped expressions using
<directory>:<tag-expression>syntax for targeted rule application - Automatic directory prefixing when merging subordinate configurations
- Nested rule application where child directory rules are applied after parent rules
- Path-aware matching ensuring expressions only apply to appropriate directory contexts
- Scoped expressions using
-
Developer Experience Improvements: Enhanced tooling and validation feedback
- Contextual error messages with filename and path information for configuration validation
- Improved validation feedback making debugging configuration issues significantly easier
- Enhanced documentation structure with comprehensive guidance for contributors
- Cleaner CLI validation with removal of redundant validation tips and warnings
-
Configuration Merging Improvements: Enhanced configuration loading with groups support
- Groups merging with proper directory scoping and inheritance
- Default groups automatically provided when not specified in configuration
- Hierarchical merging preserving parent-child relationships in nested configurations
- Context preservation maintaining directory information throughout the merge process
-
Breaking Changes (no backward compatibility for RC software):
- Removed --include-tags/--exclude-tags in favor of groups-based selection
- New argument structure requires explicit group names for non-default selections
- Groups section now required for custom tag selection (defaults provided automatically)
-
Real-World Examples:
groups: all: ["*"] # All tags (default behavior) config-only: ["config"] # Only configuration changes no-secrets: ["*", "!secret-*"] # Everything except secrets dev: ["config", "image", "!production"] # Development environment prod: ["*", "!dev-*", "!test-*"] # Production with exclusions changes: - keySelector: ".database.host" valueFrom: envRef: # Read from environment variable name: "DB_HOST" default: "localhost" # Fallback if not set - keySelector: ".spec.template" valueFrom: fileInclusion: # Include file with modifications source: "templates/base.yaml" changes: # Transient changes (not persisted) - keySelector: ".metadata.name" valueFrom: default: value: "custom-name" -
Advanced Usage Patterns:
genifest run # All changes (default group) genifest run config-only # Only config changes genifest run dev examples/app # Dev group in specific directory genifest run --tag "!secret" prod # Add negation to prod group # Multi-format support genifest run --include-tags toml # Process TOML configuration files
v1.0.0-rc4 2025-08-29¶
DocumentSelector for multi-document YAML targeting and smart bracket parsing enhancements.
-
DocumentSelector Feature: Multi-document YAML file targeting capability
- Document targeting using simple key-value matching with dot notation (
metadata.name,kind) - Multi-document support for YAML files with resources separated by
--- - Precise selection allowing different changes to different documents in the same file
- Optional usage - when omitted, changes apply to all documents in the file
- Real-world usage for ConfigMaps, Secrets, and Deployments in consolidated files
- Document targeting using simple key-value matching with dot notation (
-
Smart Bracket Parsing: Enhanced keySelector expression parsing for complex keys
- Quote-aware parsing correctly distinguishes numeric indices from quoted string keys
- String key support for keys starting with numbers like
["1password.json"] - Prevents numeric parsing of quoted strings that happen to start with digits
- Backward compatibility maintaining existing numeric index functionality
[0],[-1] - Special character support for keys with dots, dashes, and complex names
-
README Documentation Enhancements:
- Document Selection section with comprehensive multi-document YAML examples
- Smart bracket parsing examples showing
["1password.json"]vs numeric[1] - Alternative operator documentation with
//fallback value examples - Enhanced key features highlighting quote handling and parsing improvements
- DocumentSelector features explaining targeting capabilities and use cases
v1.0.0-rc3 2025-08-22¶
Enhanced keySelector syntax with advanced pipeline operations and comprehensive documentation updates.
-
Advanced KeySelector Syntax: Complete implementation of complex yq-style expressions
- Array iteration with
[]syntax for processing all elements in arrays - Pipeline operations using
|operator for chaining multiple operations - Filtering functions with
select()for conditional element selection - Comparison operators supporting
==and!=for equality tests - Complex expressions like
.spec.containers[] | select(.name == "frontend") | .image - Grammar-based parsing using
participle/v2for robust expression handling - Write operation support for complex expressions enabling modification of selected elements
- Array iteration with
-
Implementation Architecture:
- New parser package
internal/keyselwith complete AST-based expression parsing - Evaluation engine supporting pipeline processing with array iteration and filtering
- Backward compatibility maintaining support for simple path expressions
- Expression validation at parse-time with clear error messages
- Dual write paths handling both simple and complex expressions efficiently
- New parser package
-
Real-world Applications:
- Container targeting by name instead of index (
.containers[] | select(.name == "app")) - Multi-container deployments with selective updates to specific containers
- Sidecar management updating proxy, logging, and monitoring containers independently
- Environment-specific configuration with conditional container selection
- Modern Kubernetes patterns supporting named container architectures
- Container targeting by name instead of index (
-
Documentation Enhancements:
- Comprehensive keySelector reference with complete syntax guide and examples
- Advanced patterns documentation with real-world pipeline examples
- Updated schema documentation reflecting new syntax capabilities
- Enhanced README with modern keySelector examples and feature comparisons
- Changelog synchronization between main changelog and docs site
-
Code Quality Improvements:
- Parser grammar fixes resolving infinite loop issues with empty path components
- Expression evaluation supporting complex pipelines with proper error handling
- Test coverage comprehensive tests for all new syntax features
- Integration validation verified with guestbook examples
v1.0.0-rc2 2025-08-19¶
Major CLI restructuring and enhanced user experience improvements.
-
CLI Architecture Overhaul: Converted from flag-based to subcommand-based architecture
genifest run [directory]- Apply changes with enhanced progress reportinggenifest tags [directory]- List all available tags in configurationgenifest validate [directory]- Validate configuration without applying changesgenifest config [directory]- Display merged configuration in YAML formatgenifest version- Show version information- All commands support optional directory arguments for operation from any location
-
Enhanced Output and Reporting:
- Detailed progress reporting with emoji indicators
- Change tracking shows
file -> document[index] -> key: old → newfor all modifications - Clear distinction between changes applied vs actual modifications made
- Comprehensive statistics and file modification summaries
-
Code Quality Improvements:
- Extracted ~100 lines of duplicate code into shared utilities (
internal/cmd/common.go) - Improved error handling with rich context and user-friendly messages
- Fixed file path handling bug in configuration loading for nested directories
- Enhanced file selector pattern matching logic
- Extracted ~100 lines of duplicate code into shared utilities (
-
User Experience Enhancements:
- Running
genifestwithout subcommand now shows help instead of applying changes - Better validation with actionable error messages
- Configuration display for debugging and understanding project structure
- Running
v1.0.0-rc1 2025-08-18¶
This is a complete rewrite of genifest, removing all the old cruft and making it more flexible.
- The primary configuration file is now named
genifest.yamland must be in the same directory that thegenifestbinary is run. -
The system supports three top-level types of configuration files: manifests, files, and scripts.
- Manifests are for YAML files organized into application sub-directories, a typical arrangement for a Kubernetes cluster configuration.
- Files are for general configuration files, also organized into application sub-directories. These may be embedded into other files using
valueFrom.file. - Scripts are for executable scripts used to derive content for inclusion in manifests. Only scripts found in these directories will be permitted to run using
valueFrom.script.
-
Other
genifest.yamlconfigurations found in these directories are loaded and merged into the top-level one before processing and applying changes. - Changes are applied in-place, expecting the user to use version control to track changes as part of a gitops process.
- The system defines a simple tag-based scheme for choosing which changes to execute on each run.
-
The following
valueFromtypes are defined:callfunctions as a simple macro for calling othervalueFromexpressions.pipelinedefines a way of chaining operations together so that the output from a previous step can feed into a following stepfileembeds a file from a file directory into another YAML filetemplateallows for the creation of simple templates using${var}style interpolationscriptexecutes custom scripts found in a scripts directoryargRefis used to read variables and arguments inside avalueFromor function definitiondefaultis used for literal valuesdocumentRefis used to lookup values elsewhere in the current YAML document and use the looked up value
v0.2.0 2025-07-17¶
- The ddbLookup function in templates now supports
BOOLfields and also nested fields withM(e.g.,Counter.M.prod.N). - Updated github.com/bmatcuk/doublestar/v4 to v4.9.0
- Updated k8s.io/apimachinery to v0.33.2
- Updated k8s.io/client-go to v0.33.2
- Updated github.com/spf13/cobra to v1.9.1
- Updated github.com/bitnami/labs to v0.30.0
v0.1.4 2024-10-15¶
- Upgraded to go-std v0.9.1 to fix a bug in string indents.
v0.1.3 2024-09-05¶
- Adding Arm64 builds for Linux.
v0.1.2 2024-08-09¶
- Upgraded to Ghost v0.6.2
v0.1.1 2024-08-09¶
- Fix a bug in
filethat caused it to files whenfiles_dirwas set.
v0.1.0 2024-08-09¶
- Added the
files_dirsetting to cluster configuration to set the location of the directory used to load files when calling thefilesfunction when templating. - Fixed a minor problem with secrets skipping. It didn't always work correctly when the
applyTemplatefunction to template a second file. - Added the
ghostsection to cluster configuration for configuringghostfor secrets management. - Added
ghost.configto cluster configuration to select the configuration file to use for working with secrets. - Added
ghost.keeperto cluster configuration to select the secrets keeper to use for working with secrets.
v0.0.2 2024-06-27¶
- Fixing the install script.
v0.0.1 2024-06-27¶
- Adding binaries to the release.
v0.0.0 2024-06-25¶
- Initial release.
For more details about any release, see the GitHub releases page.