Skip to content

Claude plugin commands leak into OpenCode despite OPENCODE_DISABLE_CLAUDE_CODE* #2037

@gustavosmendes

Description

@gustavosmendes

Bug Description

oh-my-opencode bypasses OpenCode's OPENCODE_DISABLE_CLAUDE_CODE* env vars by independently reading ~/.claude/plugins/installed_plugins.json and injecting Claude Code components into the resolved config — without checking process.env.

OpenCode core already respects these env vars and disables Claude Code integration when they are set (confirmed in anomalyco/opencode#10383). The issue is exclusively in oh-my-opencode's independent Claude plugin loader path.

Environment

  • OpenCode: 1.2.10
  • oh-my-opencode: 3.8.1
  • OS: macOS (Darwin)

Steps to Reproduce

  1. Have any Claude Code plugins installed (e.g., everything-claude-code, frontend-design@claude-plugins-official).
  2. Include "oh-my-opencode@latest" in OpenCode's plugin array.
  3. Set env vars:
    export OPENCODE_DISABLE_CLAUDE_CODE=1
    export OPENCODE_DISABLE_CLAUDE_CODE_PROMPT=1
    export OPENCODE_DISABLE_CLAUDE_CODE_SKILLS=1
    export OPENCODE_DISABLE_EXTERNAL_SKILLS=1
  4. Run:
    opencode debug config | rg "everything-claude-code|frontend-design"

Expected Behavior

Claude Code plugin components should not appear in OpenCode's resolved config when OPENCODE_DISABLE_CLAUDE_CODE=1 is set.

Actual Behavior

Claude Code plugin entries (commands, skills, agents) still appear in the resolved config.

Disabling oh-my-opencode or setting claude_code.*: false in oh-my-opencode.json stops the leak — confirming the source.

Root Cause

Zero integration with OPENCODE_DISABLE_* env vars

Searching the oh-my-opencode codebase for OPENCODE_DISABLE returns zero results. The plugin never reads process.env for these variables.

7 opt-out gates default to true

All Claude Code component loading uses pluginConfig.claude_code?.X ?? true. When claude_code is absent from config (the default), all gates resolve to true:

File Gate Component
src/plugin-handlers/plugin-components-loader.ts claude_code?.plugins ?? true Plugin discovery from ~/.claude/plugins/
src/plugin-handlers/command-config-handler.ts claude_code?.commands ?? true Commands
src/plugin-handlers/command-config-handler.ts claude_code?.skills ?? true Skills (command context)
src/plugin-handlers/agent-config-handler.ts claude_code?.skills ?? true Skills (agent awareness)
src/plugin-handlers/agent-config-handler.ts claude_code?.agents ?? true Agents from ~/.claude/agents/
src/plugin-handlers/mcp-config-handler.ts claude_code?.mcp ?? true MCP servers
src/plugin/hooks/create-transform-hooks.ts claude_code?.hooks ?? true Hooks

src/plugin/skill-context.ts uses an equivalent variant: claude_code?.skills !== false.

Workaround

{
  "claude_code": {
    "agents": false,
    "commands": false,
    "hooks": false,
    "mcp": false,
    "plugins": false,
    "skills": false
  }
}

Suggested Fixes

  1. Honor OpenCode env flags: Check process.env.OPENCODE_DISABLE_CLAUDE_CODE (and related vars) as hard gates in src/plugin-config.ts before evaluating claude_code.* config properties.
  2. Add global claude_code.enabled switch: Single master toggle in ClaudeCodeConfigSchema, subordinating per-component switches.
  3. Safer default: Auto-disable Claude plugin import when OPENCODE_DISABLE_CLAUDE_CODE=1 is set.

Related

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingconfirmedBug confirmed / reproducible

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions