Class: KairosMcp::ConfigMerger

Inherits:
Object
  • Object
show all
Defined in:
lib/kairos_mcp/config_merger.rb

Overview

ConfigMerger: Structural YAML merge for config files

Merges new template values into user-modified config files:

- New keys (only in template) → added with default values
- User-only keys (only in user file) → preserved
- Shared keys → user's value is kept
- Nested hashes → recursively merged
- Arrays → user's version is kept (no element-level merge)

This ensures config upgrades add new features without overwriting user customizations.

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(user_config, new_config) ⇒ ConfigMerger

Returns a new instance of ConfigMerger.



37
38
39
40
# File 'lib/kairos_mcp/config_merger.rb', line 37

def initialize(user_config, new_config)
  @user = user_config || {}
  @new = new_config || {}
end

Class Method Details

.merge(user_config, new_config) ⇒ Hash

Merge new template config into user config

Parameters:

  • user_config (Hash)

    User’s current config

  • new_config (Hash)

    New template config from gem

Returns:

  • (Hash)

    Merged config



24
25
26
# File 'lib/kairos_mcp/config_merger.rb', line 24

def self.merge(user_config, new_config)
  new(user_config, new_config).merge
end

.preview(user_config, new_config) ⇒ Hash

Preview what would change without applying

Parameters:

  • user_config (Hash)

    User’s current config

  • new_config (Hash)

    New template config from gem

Returns:

  • (Hash)

    Diff report with :added, :kept, :unchanged keys



33
34
35
# File 'lib/kairos_mcp/config_merger.rb', line 33

def self.preview(user_config, new_config)
  new(user_config, new_config).preview
end

Instance Method Details

#mergeHash

Perform the merge

Returns:

  • (Hash)

    Merged result



45
46
47
# File 'lib/kairos_mcp/config_merger.rb', line 45

def merge
  deep_merge(@user, @new)
end

#previewHash

Generate a diff preview

Returns:

  • (Hash)

    with :added, :removed_from_template, :user_customized, :unchanged



52
53
54
55
56
57
58
59
60
61
62
# File 'lib/kairos_mcp/config_merger.rb', line 52

def preview
  diff = {
    added: [],           # Keys in new but not in user (will be added)
    user_customized: [], # Keys where user has different value (user value kept)
    unchanged: [],       # Keys with same value in both
    user_only: []        # Keys only in user config (preserved)
  }

  collect_diff(@user, @new, [], diff)
  diff
end