Changelog

SemVer 2.0.0 Keep-A-Changelog 1.0.0

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,
and yes, platform and engine support are part of the public API.
Please file a bug if you notice a violation of semantic versioning.

Unreleased

Added

Changed

Deprecated

Removed

Fixed

Security

1.0.0 - 2026-02-19

  • TAG: v1.0.0
  • COVERAGE: 91.92% – 921/1002 lines in 14 files
  • BRANCH COVERAGE: 73.00% – 311/426 branches in 14 files
  • 97.39% documented

Added

  • AGENTS.md
  • Psych::Merge::DiffMapper - Maps unified git diffs to YAML AST key paths
    • Inherits from Ast::Merge::DiffMapperBase
    • #map_hunk_to_paths - Maps diff hunks to YAML key paths (e.g., ["AllCops", "Exclude"])
    • #create_analysis - Creates FileAnalysis for YAML content
    • Tracks nested paths via indentation and MappingEntry location data
    • Groups consecutive changed lines by their containing YAML node
  • Psych::Merge::PartialTemplateMerger - Merges partial YAML templates into specific key paths
    • Navigate to specific key paths (e.g., ["AllCops", "Exclude"]) in destination
    • Merge template content at that location while preserving rest of document
    • key_path: - Array of keys/indices to navigate to target location
    • add_missing: - Whether to add template items not in destination (default: true)
    • remove_missing: - Whether to remove destination items not in template (default: false)
    • when_missing: - Behavior when key path not found (:skip or :add, default: :skip)
    • recursive: - Whether to recursively merge nested structures (default: true)
    • Returns Result object with content, has_key_path, changed, stats, message
  • Psych::Merge::SmartMerger - New options for advanced merge control:
    • recursive: true | false | Integer - Control recursive merging of nested structures
      • true (default): Merge nested mappings/sequences recursively instead of replacing wholesale
      • false: Replace entire matched nodes (original behavior)
      • Integer > 0: Maximum recursion depth
    • remove_template_missing_nodes: false - When true, removes destination nodes not present in template
  • Psych::Merge::ConflictResolver - Recursive merge implementation:
    • #emit_recursive_merge - Recursively merge matched nodes
    • #emit_recursive_mapping_merge - Merge nested mapping entries
    • #emit_recursive_sequence_merge - Merge sequences with union semantics
    • #can_merge_recursively? - Check if two nodes can be recursively merged
    • Handles both MappingEntry and raw NodeWrapper nodes
  • node_typing parameter for per-node-type merge preferences
    • Enables preference: { default: :destination, special_type: :template } pattern
    • Works with custom merge_types assigned via node_typing lambdas
  • regions and region_placeholder parameters for nested content merging
  • Initial release

Changed

  • appraisal2 v3.0.6
  • kettle-test v1.0.10
  • stone_checksums v1.0.3
  • ast-merge v4.0.6
  • tree_haver v5.0.5
  • tree_stump v0.2.0
    • fork no longer required, updates all applied upstream
  • Updated documentation on hostile takeover of RubyGems
    • https://dev.to/galtzo/hostile-takeover-of-rubygems-my-thoughts-5hlo
  • SmartMerger: Added **options for forward compatibility
    • Accepts additional options that may be added to base class in future
    • Passes all options through to SmartMergerBase
  • ConflictResolver: Added **options for forward compatibility
    • Now passes match_refiner to base class instead of storing locally
  • MergeResult: Added **options for forward compatibility
  • Updated documentation on hostile takeover of RubyGems
    • https://dev.to/galtzo/hostile-takeover-of-rubygems-my-thoughts-5hlo

Fixed

  • ConflictResolver now applies Hash-based per-node-type preferences via node_typing.

Security