Problem
In `packages/cli/src/config/settings.ts` line ~322, `hooksConfig` and `hooks` objects are merged across settings scopes (system, user, workspace) using shallow spread (`...spread`).
This means a higher-precedence scope that sets only one nested field (e.g., workspace sets `hooksConfig.disabled`) completely replaces the entire lower-precedence `hooksConfig` object, silently dropping other fields like `enabled` or `notifications` from the user scope.
Expected Behavior
Settings scopes should deep-merge nested objects so that workspace-level overrides only replace the specific nested fields they define, preserving unrelated fields from lower-precedence scopes.
Reproduction
- Set user-level: `hooksConfig: { enabled: true, disabled: ['hookA'] }`
- Set workspace-level: `hooksConfig: { disabled: [] }`
- Observe: `enabled` is lost from the merged result
Context
Discovered during CodeRabbit review of PR #1797 (gmerge/0.26.0). Requires careful deep-merge logic and thorough testing to avoid breaking other settings.
Problem
In `packages/cli/src/config/settings.ts` line ~322, `hooksConfig` and `hooks` objects are merged across settings scopes (system, user, workspace) using shallow spread (`...spread`).
This means a higher-precedence scope that sets only one nested field (e.g., workspace sets `hooksConfig.disabled`) completely replaces the entire lower-precedence `hooksConfig` object, silently dropping other fields like `enabled` or `notifications` from the user scope.
Expected Behavior
Settings scopes should deep-merge nested objects so that workspace-level overrides only replace the specific nested fields they define, preserving unrelated fields from lower-precedence scopes.
Reproduction
Context
Discovered during CodeRabbit review of PR #1797 (gmerge/0.26.0). Requires careful deep-merge logic and thorough testing to avoid breaking other settings.