Skip to content

Commit 359340d

Browse files
feat: add claude_code config object to toggle Claude Code compatibility features (#23)
1 parent 3eb88aa commit 359340d

File tree

5 files changed

+105
-8
lines changed

5 files changed

+105
-8
lines changed

README.ko.md

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,32 @@ OpenCode 는 아주 확장가능하고 아주 커스터마이저블합니다.
242242

243243
Oh My OpenCode는 Claude Code 설정과 완벽하게 호환됩니다. Claude Code를 사용하셨다면, 기존 설정을 그대로 사용할 수 있습니다.
244244

245+
#### 호환성 토글
246+
247+
특정 Claude Code 호환 기능을 비활성화하려면 `claude_code` 설정 객체를 사용하세요:
248+
249+
```json
250+
{
251+
"claude_code": {
252+
"mcp": false,
253+
"commands": false,
254+
"skills": false,
255+
"agents": false,
256+
"hooks": false
257+
}
258+
}
259+
```
260+
261+
| 토글 | `false`일 때 로딩 비활성화 경로 | 영향 받지 않음 |
262+
|------|-------------------------------|---------------|
263+
| `mcp` | `~/.claude/.mcp.json`, `./.mcp.json`, `./.claude/.mcp.json` | 내장 MCP (context7, websearch_exa) |
264+
| `commands` | `~/.claude/commands/*.md`, `./.claude/commands/*.md` | `~/.config/opencode/command/`, `./.opencode/command/` |
265+
| `skills` | `~/.claude/skills/*/SKILL.md`, `./.claude/skills/*/SKILL.md` | - |
266+
| `agents` | `~/.claude/agents/*.md`, `./.claude/agents/*.md` | 내장 에이전트 (oracle, librarian 등) |
267+
| `hooks` | `~/.claude/settings.json`, `./.claude/settings.json`, `./.claude/settings.local.json` | - |
268+
269+
모든 토글은 기본값이 `true` (활성화)입니다. 완전한 Claude Code 호환성을 원하면 `claude_code` 객체를 생략하세요.
270+
245271
#### Hooks 통합
246272

247273
Claude Code의 `settings.json` 훅 시스템을 통해 커스텀 스크립트를 실행합니다. Oh My OpenCode는 다음 위치의 훅을 읽고 실행합니다:

README.md

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,32 @@ Don't need these? Disable them via `oh-my-opencode.json`:
240240

241241
Oh My OpenCode provides seamless Claude Code configuration compatibility. If you've been using Claude Code, your existing setup works out of the box.
242242

243+
#### Compatibility Toggles
244+
245+
If you want to disable specific Claude Code compatibility features, use the `claude_code` configuration object:
246+
247+
```json
248+
{
249+
"claude_code": {
250+
"mcp": false,
251+
"commands": false,
252+
"skills": false,
253+
"agents": false,
254+
"hooks": false
255+
}
256+
}
257+
```
258+
259+
| Toggle | When `false`, disables loading from... | NOT affected |
260+
|--------|----------------------------------------|--------------|
261+
| `mcp` | `~/.claude/.mcp.json`, `./.mcp.json`, `./.claude/.mcp.json` | Built-in MCPs (context7, websearch_exa) |
262+
| `commands` | `~/.claude/commands/*.md`, `./.claude/commands/*.md` | `~/.config/opencode/command/`, `./.opencode/command/` |
263+
| `skills` | `~/.claude/skills/*/SKILL.md`, `./.claude/skills/*/SKILL.md` | - |
264+
| `agents` | `~/.claude/agents/*.md`, `./.claude/agents/*.md` | Built-in agents (oracle, librarian, etc.) |
265+
| `hooks` | `~/.claude/settings.json`, `./.claude/settings.json`, `./.claude/settings.local.json` | - |
266+
267+
All toggles default to `true` (enabled). Omit the entire `claude_code` object for full Claude Code compatibility.
268+
243269
#### Hooks Integration
244270

245271
Execute custom scripts via Claude Code's `settings.json` hook system. Oh My OpenCode reads and executes hooks defined in:

assets/oh-my-opencode.schema.json

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,32 @@
154154
}
155155
}
156156
}
157+
},
158+
"claude_code": {
159+
"type": "object",
160+
"description": "Toggle Claude Code compatibility features on/off. All default to true (enabled).",
161+
"properties": {
162+
"mcp": {
163+
"type": "boolean",
164+
"description": "Load MCP servers from ~/.claude/.mcp.json, ./.mcp.json, ./.claude/.mcp.json"
165+
},
166+
"commands": {
167+
"type": "boolean",
168+
"description": "Load commands from ~/.claude/commands/*.md, ./.claude/commands/*.md"
169+
},
170+
"skills": {
171+
"type": "boolean",
172+
"description": "Load skills from ~/.claude/skills/*/SKILL.md, ./.claude/skills/*/SKILL.md"
173+
},
174+
"agents": {
175+
"type": "boolean",
176+
"description": "Load agents from ~/.claude/agents/*.md, ./.claude/agents/*.md"
177+
},
178+
"hooks": {
179+
"type": "boolean",
180+
"description": "Execute hooks from ~/.claude/settings.json, ./.claude/settings.json, ./.claude/settings.local.json"
181+
}
182+
}
157183
}
158184
}
159185
}

src/config/schema.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,20 @@ export const AgentOverrideConfigSchema = z.object({
4242

4343
export const AgentOverridesSchema = z.record(AgentNameSchema, AgentOverrideConfigSchema)
4444

45+
export const ClaudeCodeConfigSchema = z.object({
46+
mcp: z.boolean().optional(),
47+
commands: z.boolean().optional(),
48+
skills: z.boolean().optional(),
49+
agents: z.boolean().optional(),
50+
hooks: z.boolean().optional(),
51+
})
52+
4553
export const OhMyOpenCodeConfigSchema = z.object({
4654
$schema: z.string().optional(),
4755
disabled_mcps: z.array(McpNameSchema).optional(),
4856
disabled_agents: z.array(AgentNameSchema).optional(),
4957
agents: AgentOverridesSchema.optional(),
58+
claude_code: ClaudeCodeConfigSchema.optional(),
5059
})
5160

5261
export type OhMyOpenCodeConfig = z.infer<typeof OhMyOpenCodeConfigSchema>

src/index.ts

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,10 @@ function mergeConfigs(
101101
...(override.disabled_mcps ?? []),
102102
]),
103103
],
104+
claude_code:
105+
override.claude_code !== undefined || base.claude_code !== undefined
106+
? { ...(base.claude_code ?? {}), ...(override.claude_code ?? {}) }
107+
: undefined,
104108
};
105109
}
106110

@@ -132,6 +136,7 @@ function loadPluginConfig(directory: string): OhMyOpenCodeConfig {
132136
agents: config.agents,
133137
disabled_agents: config.disabled_agents,
134138
disabled_mcps: config.disabled_mcps,
139+
claude_code: config.claude_code,
135140
});
136141
return config;
137142
}
@@ -148,7 +153,9 @@ const OhMyOpenCodePlugin: Plugin = async (ctx) => {
148153
const directoryReadmeInjector = createDirectoryReadmeInjectorHook(ctx);
149154
const emptyTaskResponseDetector = createEmptyTaskResponseDetectorHook(ctx);
150155
const thinkMode = createThinkModeHook();
151-
const claudeCodeHooks = createClaudeCodeHooksHook(ctx, {});
156+
const claudeCodeHooks = createClaudeCodeHooksHook(ctx, {
157+
disabledHooks: (pluginConfig.claude_code?.hooks ?? true) ? undefined : true,
158+
});
152159
const anthropicAutoCompact = createAnthropicAutoCompactHook(ctx);
153160

154161
updateTerminalTitle({ sessionId: "main" });
@@ -165,8 +172,9 @@ const OhMyOpenCodePlugin: Plugin = async (ctx) => {
165172
pluginConfig.disabled_agents,
166173
pluginConfig.agents,
167174
);
168-
const userAgents = loadUserAgents();
169-
const projectAgents = loadProjectAgents();
175+
176+
const userAgents = (pluginConfig.claude_code?.agents ?? true) ? loadUserAgents() : {};
177+
const projectAgents = (pluginConfig.claude_code?.agents ?? true) ? loadProjectAgents() : {};
170178

171179
config.agent = {
172180
...builtinAgents,
@@ -178,20 +186,22 @@ const OhMyOpenCodePlugin: Plugin = async (ctx) => {
178186
...config.tools,
179187
};
180188

181-
const mcpResult = await loadMcpConfigs();
189+
const mcpResult = (pluginConfig.claude_code?.mcp ?? true)
190+
? await loadMcpConfigs()
191+
: { servers: {} };
182192
config.mcp = {
183193
...config.mcp,
184194
...createBuiltinMcps(pluginConfig.disabled_mcps),
185195
...mcpResult.servers,
186196
};
187197

188-
const userCommands = loadUserCommands();
198+
const userCommands = (pluginConfig.claude_code?.commands ?? true) ? loadUserCommands() : {};
189199
const opencodeGlobalCommands = loadOpencodeGlobalCommands();
190200
const systemCommands = config.command ?? {};
191-
const projectCommands = loadProjectCommands();
201+
const projectCommands = (pluginConfig.claude_code?.commands ?? true) ? loadProjectCommands() : {};
192202
const opencodeProjectCommands = loadOpencodeProjectCommands();
193-
const userSkills = loadUserSkillsAsCommands();
194-
const projectSkills = loadProjectSkillsAsCommands();
203+
const userSkills = (pluginConfig.claude_code?.skills ?? true) ? loadUserSkillsAsCommands() : {};
204+
const projectSkills = (pluginConfig.claude_code?.skills ?? true) ? loadProjectSkillsAsCommands() : {};
195205

196206
config.command = {
197207
...userCommands,

0 commit comments

Comments
 (0)