Skip to content

feat: Auto-remove deprecated hooks and MCP servers during merge #292

@kaitranntt

Description

@kaitranntt

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

  1. Hooks: Compare installedSettings.hooks with source.hooks, remove missing
  2. MCP Servers: Compare installedSettings.mcp.servers with source.mcp.servers, remove missing
  3. Logging: Log removed items clearly for user visibility
  4. Metrics: Add hooksRemoved, mcpServersRemoved to MergeResult
  5. 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 to mergeHooks(), mergeMcp()
  • src/domains/config/merger/types.ts - Add removal counters to MergeResult
  • src/domains/config/merger/conflict-resolver.ts - Helper for identifying deprecated entries

Test Cases

  1. Hook in installed but not in source → removed from destination
  2. MCP server in installed but not in source → removed from destination
  3. User-added hook (not in installed) → preserved
  4. Hook in both installed and source → preserved
  5. 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

Metadata

Metadata

Assignees

Labels

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions