[Bug] Settings.json serialization drops enabledPlugins key and reorders hook properties

Resolved 💬 3 comments Opened May 7, 2026 by ben-at-felicis Closed May 11, 2026

Bug Description
When the runtime re-serializes .claude/settings.json (unclear trigger — possibly at session start, or when toggling something via /plugins), it produces two unrequested changes: 1. Drops top-level enabledPlugins key entirely. I had "enabledPlugins": { "frontend-design@claude-plugins-official": true } set, was actively using the plugin during the session, and it disappeared from the file. Restoring it manually was the only way to get it back. 2. Reorders keys inside hook entries. Each hooks[*] entry was originally { "type", "if", "command" }; the rewrite produced { "type", "command", "if" }. Semantically identical, but creates noisy diffs every time the runtime touches the file. Expected: The runtime should round-trip settings.json losslessly — preserve unknown/extra top-level keys, preserve key order within objects. Repro context: macOS, Claude Code (version visible to telemetry), file last modified at 13:34 today during a long session that included multiple Write/Edit tool uses on other files. No manual edit of settings.json by me. Impact: Silently disabling a plugin the user is actively using is a real loss-of-functionality bug. The user only noticed because the plugin dropdown was empty when they went looking for it.

Environment Info

  • Platform: darwin
  • Terminal: Apple_Terminal
  • Version: 2.1.119
  • Feedback ID: 59e77154-86f7-4bce-854e-1867b21e2f8d

Errors

[{"error":"McpToolCallError: Tab 1010591668 no longer exists. Call tabs_context_mcp to get current tabs.\n    at QI7 (/$bunfs/root/src/entrypoints/cli.js:4829:63)\n    at processTicksAndRejections (native:7:39)","timestamp":"2026-05-05T18:45:39.772Z"},{"error":"McpToolCallError: Error capturing screenshot: Page still loading (executeScript waited 45000ms for document_idle). The previous action may have triggered navigation — try again in a moment.\n    at QI7 (/$bunfs/root/src/entrypoints/cli.js:4829:63)\n    at processTicksAndRejections (native:7:39)","timestamp":"2026-05-05T18:47:23.359Z"},{"error":"McpToolCallError: Error capturing screenshot: Page still loading (executeScript waited 45000ms for document_idle). The previous action may have triggered navigation — try again in a moment.\n    at QI7 (/$bunfs/root/src/entrypoints/cli.js:4829:63)\n    at processTicksAndRejections (native:7:39)","timestamp":"2026-05-05T18:48:15.751Z"},{"error":"McpToolCallError: Error capturing screenshot: Page still loading (executeScript waited 45000ms for document_idle). The previous action may have triggered navigation — try again in a moment.\n    at QI7 (/$bunfs/root/src/entrypoints/cli.js:4829:63)\n    at processTicksAndRejections (native:7:39)","timestamp":"2026-05-05T18:49:13.863Z"},{"error":"AxiosError: timeout of 5000ms exceeded\n    at <anonymous> (/$bunfs/root/src/entrypoints/cli.js:119:13291)\n    at emit (node:events:92:22)\n    at <anonymous> (/$bunfs/root/src/entrypoints/cli.js:118:3321)\n    at request (/$bunfs/root/src/entrypoints/cli.js:121:2467)\n    at processTicksAndRejections (native:7:39)","timestamp":"2026-05-05T19:07:39.401Z"},{"error":"AxiosError: timeout of 5000ms exceeded\n    at <anonymous> (/$bunfs/root/src/entrypoints/cli.js:119:13291)\n    at emit (node:events:92:22)\n    at <anonymous> (/$bunfs/root/src/entrypoints/cli.js:118:3321)\n    at request (/$bunfs/root/src/entrypoints/cli.js:121:2467)\n    at processTicksAndRejections (native:7:39)","timestamp":"2026-05-05T19:23:12.996Z"},{"error":"AxiosError: timeout of 5000ms exceeded\n    at <anonymous> (/$bunfs/root/src/entrypoints/cli.js:119:13291)\n    at emit (node:events:92:22)\n    at <anonymous> (/$bunfs/root/src/entrypoints/cli.js:118:3321)\n    at request (/$bunfs/root/src/entrypoints/cli.js:121:2467)\n    at async doExport (/$bunfs/root/src/entrypoints/cli.js:2673:36263)\n    at processTicksAndRejections (native:7:39)","timestamp":"2026-05-05T19:23:12.996Z"},{"error":"Error: Request was aborted.\n    at makeRequest (/$bunfs/root/src/entrypoints/cli.js:50:3448)\n    at processTicksAndRejections (native:7:39)","tim…

Note: Content was truncated.

View original on GitHub ↗

This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗