feat(scripts): merge-settings.sh — jq merge with preservation of theme/editorMode

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Дмитрий
2026-05-11 00:50:56 +03:00
parent 9557109a17
commit 0ba32c29dc
3 changed files with 122 additions and 0 deletions
+42
View File
@@ -0,0 +1,42 @@
#!/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)"