0ba32c29dc
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
43 lines
1.3 KiB
Bash
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)"
|