-
Notifications
You must be signed in to change notification settings - Fork 27
Closed
Labels
Description
Problem
The config merger currently only adds settings from kits - it doesn't remove settings that kits no longer ship. This causes orphaned entries:
| Scenario | Current | Expected |
|---|---|---|
| Kit removes a hook | Stays in user settings | Should be removed |
| Kit removes MCP server | Stays in user settings | Should be removed |
| Kit removes other config | Stays in user settings | Should be removed |
Example: claudekit-engineer removed PreCompact hook and write-compact-marker.cjs in PR #301. Existing users will have orphaned hook pointing to deleted file → errors on compact.
Proposed Solution
Add deprecation detection to mergeHooks() and mergeMcp() in src/domains/config/merger/:
// Pseudo-logic
deprecatedHooks = installedHooks.filter(hook =>
!sourceHooks.includes(hook) // Was installed, no longer in kit
);
for (const hook of deprecatedHooks) {
removeFromDestination(hook);
result.hooksRemoved++;
logger.info(`Removed deprecated hook: ${hook}`);
}Requirements
- Hooks: Compare
installedSettings.hookswithsource.hooks, remove missing - MCP Servers: Compare
installedSettings.mcp.serverswithsource.mcp.servers, remove missing - Logging: Log removed items clearly for user visibility
- Metrics: Add
hooksRemoved,mcpServersRemovedtoMergeResult - Safety: Only remove CK-managed entries (identified by installedSettings), preserve user-added
Files to Modify
src/domains/config/merger/merge-engine.ts- Add removal logic tomergeHooks(),mergeMcp()src/domains/config/merger/types.ts- Add removal counters toMergeResultsrc/domains/config/merger/conflict-resolver.ts- Helper for identifying deprecated entries
Test Cases
- Hook in installed but not in source → removed from destination
- MCP server in installed but not in source → removed from destination
- User-added hook (not in installed) → preserved
- Hook in both installed and source → preserved
- Edge: Empty installedSettings → no removals (fresh install)
Related
- claudekit-engineer PR #301 (removed PreCompact hook)
- Existing respect-user-deletion logic in
mergeHookEntries()lines 131-147