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:
@@ -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)"
|
||||
Reference in New Issue
Block a user