Files
brain/scripts/lib/merge-settings.sh
T
2026-05-11 00:50:56 +03:00

43 lines
1.3 KiB
Bash

#!/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 <consumer-settings.json> <brain-fragment.json>
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)"