#!/usr/bin/env bash # Merge brain settings-fragment.json into consumer's settings.json # Replaces: enabledPlugins, permissions, hooks # Preserves: theme, editorMode, statusLine, all other keys # # Usage: merge-settings.sh set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" source "$SCRIPT_DIR/common.sh" target="$1" fragment="$2" require_cmd jq || exit 1 [ -f "$fragment" ] || { log_error "Fragment not found: $fragment"; exit 1; } # If target doesn't exist, just copy fragment if [ ! -f "$target" ]; then log_info "Target settings.json missing, creating from fragment" cp "$fragment" "$target" exit 0 fi # Backup backup="${target}.bak.$(date +%s)" cp "$target" "$backup" # Merge: target.* keys preserved EXCEPT enabledPlugins/permissions/hooks — those are REPLACED # (not deep-merged) from fragment. Use --slurpfile to load fragment into $frag. tmp="${target}.tmp" jq --slurpfile frag "$fragment" \ '.enabledPlugins = $frag[0].enabledPlugins | .permissions = $frag[0].permissions | .hooks = $frag[0].hooks' \ "$target" > "$tmp" # Validate output JSON jq empty "$tmp" || { log_error "Merge produced invalid JSON"; rm "$tmp"; exit 1; } mv "$tmp" "$target" log_info "settings.json merged (backup: $backup)"