์‹œ๋ฆฌ์ฆˆ: oh-my-claudecode ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ถ€ํ„ฐ ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ฐœ๋ฐœ๊นŒ์ง€

์ด ์‹œ๋ฆฌ์ฆˆ๋Š” Claude Code ํ”Œ๋Ÿฌ๊ทธ์ธ ์‹œ์Šคํ…œ์˜ ๋‚ด๋ถ€ ๋™์ž‘์„ ๋‹จ๊ณ„๋ณ„๋กœ ํ•ด๋ถ€ํ•˜๊ณ , ์ตœ์ข…์ ์œผ๋กœ ๋‚˜๋งŒ์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ง์ ‘ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒƒ๊นŒ์ง€ ๋„๋‹ฌํ•˜๋Š” ๊ณผ์ •์ด๋‹ค.

ํŽธ๋‚ด์šฉํ•ต์‹ฌ
1ํŽธ (๋ณธ๋ฌธ)Plugin Anatomyplugin.json ํ•˜๋‚˜๋กœ ์‹œ์ž‘ํ•˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ผˆ๋Œ€
2ํŽธHook System์ด๋ฒคํŠธ โ†’ stdin JSON โ†’ ์Šคํฌ๋ฆฝํŠธ โ†’ stdout JSON
3ํŽธSkill SystemSKILL.md๋กœ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•
4ํŽธAgent SystemTask tool๋กœ ์œ„์ž„๋˜๋Š” ์‹ค์ œ ์ž‘์—… ์ˆ˜ํ–‰์ž
5ํŽธMCP Tools BridgeLSP, AST ๋“ฑ ์ปค์Šคํ…€ ๋„๊ตฌ ์„œ๋ฒ„
6ํŽธState & Lifecycle.omc/ ์ƒํƒœ ๊ด€๋ฆฌ์™€ ๋ชจ๋“œ ์ง€์†
7ํŽธParallel OrchestrationUltrawork, Team, Autopilot, Ralph ํŒจํ„ด

  • Claude Code Plugin์€ Claude Code์˜ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•˜๋Š” ์ž๊ธฐ์™„๊ฒฐ์  ๋””๋ ‰ํ† ๋ฆฌ ๋‹จ์œ„ ํŒจํ‚ค์ง€
  • .claude-plugin/plugin.json ๋งค๋‹ˆํŽ˜์ŠคํŠธ ํ•˜๋‚˜๋กœ ์‹๋ณ„๋˜๋ฉฐ, ๋‚˜๋จธ์ง€ ์ปดํฌ๋„ŒํŠธ๋Š” ์ „๋ถ€ ์„ ํƒ
  • Hook, MCP, Skill, Agent, LSP 5๊ฐ€์ง€ ํ™•์žฅ ์ฑ„๋„์„ ํ•„์š”ํ•œ ๊ฒƒ๋งŒ ๊ณจ๋ผ ์กฐํ•ฉํ•˜๋Š” ๊ตฌ์กฐ

ํ•ด๋‹น ๊ฐœ๋…์ด ํ•„์š”ํ•œ ์ด์œ 

  • Claude Code๋Š” ๊ธฐ๋ณธ ๋„๊ตฌ(Read, Write, Edit, Bash ๋“ฑ)๋งŒ ์ œ๊ณต
  • ์ „๋ฌธ ์—์ด์ „ํŠธ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜, ์›Œํฌํ”Œ๋กœ์šฐ ์ž๋™ํ™”, IDE๊ธ‰ ๋„๊ตฌ ๊ฐ™์€ ํ™•์žฅ ๊ธฐ๋Šฅ์„ ์—ฐ๊ฒฐํ•˜๋ ค๋ฉด ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•ด์•ผ ํ•จ
  • oh-my-claudecode(OMC)๊ฐ€ ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ ์‹œ์Šคํ…œ์„ ํ™œ์šฉํ•˜๋ฏ€๋กœ, OMC ๊ธฐ๋ฐ˜ ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ฐœ๋ฐœ์˜ ์ฒซ ๋‹จ์ถ”

AS-IS

sequenceDiagram
    autonumber
    participant U as User
    participant CC as Claude Code

    U->>CC: "API ๋ฆฌํŒฉํ„ฐํ•ด์ค˜"
    CC->>CC: ๊ธฐ๋ณธ ๋„๊ตฌ๋งŒ ์‚ฌ์šฉ (Read, Edit, Bash)
    CC-->>U: ๋‹จ์ˆœ ์‘๋‹ต
    Note over CC: ํ™•์žฅ ๊ธฐ๋Šฅ ์—†์Œ, ์ปค์Šคํ…€ ๋„๊ตฌ ์—†์Œ

TO-BE

sequenceDiagram
    autonumber
    participant U as User
    participant CC as Claude Code
    participant PJ as plugin.json
    participant H as Hook Scripts
    participant M as MCP Server
    participant S as Skills

    U->>CC: "ultrawork refactor the API"
    CC->>PJ: ํ”Œ๋Ÿฌ๊ทธ์ธ ๋กœ๋“œ
    PJ->>H: hooks.json ์ฐธ์กฐ
    PJ->>M: .mcp.json ์ฐธ์กฐ
    PJ->>S: skills/ ์ฐธ์กฐ
    H-->>CC: ํ‚ค์›Œ๋“œ ๊ฐ์ง€, ๋ชจ๋“œ ์ง€์†
    S-->>CC: ์›Œํฌํ”Œ๋กœ์šฐ ์ง€์นจ ์ฃผ์ž…
    M-->>CC: LSP, AST ๋“ฑ ์ปค์Šคํ…€ ๋„๊ตฌ ์ œ๊ณต
    CC-->>U: ๋ฉ€ํ‹ฐ์—์ด์ „ํŠธ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ์‘๋‹ต

plugin.json โ€” ์œ ์ผํ•œ ํ•„์ˆ˜ ํŒŒ์ผ

๊ณต์‹ ๋ฌธ์„œ ๊ธฐ์ค€, ๋งค๋‹ˆํŽ˜์ŠคํŠธ(plugin.json)์กฐ์ฐจ ์„ ํƒ์ด๋‹ค. ์—†์œผ๋ฉด Claude Code๊ฐ€ ๋””๋ ‰ํ† ๋ฆฌ ์ด๋ฆ„์—์„œ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ด๋ฆ„์„ ์ถ”๋ก ํ•˜๊ณ , ๊ธฐ๋ณธ ์œ„์น˜์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž๋™ ๋ฐœ๊ฒฌํ•œ๋‹ค.

๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ํฌํ•จํ•  ๊ฒฝ์šฐ name์ด ์œ ์ผํ•œ ํ•„์ˆ˜ ํ•„๋“œ:

// .claude-plugin/plugin.json โ€” ์ตœ์†Œ ํ˜•ํƒœ
{
  "name": "my-plugin"
}
ํ•„๋“œํ•„์ˆ˜ ์—ฌ๋ถ€์—ญํ• 
nameํ•„์ˆ˜ํ”Œ๋Ÿฌ๊ทธ์ธ ์‹๋ณ„์ž, skill ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ ‘๋‘์‚ฌ
version์„ ํƒ์‹œ๋งจํ‹ฑ ๋ฒ„์ €๋‹. ์บ์‹œ ๊ฐฑ์‹  ํŒ๋‹จ ๊ธฐ์ค€
description์„ ํƒํ”Œ๋Ÿฌ๊ทธ์ธ ๋งค๋‹ˆ์ €์— ํ‘œ์‹œ
skills์„ ํƒskills ๋””๋ ‰ํ† ๋ฆฌ ์ปค์Šคํ…€ ๊ฒฝ๋กœ (๊ธฐ๋ณธ: ./skills/)
mcpServers์„ ํƒMCP ์„ค์ • ๊ฒฝ๋กœ (๊ธฐ๋ณธ: ./.mcp.json)
hooks์„ ํƒHook ์„ค์ • ๊ฒฝ๋กœ (๊ธฐ๋ณธ: ./hooks/hooks.json)
agents์„ ํƒAgent ํŒŒ์ผ ๊ฒฝ๋กœ (๊ธฐ๋ณธ: ./agents/)
lspServers์„ ํƒLSP ์„ค์ • ๊ฒฝ๋กœ (๊ธฐ๋ณธ: ./.lsp.json)

Q) โ€œSkill์€ ํ•„์ˆ˜์ธ๊ฐ€? 3์ฑ„๋„ ์ค‘ ํ•„์ˆ˜์ธ ๊ฒƒ์ด ์žˆ๋‚˜?โ€

  • ๊ณต์‹ ๋ฌธ์„œ ๊ธฐ์ค€ ์ „๋ถ€ ์„ ํƒ. plugin.json๋งˆ์ € ์„ ํƒ์ด๋‹ค
  • ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ•˜๋‚˜๋„ ์—†์œผ๋ฉด ์œ ์šฉํ•˜์ง€ ์•Š์„ ๋ฟ, ๋™์ž‘ ์ž์ฒด๋Š” ๊ฐ€๋Šฅํ•˜๋‹ค
  • ์ตœ์†Œํ•œ์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ: plugin.json์— name๋งŒ ๋„ฃ๊ณ  Hook ํ•˜๋‚˜ ๋“ฑ๋กํ•˜๋ฉด ์ถฉ๋ถ„ํ•˜๋‹ค

5๊ฐ€์ง€ ํ™•์žฅ ์ฑ„๋„๊ณผ ํ†ต์‹  ๋ฐฉ์‹

์ฑ„๋„๋“ฑ๋ก ํŒŒ์ผํ†ต์‹  ๋ฐฉ์‹๊ธฐ๋ณธ ์œ„์น˜
Hookhooks/hooks.json์ด๋ฒคํŠธ โ†’ stdin JSON โ†’ ์Šคํฌ๋ฆฝํŠธ โ†’ stdout JSONhooks/hooks.json
MCP.mcp.jsonJSON-RPC โ†’ MCP ์„œ๋ฒ„ ํ”„๋กœ์„ธ์Šค โ†’ ๋„๊ตฌ ์‘๋‹ต.mcp.json
Skillskills/Skill tool ํ˜ธ์ถœ โ†’ SKILL.md ํ…์ŠคํŠธ๋ฅผ context์— ์ฃผ์ž…skills/
Agentagents/Task tool โ†’ ์—์ด์ „ํŠธ ๋งˆํฌ๋‹ค์šด ๋กœ๋“œ โ†’ subagent ์‹คํ–‰agents/
LSP.lsp.jsonLanguage Server Protocol โ†’ ์ฝ”๋“œ ์ธํ…”๋ฆฌ์ „์Šค.lsp.json

์ปค์Šคํ…€ ๊ฒฝ๋กœ๋ฅผ plugin.json์— ์ง€์ •ํ•˜๋ฉด ๊ธฐ๋ณธ ์œ„์น˜์— ์ถ”๊ฐ€๋˜๋Š” ๊ฒƒ์ด์ง€, ๋Œ€์ฒดํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค.

$CLAUDE_PLUGIN_ROOT ํ™˜๊ฒฝ๋ณ€์ˆ˜

โ€œ๋‚ด ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์–ด๋””์— ์„ค์น˜๋˜์–ด ์žˆ๋Š”์ง€โ€๋ฅผ Claude Code๊ฐ€ ์•Œ๋ ค์ฃผ๋Š” ๋ณ€์ˆ˜.

ํ•ญ๋ชฉ๋‚ด์šฉ
๋ˆ„๊ฐ€ ์„ค์ •?Claude Code๊ฐ€ ์ž๋™์œผ๋กœ
์–ธ์ œ?ํ”Œ๋Ÿฌ๊ทธ์ธ ๋กœ๋“œ ์‹œ์ 
์Šค์ฝ”ํ”„ํ”Œ๋Ÿฌ๊ทธ์ธ๋ณ„ (๊ธ€๋กœ๋ฒŒ ์•„๋‹˜)
๊ฐ’ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ์˜ ์ ˆ๋Œ€ ๊ฒฝ๋กœ
// hooks.json์—์„œ ์‚ฌ์šฉ
"command": "${CLAUDE_PLUGIN_ROOT}/scripts/format-code.sh"
 
// .mcp.json์—์„œ ์‚ฌ์šฉ
"args": ["${CLAUDE_PLUGIN_ROOT}/bridge/mcp-server.cjs"]

OMC ์†Œ์Šค์—์„œ๋„ ์ด ๋ณ€์ˆ˜๋กœ โ€œํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ์‹คํ–‰ ์ค‘์ธ๊ฐ€?โ€๋ฅผ ํŒ๋‹จํ•œ๋‹ค:

// src/installer/index.ts
export function isRunningAsPlugin(): boolean {
  return !!process.env.CLAUDE_PLUGIN_ROOT;
}

MCP ์„œ๋ฒ„ ์ด๋ฆ„ "t" โ€” 64๊ธ€์ž ์ œํ•œ ๋ฌธ์ œ

OMC์˜ .mcp.json์—์„œ MCP ์„œ๋ฒ„ ์ด๋ฆ„์ด "t" ํ•œ ๊ธ€์ž์ธ ์ด์œ :

๋ณ€๊ฒฝ ์ „: mcp__omc-tools__lsp_diagnostics  (์ ‘๋‘์‚ฌ 15์ž)
๋ณ€๊ฒฝ ํ›„: mcp__t__lsp_diagnostics           (์ ‘๋‘์‚ฌ 6์ž)
  • Claude Code์— MCP ๋„๊ตฌ ์ด๋ฆ„ 64๊ธ€์ž ์ œํ•œ์ด ์กด์žฌ
  • omc-tools๋กœ ๋“ฑ๋กํ•˜๋ฉด ๋„๊ตฌ ์ด๋ฆ„์ด ์ด ์ œํ•œ์„ ์ดˆ๊ณผ
  • PR #252 / Issue 241์—์„œ ์ˆ˜์ •: ์ ‘๋‘์‚ฌ๋ฅผ 15์ž โ†’ 6์ž๋กœ ์ค„์—ฌ ํ•ด๊ฒฐ
  • ํ† ํฐ ์ ˆ์•ฝ์ด ์•„๋‹Œ ํ•˜๋“œ ๋ฆฌ๋ฐ‹ ๋ฌธ์ œ

์„ค์น˜ ํ๋ฆ„๊ณผ ํŒŒ์ผ ๋ฐฐ์น˜

sequenceDiagram
    autonumber
    participant U as User
    participant NPM as npm
    participant GP as Global Path<br/>/usr/local/lib/node_modules/omc/
    participant CC as Claude Code
    participant PC as Plugin Cache<br/>~/.claude/plugins/cache/

    U->>NPM: npm install -g oh-my-claudecode
    NPM->>GP: ํŒจํ‚ค์ง€ ํŒŒ์ผ ์ „์ฒด ์„ค์น˜<br/>(scripts/, bridge/, skills/, agents/ ๋“ฑ)
    Note over GP: scripts/run.cjs, bridge/mcp-server.cjs<br/>์ด๋ฏธ ๋นŒ๋“œ๋˜์–ด ํŒจํ‚ค์ง€์— ํฌํ•จ

    U->>GP: omc setup
    GP->>CC: ~/.claude/settings.json ์—…๋ฐ์ดํŠธ

    Note over CC: ๋‹ค์Œ ์„ธ์…˜ ์‹œ์ž‘ ์‹œ
    CC->>PC: ํ”Œ๋Ÿฌ๊ทธ์ธ ํŒŒ์ผ์„ ์บ์‹œ๋กœ ๋ณต์‚ฌ
    CC->>CC: CLAUDE_PLUGIN_ROOT = ์บ์‹œ ๊ฒฝ๋กœ ์„ค์ •
    CC->>GP: ${CLAUDE_PLUGIN_ROOT}/scripts/run.cjs ์‹คํ–‰

Q) โ€œscripts/run.cjs๋Š” ์–ธ์ œ ์„ค์น˜๋˜๋Š” ๊ฑฐ์•ผ?โ€

  • npm install ์‹œ์ ์— npm ๊ธ€๋กœ๋ฒŒ ๊ฒฝ๋กœ์— ์„ค์น˜๋จ (๋นŒ๋“œ๋œ ๋ฒˆ๋“ค์ด ํŒจํ‚ค์ง€์— ์ด๋ฏธ ํฌํ•จ)
  • ๋ณ„๋„ ๋ณต์‚ฌ๊ฐ€ ์•„๋‹ˆ๋ผ, $CLAUDE_PLUGIN_ROOT๊ฐ€ ๊ทธ ๊ฒฝ๋กœ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ตฌ์กฐ
  • ๋งˆ์ผ“ํ”Œ๋ ˆ์ด์Šค ์„ค์น˜ ์‹œ์—๋Š” ~/.claude/plugins/cache/๋กœ ๋ณต์‚ฌ๋จ

๋‚˜๋งŒ์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ตœ์†Œ ๊ตฌ์กฐ

my-plugin/
โ”œโ”€โ”€ .claude-plugin/
โ”‚   โ””โ”€โ”€ plugin.json       โ† name๋งŒ ์žˆ์œผ๋ฉด ํ”Œ๋Ÿฌ๊ทธ์ธ ์ธ์‹
โ”œโ”€โ”€ hooks/
โ”‚   โ””โ”€โ”€ hooks.json        โ† ์›ํ•˜๋Š” ์ด๋ฒคํŠธ๋งŒ ๋“ฑ๋ก
โ””โ”€โ”€ scripts/
    โ””โ”€โ”€ my-hook.mjs       โ† stdin JSON ์ฝ๊ณ  stdout JSON ์ถœ๋ ฅ

Q) โ€œ.mjs๋Š” ๋ฌด์Šจ ํ™•์žฅ์ž์•ผ?โ€

  • ES Module JavaScript ํ™•์žฅ์ž (import/export ๋ฌธ๋ฒ• ์‚ฌ์šฉ)
  • .cjs๋Š” CommonJS (require/module.exports)
  • .mjs๋กœ ๋ช…์‹œํ•˜๋ฉด package.json ์„ค์ •๊ณผ ๋ฌด๊ด€ํ•˜๊ฒŒ ํ•ญ์ƒ ES Module๋กœ ๋™์ž‘ ๋ณด์žฅ

OMC์˜ plugin.json ์‹ค์ œ ๋‚ด์šฉ

{
  "name": "oh-my-claudecode",
  "version": "4.8.0",
  "description": "Multi-agent orchestration system for Claude Code",
  "author": { "name": "oh-my-claudecode contributors" },
  "repository": "https://github.com/Yeachan-Heo/oh-my-claudecode",
  "license": "MIT",
  "keywords": ["claude-code", "plugin", "multi-agent", "orchestration"],
  "skills": "./skills/",
  "mcpServers": "./.mcp.json"
}

Hook์€ plugin.json์— ๋ช…์‹œํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ๊ธฐ๋ณธ ์œ„์น˜(hooks/hooks.json)์—์„œ ์ž๋™ ๋ฐœ๊ฒฌ๋œ๋‹ค.

์ฐธ๊ณ  ๋ฌธ์„œ