Skip to content

[BUG] Plugin userConfig values written to global settings.json even when plugin is installed with project scope #77739

Description

@arnevonappen

Claude Code version: 2.1.210

Description

When a plugin declares a userConfig block in plugin.json and is installed/enabled with project scope, the answers to the userConfig prompts are still written to the global ~/.claude/settings.json under pluginConfigs, instead of the project-local .claude/settings.json.

Steps to reproduce

  1. Author a plugin with a userConfig block in .claude-plugin/plugin.json, e.g.:
    "userConfig": {
      "local_repo_path": { "type": "directory", "required": true },
      "base_branch": { "type": "string", "default": "main" }
    }
  2. Install/enable the plugin scoped to a specific project (e.g. via the plugin UI, choosing "project" scope).
  3. Confirm the install was recorded as project-scoped — ~/.claude/plugins/installed_plugins.json shows:
    { "scope": "project", "projectPath": "C:\\...\\my-project", ... }
  4. Answer the userConfig prompts (e.g. local_repo_path: ../my-repo).
  5. Inspect where the values landed:
    • Project's ./.claude/settings.json → only contains enabledPlugins, no pluginConfigs entry.
    • Global ~/.claude/settings.json → contains the new entry:
      "pluginConfigs": {
        "my-plugin@my-marketplace": {
          "options": { "local_repo_path": "../my-repo", "base_branch": "main" }
        }
      }

Expected behavior

Since the plugin was explicitly installed with project scope, its userConfig answers should be stored alongside that scope (e.g. in the project's .claude/settings.json), not merged into the global user settings.

Actual behavior

pluginConfigs is always written to ~/.claude/settings.json, regardless of install scope. There appears to be no project-scoped storage location for userConfig answers at all.

Impact

Several userConfig fields are inherently project-relative by design (e.g. a type: "directory" field pointing at a sibling repo checkout, or a branch name). Because the values are forced into global scope:

  • Using the same plugin in two different projects with different config values overwrites the config for both — last write wins.
  • A project-relative path value (e.g. ../sibling-repo) becomes meaningless/wrong as soon as you're working in a different project.

This makes userConfig effectively unusable for any plugin meant to be installed per-project with per-project settings.

Related issues (none appear to be an exact duplicate of this specific scope mismatch):

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:pluginsbugSomething isn't workingdocumentationImprovements or additions to documentationreproducedBug reproduced by maintainers on a released build

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions