ํ๋ฌ๊ทธ์ธ ์ฐธ์กฐ
Claude Code ํ๋ฌ๊ทธ์ธ ์์คํ ์ ์์ ํ ๊ธฐ์ ์ฐธ์กฐ, ์คํค๋ง, CLI ๋ช ๋ น์ด ๋ฐ ์ปดํฌ๋ํธ ์ฌ์ ํฌํจ.
ํ๋ฌ๊ทธ์ธ์ ์ค์นํ๋ ค๊ณ ํ์๋์? ํ๋ฌ๊ทธ์ธ ๋ฐ๊ฒฌ ๋ฐ ์ค์น๋ฅผ ์ฐธ์กฐํ์ธ์. ํ๋ฌ๊ทธ์ธ ์์ฑ์ ๋ํด์๋ ํ๋ฌ๊ทธ์ธ์ ์ฐธ์กฐํ์ธ์. ํ๋ฌ๊ทธ์ธ ๋ฐฐํฌ์ ๋ํด์๋ ํ๋ฌ๊ทธ์ธ ๋ง์ผํ๋ ์ด์ค๋ฅผ ์ฐธ์กฐํ์ธ์.
์ด ์ฐธ์กฐ๋ Claude Code ํ๋ฌ๊ทธ์ธ ์์คํ ์ ์์ ํ ๊ธฐ์ ์ฌ์์ ์ ๊ณตํ๋ฉฐ, ์ปดํฌ๋ํธ ์คํค๋ง, CLI ๋ช ๋ น์ด ๋ฐ ๊ฐ๋ฐ ๋๊ตฌ๋ฅผ ํฌํจํฉ๋๋ค.
ํ๋ฌ๊ทธ์ธ์ Claude Code๋ฅผ ์ฌ์ฉ์ ์ ์ ๊ธฐ๋ฅ์ผ๋ก ํ์ฅํ๋ ์์ฒด ํฌํจ๋ ์ปดํฌ๋ํธ ๋๋ ํ ๋ฆฌ์ ๋๋ค. ํ๋ฌ๊ทธ์ธ ์ปดํฌ๋ํธ์๋ skills, agents, hooks, MCP servers, LSP servers ๋ฐ monitors๊ฐ ํฌํจ๋ฉ๋๋ค.
ํ๋ฌ๊ทธ์ธ ์ปดํฌ๋ํธ ์ฐธ์กฐ
Skills
ํ๋ฌ๊ทธ์ธ์ Claude Code์ skills๋ฅผ ์ถ๊ฐํ์ฌ ์ฌ์ฉ์๋ Claude๊ฐ ํธ์ถํ ์ ์๋ /name ๋ฐ๋ก๊ฐ๊ธฐ๋ฅผ ์์ฑํฉ๋๋ค.
์์น: ํ๋ฌ๊ทธ์ธ ๋ฃจํธ์ skills/ ๋๋ commands/ ๋๋ ํ ๋ฆฌ, ๋๋ ํ๋ฌ๊ทธ์ธ ๋ฃจํธ์ ๋จ์ผ SKILL.md ํ์ผ
ํ์ผ ํ์: Skills๋ SKILL.md๊ฐ ์๋ ๋๋ ํ ๋ฆฌ์ด๊ณ , commands๋ ๊ฐ๋จํ ๋งํฌ๋ค์ด ํ์ผ์
๋๋ค.
Skill ๊ตฌ์กฐ:
skills/
โโโ pdf-processor/
โ โโโ SKILL.md
โ โโโ reference.md (์ ํ์ฌํญ)
โ โโโ scripts/ (์ ํ์ฌํญ)
โโโ code-reviewer/
โโโ SKILL.md
ํตํฉ ๋์:
- Skills์ commands๋ ํ๋ฌ๊ทธ์ธ์ด ์ค์น๋ ๋ ์๋์ผ๋ก ๋ฐ๊ฒฌ๋ฉ๋๋ค.
- Claude๋ ์์ ์ปจํ ์คํธ์ ๋ฐ๋ผ ์๋์ผ๋ก ์ด๋ค์ ํธ์ถํ ์ ์์ต๋๋ค.
- Skills๋ SKILL.md์ ํจ๊ป ์ง์ ํ์ผ์ ํฌํจํ ์ ์์ต๋๋ค.
์์ ํ ์ธ๋ถ ์ ๋ณด๋ Skills๋ฅผ ์ฐธ์กฐํ์ธ์.
Agents
ํ๋ฌ๊ทธ์ธ์ Claude๊ฐ ์ ์ ํ ๋ ์๋์ผ๋ก ํธ์ถํ ์ ์๋ ํน์ ์์ ์ ์ํ ํนํ๋ subagents๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค.
์์น: ํ๋ฌ๊ทธ์ธ ๋ฃจํธ์ agents/ ๋๋ ํ ๋ฆฌ
ํ์ผ ํ์: ์์ด์ ํธ ๊ธฐ๋ฅ์ ์ค๋ช ํ๋ ๋งํฌ๋ค์ด ํ์ผ
Agent ๊ตฌ์กฐ:
---
name: agent-name
description: ์ด ์์ด์ ํธ๊ฐ ์ ๋ฌธ์ผ๋ก ํ๋ ๋ถ์ผ์ Claude๊ฐ ์ด๋ฅผ ํธ์ถํด์ผ ํ ๋
model: sonnet
effort: medium
maxTurns: 20
disallowedTools: Write, Edit
---
์์ด์ ํธ์ ์ญํ , ์ ๋ฌธ์ฑ ๋ฐ ๋์์ ์ค๋ช
ํ๋ ์์ธํ ์์คํ
ํ๋กฌํํธ์
๋๋ค.
ํ๋ฌ๊ทธ์ธ agents๋ name, description, model, effort, maxTurns, tools, disallowedTools, skills, memory, background ๋ฐ isolation frontmatter ํ๋๋ฅผ ์ง์ํฉ๋๋ค. ์ ์ผํ ์ ํจํ isolation ๊ฐ์ "worktree"์
๋๋ค. ๋ณด์์์ ์ด์ ๋ก hooks, mcpServers ๋ฐ permissionMode๋ ํ๋ฌ๊ทธ์ธ ์ ๊ณต agents์์ ์ง์๋์ง ์์ต๋๋ค.
ํตํฉ ์ง์ :
- Agents๋
/agents์ธํฐํ์ด์ค์ ๋ํ๋ฉ๋๋ค. - Claude๋ ์์ ์ปจํ ์คํธ์ ๋ฐ๋ผ agents๋ฅผ ์๋์ผ๋ก ํธ์ถํ ์ ์์ต๋๋ค.
- Agents๋ ์ฌ์ฉ์๊ฐ ์๋์ผ๋ก ํธ์ถํ ์ ์์ต๋๋ค.
- ํ๋ฌ๊ทธ์ธ agents๋ ๊ธฐ๋ณธ ์ ๊ณต Claude agents์ ํจ๊ป ์๋ํฉ๋๋ค.
์์ ํ ์ธ๋ถ ์ ๋ณด๋ Subagents๋ฅผ ์ฐธ์กฐํ์ธ์.
Hooks
ํ๋ฌ๊ทธ์ธ์ Claude Code ์ด๋ฒคํธ์ ์๋์ผ๋ก ์๋ตํ๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค.
์์น: ํ๋ฌ๊ทธ์ธ ๋ฃจํธ์ hooks/hooks.json ๋๋ plugin.json์ ์ธ๋ผ์ธ
ํ์: ์ด๋ฒคํธ ๋งค์ฒ ๋ฐ ์์ ์ด ์๋ JSON ๊ตฌ์ฑ
Hook ๊ตฌ์ฑ:
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "command",
"command": "\"${CLAUDE_PLUGIN_ROOT}\"/scripts/format-code.sh"
}
]
}
]
}
}
ํ๋ฌ๊ทธ์ธ hooks๋ ์ฌ์ฉ์ ์ ์ hooks์ ๋์ผํ ๋ผ์ดํ์ฌ์ดํด ์ด๋ฒคํธ์ ์๋ตํฉ๋๋ค:
| Event | When it fires |
|---|---|
SessionStart |
When a session begins or resumes |
Setup |
When you start Claude Code with --init-only, or with --init or --maintenance in -p mode. For one-time preparation in CI or scripts |
UserPromptSubmit |
When you submit a prompt, before Claude processes it |
UserPromptExpansion |
When a user-typed command expands into a prompt, before it reaches Claude. Can block the expansion |
PreToolUse |
Before a tool call executes. Can block it |
PermissionRequest |
When a permission dialog appears |
PermissionDenied |
When a tool call is denied by the auto mode classifier. Return {retry: true} to tell the model it may retry the denied tool call |
PostToolUse |
After a tool call succeeds |
PostToolUseFailure |
After a tool call fails |
PostToolBatch |
After a full batch of parallel tool calls resolves, before the next model call |
Notification |
When Claude Code sends a notification |
MessageDisplay |
While assistant message text is displayed |
SubagentStart |
When a subagent is spawned |
SubagentStop |
When a subagent finishes |
TaskCreated |
When a task is being created via TaskCreate |
TaskCompleted |
When a task is being marked as completed |
Stop |
When Claude finishes responding |
StopFailure |
When the turn ends due to an API error. Output and exit code are ignored |
TeammateIdle |
When an agent team teammate is about to go idle |
InstructionsLoaded |
When a CLAUDE.md or .claude/rules/*.md file is loaded into context. Fires at session start and when files are lazily loaded during a session |
ConfigChange |
When a configuration file changes during a session |
CwdChanged |
When the working directory changes, for example when Claude executes a cd command. Useful for reactive environment management with tools like direnv |
FileChanged |
When a watched file changes on disk. The matcher field specifies which filenames to watch |
WorktreeCreate |
When a worktree is being created via --worktree or isolation: "worktree". Replaces default git behavior |
WorktreeRemove |
When a worktree is being removed, either at session exit or when a subagent finishes |
PreCompact |
Before context compaction |
PostCompact |
After context compaction completes |
Elicitation |
When an MCP server requests user input during a tool call |
ElicitationResult |
After a user responds to an MCP elicitation, before the response is sent back to the server |
SessionEnd |
When a session terminates |
Hook ์ ํ:
command: ์ ธ ๋ช ๋ น์ด ๋๋ ์คํฌ๋ฆฝํธ ์คํhttp: ์ด๋ฒคํธ JSON์ URL๋ก POST ์์ฒญ์ผ๋ก ์ ์กmcp_tool: ๊ตฌ์ฑ๋ MCP server์์ ๋๊ตฌ ํธ์ถprompt: LLM์ผ๋ก ํ๋กฌํํธ ํ๊ฐ (์ปจํ ์คํธ์ ๋ํด$ARGUMENTSํ๋ ์ด์คํ๋ ์ฌ์ฉ)agent: ๋ณต์กํ ๊ฒ์ฆ ์์ ์ ์ํด ๋๊ตฌ๊ฐ ์๋ ์์ด์ ํธ ๊ฒ์ฆ์ ์คํ
MCP servers
ํ๋ฌ๊ทธ์ธ์ Claude Code๋ฅผ ์ธ๋ถ ๋๊ตฌ ๋ฐ ์๋น์ค์ ์ฐ๊ฒฐํ๊ธฐ ์ํด Model Context Protocol (MCP) servers๋ฅผ ๋ฒ๋ค๋ก ์ ๊ณตํ ์ ์์ต๋๋ค.
์์น: ํ๋ฌ๊ทธ์ธ ๋ฃจํธ์ .mcp.json ๋๋ plugin.json์ ์ธ๋ผ์ธ
ํ์: ํ์ค MCP ์๋ฒ ๊ตฌ์ฑ
MCP ์๋ฒ ๊ตฌ์ฑ:
{
"mcpServers": {
"plugin-database": {
"command": "${CLAUDE_PLUGIN_ROOT}/servers/db-server",
"args": ["--config", "${CLAUDE_PLUGIN_ROOT}/config.json"],
"env": {
"DB_PATH": "${CLAUDE_PLUGIN_ROOT}/data"
}
},
"plugin-api-client": {
"command": "npx",
"args": ["@company/mcp-server", "--plugin-mode"],
"cwd": "${CLAUDE_PLUGIN_ROOT}"
}
}
}
ํตํฉ ๋์:
- ํ๋ฌ๊ทธ์ธ MCP servers๋ ํ๋ฌ๊ทธ์ธ์ด ํ์ฑํ๋ ๋ ์๋์ผ๋ก ์์๋ฉ๋๋ค.
- Servers๋ Claude์ ๋๊ตฌ ํคํธ์์ ํ์ค MCP ๋๊ตฌ๋ก ๋ํ๋ฉ๋๋ค.
- ์๋ฒ ๊ธฐ๋ฅ์ Claude์ ๊ธฐ์กด ๋๊ตฌ์ ์ํํ๊ฒ ํตํฉ๋ฉ๋๋ค.
- ํ๋ฌ๊ทธ์ธ servers๋ ์ฌ์ฉ์ MCP servers์ ๋ ๋ฆฝ์ ์ผ๋ก ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
LSP servers
LSP ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ๋ ค๊ณ ํ์๋์? ๊ณต์ ๋ง์ผํ๋ ์ด์ค์์ ์ค์นํ์ธ์: /plugin Discover ํญ์์ "lsp"๋ฅผ ๊ฒ์ํ์ธ์. ์ด ์น์
์ ๊ณต์ ๋ง์ผํ๋ ์ด์ค์์ ๋ค๋ฃจ์ง ์๋ ์ธ์ด์ ๋ํด LSP ํ๋ฌ๊ทธ์ธ์ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ฌธ์ํํฉ๋๋ค.
ํ๋ฌ๊ทธ์ธ์ Language Server Protocol (LSP) servers๋ฅผ ์ ๊ณตํ์ฌ ์ฝ๋๋ฒ ์ด์ค์์ ์์ ํ ๋ Claude์๊ฒ ์ค์๊ฐ ์ฝ๋ ์ธํ ๋ฆฌ์ ์ค๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค.
LSP ํตํฉ์ ๋ค์์ ์ ๊ณตํฉ๋๋ค:
- ์ฆ์ ์ง๋จ: Claude๋ ๊ฐ ํธ์ง ํ ์ฆ์ ์ค๋ฅ ๋ฐ ๊ฒฝ๊ณ ๋ฅผ ๋ด ๋๋ค.
- ์ฝ๋ ๋ค๋น๊ฒ์ด์ : ์ ์๋ก ์ด๋, ์ฐธ์กฐ ์ฐพ๊ธฐ ๋ฐ ํธ๋ฒ ์ ๋ณด
- ์ธ์ด ์ธ์: ์ฝ๋ ๊ธฐํธ์ ๋ํ ํ์ ์ ๋ณด ๋ฐ ๋ฌธ์
์์น: ํ๋ฌ๊ทธ์ธ ๋ฃจํธ์ .lsp.json ๋๋ plugin.json์ ์ธ๋ผ์ธ
ํ์: ์ธ์ด ์๋ฒ ์ด๋ฆ์ ํด๋น ๊ตฌ์ฑ์ ๋งคํํ๋ JSON ๊ตฌ์ฑ
.lsp.json ํ์ผ ํ์:
{
"go": {
"command": "gopls",
"args": ["serve"],
"extensionToLanguage": {
".go": "go"
}
}
}
plugin.json์ ์ธ๋ผ์ธ:
{
"name": "my-plugin",
"lspServers": {
"go": {
"command": "gopls",
"args": ["serve"],
"extensionToLanguage": {
".go": "go"
}
}
}
}
ํ์ ํ๋:
| ํ๋ | ์ค๋ช |
|---|---|
command |
์คํํ LSP ๋ฐ์ด๋๋ฆฌ (PATH์ ์์ด์ผ ํจ) |
extensionToLanguage |
ํ์ผ ํ์ฅ์๋ฅผ ์ธ์ด ์๋ณ์์ ๋งคํ |
์ ํ์ฌํญ ํ๋:
| ํ๋ | ์ค๋ช |
|---|---|
args |
LSP ์๋ฒ์ ๋ช ๋ น์ค ์ธ์ |
transport |
ํต์ ์ ์ก: stdio (๊ธฐ๋ณธ๊ฐ) ๋๋ socket |
env |
์๋ฒ ์์ ์ ์ค์ ํ ํ๊ฒฝ ๋ณ์ |
initializationOptions |
์ด๊ธฐํ ์ค์ ์๋ฒ์ ์ ๋ฌ๋๋ ์ต์ |
settings |
workspace/didChangeConfiguration์ ํตํด ์ ๋ฌ๋๋ ์ค์ |
workspaceFolder |
์๋ฒ์ ์์ ๊ณต๊ฐ ํด๋ ๊ฒฝ๋ก |
startupTimeout |
์๋ฒ ์์์ ๊ธฐ๋ค๋ฆด ์ต๋ ์๊ฐ (๋ฐ๋ฆฌ์ด) |
maxRestarts |
ํฌ๊ธฐํ๊ธฐ ์ ์ต๋ ์ฌ์์ ์๋ ํ์ |
์ธ์ด ์๋ฒ ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋ณ๋๋ก ์ค์นํด์ผ ํฉ๋๋ค. LSP ํ๋ฌ๊ทธ์ธ์ Claude Code๊ฐ ์ธ์ด ์๋ฒ์ ์ฐ๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๊ตฌ์ฑํ์ง๋ง, ์๋ฒ ์์ฒด๋ ํฌํจํ์ง ์์ต๋๋ค. /plugin Errors ํญ์์ Executable not found in $PATH๋ฅผ ๋ณด๋ฉด ์ธ์ด์ ํ์ํ ๋ฐ์ด๋๋ฆฌ๋ฅผ ์ค์นํ์ธ์.
์ฌ์ฉ ๊ฐ๋ฅํ LSP ํ๋ฌ๊ทธ์ธ:
| ํ๋ฌ๊ทธ์ธ | ์ธ์ด ์๋ฒ | ์ค์น ๋ช ๋ น์ด |
|---|---|---|
pyright-lsp |
Pyright (Python) | pip install pyright ๋๋ npm install -g pyright |
typescript-lsp |
TypeScript Language Server | npm install -g typescript-language-server typescript |
rust-analyzer-lsp |
rust-analyzer | rust-analyzer ์ค์น ์ฐธ์กฐ |
๋จผ์ ์ธ์ด ์๋ฒ๋ฅผ ์ค์นํ ๋ค์ ๋ง์ผํ๋ ์ด์ค์์ ํ๋ฌ๊ทธ์ธ์ ์ค์นํ์ธ์.
Monitors
ํ๋ฌ๊ทธ์ธ์ ํ๋ฌ๊ทธ์ธ์ด ํ์ฑํ๋ ๋ Claude Code๊ฐ ์๋์ผ๋ก ์์ํ๋ ๋ฐฑ๊ทธ๋ผ์ด๋ monitors๋ฅผ ์ ์ธํ ์ ์์ต๋๋ค. ๊ฐ monitor๋ ์ธ์ ๋์ ์ ธ ๋ช ๋ น์ด๋ฅผ ์คํํ๊ณ ๋ชจ๋ stdout ๋ผ์ธ์ Claude์๊ฒ ์๋ฆผ์ผ๋ก ์ ๋ฌํ๋ฏ๋ก Claude๋ ๋ก๊ทธ ํญ๋ชฉ, ์ํ ๋ณ๊ฒฝ ๋๋ ํด๋ง๋ ์ด๋ฒคํธ์ ๋ฐ์ํ ์ ์์ผ๋ฉฐ ์์ ์ด watch๋ฅผ ์์ํ๋๋ก ์์ฒญ๋ฐ์ ํ์๊ฐ ์์ต๋๋ค.
ํ๋ฌ๊ทธ์ธ monitors๋ Monitor tool๊ณผ ๋์ผํ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ๋ฉฐ ํด๋น ๊ฐ์ฉ์ฑ ์ ์ฝ์ ๊ณต์ ํฉ๋๋ค. ์ด๋ค์ ๋ํํ CLI ์ธ์ ์์๋ง ์คํ๋๊ณ , hooks์ ๋์ผํ ์ ๋ขฐ ์์ค์์ ์๋๋ฐ์ค ์์ด ์คํ๋๋ฉฐ, Monitor tool์ ์ฌ์ฉํ ์ ์๋ ํธ์คํธ์์๋ ๊ฑด๋๋๋๋ค.
ํ๋ฌ๊ทธ์ธ monitors๋ Claude Code v2.1.105 ์ด์์ด ํ์ํฉ๋๋ค.
์์น: ํ๋ฌ๊ทธ์ธ ๋ฃจํธ์ monitors/monitors.json ๋๋ plugin.json์ ์ธ๋ผ์ธ
ํ์: monitor ํญ๋ชฉ์ JSON ๋ฐฐ์ด
๋ค์ monitors/monitors.json์ ๋ฐฐํฌ ์ํ ์๋ํฌ์ธํธ์ ๋ก์ปฌ ์ค๋ฅ ๋ก๊ทธ๋ฅผ ๊ฐ์ํฉ๋๋ค:
[
{
"name": "deploy-status",
"command": "\"${CLAUDE_PLUGIN_ROOT}\"/scripts/poll-deploy.sh ${user_config.api_endpoint}",
"description": "๋ฐฐํฌ ์ํ ๋ณ๊ฒฝ"
},
{
"name": "error-log",
"command": "tail -F ./logs/error.log",
"description": "์ ํ๋ฆฌ์ผ์ด์
์ค๋ฅ ๋ก๊ทธ",
"when": "on-skill-invoke:debug"
}
]
monitors๋ฅผ ์ธ๋ผ์ธ์ผ๋ก ์ ์ธํ๋ ค๋ฉด plugin.json์ experimental.monitors๋ฅผ ๋์ผํ ๋ฐฐ์ด๋ก ์ค์ ํ์ธ์. ๊ธฐ๋ณธ์ด ์๋ ๊ฒฝ๋ก์์ ๋ก๋ํ๋ ค๋ฉด experimental.monitors๋ฅผ "./config/monitors.json"๊ณผ ๊ฐ์ ์๋ ๊ฒฝ๋ก ๋ฌธ์์ด๋ก ์ค์ ํ์ธ์. Monitors๋ ์คํ์ ์ปดํฌ๋ํธ์
๋๋ค.
ํ์ ํ๋:
| ํ๋ | ์ค๋ช |
|---|---|
name |
ํ๋ฌ๊ทธ์ธ ๋ด์์ ๊ณ ์ ํ ์๋ณ์. ํ๋ฌ๊ทธ์ธ์ด ๋ค์ ๋ก๋๋๊ฑฐ๋ skill์ด ๋ค์ ํธ์ถ๋ ๋ ์ค๋ณต ํ๋ก์ธ์ค๋ฅผ ๋ฐฉ์งํฉ๋๋ค. |
command |
์ธ์ ์์ ๋๋ ํ ๋ฆฌ์์ ์๊ตฌ ๋ฐฑ๊ทธ๋ผ์ด๋ ํ๋ก์ธ์ค๋ก ์คํ๋๋ ์ ธ ๋ช ๋ น์ด |
description |
๊ฐ์ ์ค์ธ ํญ๋ชฉ์ ๋ํ ๊ฐ๋จํ ์์ฝ. ์์ ํจ๋ ๋ฐ ์๋ฆผ ์์ฝ์ ํ์๋ฉ๋๋ค. |
์ ํ์ฌํญ ํ๋:
| ํ๋ | ์ค๋ช |
|---|---|
when |
monitor๊ฐ ์์๋๋ ์๊ธฐ๋ฅผ ์ ์ดํฉ๋๋ค. "always"๋ ์ธ์
์์ ๋ฐ ํ๋ฌ๊ทธ์ธ ๋ค์ ๋ก๋ ์ ์์ํ๋ฉฐ ๊ธฐ๋ณธ๊ฐ์
๋๋ค. "on-skill-invoke:<skill-name>"์ ์ด ํ๋ฌ๊ทธ์ธ์ ๋ช
๋ช
๋ skill์ด ์ฒ์ ๋ฐ์ก๋ ๋ ์์ํฉ๋๋ค. |
command ๊ฐ์ MCP ๋ฐ LSP ์๋ฒ ๊ตฌ์ฑ๊ณผ ๋์ผํ ๋ณ์ ๋์ฒด๋ฅผ ์ง์ํฉ๋๋ค: ${CLAUDE_PLUGIN_ROOT}, ${CLAUDE_PLUGIN_DATA}, ${CLAUDE_PROJECT_DIR}, ${user_config.*} ๋ฐ ํ๊ฒฝ์ ๋ชจ๋ ${ENV_VAR}. ์คํฌ๋ฆฝํธ๊ฐ ํ๋ฌ๊ทธ์ธ ์์ฒด ๋๋ ํ ๋ฆฌ์์ ์คํ๋์ด์ผ ํ๋ ๊ฒฝ์ฐ ๋ช
๋ น์ด ์์ cd "${CLAUDE_PLUGIN_ROOT}" && ๋ฅผ ๋ถ์ด์ธ์.
์ธ์ ์ค๊ฐ์ ํ๋ฌ๊ทธ์ธ์ ๋นํ์ฑํํด๋ ์ด๋ฏธ ์คํ ์ค์ธ monitors๋ ์ค์ง๋์ง ์์ต๋๋ค. ์ธ์ ์ด ๋๋ ๋ ์ค์ง๋ฉ๋๋ค.
Themes
ํ๋ฌ๊ทธ์ธ์ /theme์ ๊ธฐ๋ณธ ์ ๊ณต ํ๋ฆฌ์
๋ฐ ์ฌ์ฉ์์ ๋ก์ปฌ ํ
๋ง์ ํจ๊ป ๋ํ๋๋ ์์ ํ
๋ง๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค. ํ
๋ง๋ themes/ ๋๋ ํ ๋ฆฌ์ JSON ํ์ผ๋ก, base ํ๋ฆฌ์
๊ณผ ์์ ํ ํฐ์ sparse overrides ๋งต์ ํฌํจํฉ๋๋ค. Themes๋ ์คํ์ ์ปดํฌ๋ํธ์
๋๋ค.
{
"name": "Dracula",
"base": "dark",
"overrides": {
"claude": "#bd93f9",
"error": "#ff5555",
"success": "#50fa7b"
}
}
ํ๋ฌ๊ทธ์ธ ํ
๋ง๋ฅผ ์ ํํ๋ฉด ์ฌ์ฉ์์ ๊ตฌ์ฑ์ custom:<plugin-name>:<slug>์ด ์ ์ง๋ฉ๋๋ค. ํ๋ฌ๊ทธ์ธ ํ
๋ง๋ ์ฝ๊ธฐ ์ ์ฉ์
๋๋ค. /theme์์ ํ๋์ Ctrl+E๋ฅผ ๋๋ฅด๋ฉด ~/.claude/themes/๋ก ๋ณต์ฌ๋์ด ์ฌ์ฉ์๊ฐ ๋ณต์ฌ๋ณธ์ ํธ์งํ ์ ์์ต๋๋ค.
ํ๋ฌ๊ทธ์ธ ์ค์น ๋ฒ์
ํ๋ฌ๊ทธ์ธ์ ์ค์นํ ๋ ํ๋ฌ๊ทธ์ธ์ด ์ฌ์ฉ ๊ฐ๋ฅํ ์์น์ ๋ค๋ฅธ ์ฌ๋์ด ์ฌ์ฉํ ์ ์๋์ง๋ฅผ ๊ฒฐ์ ํ๋ ๋ฒ์๋ฅผ ์ ํํฉ๋๋ค:
| ๋ฒ์ | ์ค์ ํ์ผ | ์ฌ์ฉ ์ฌ๋ก |
|---|---|---|
user |
~/.claude/settings.json |
๋ชจ๋ ํ๋ก์ ํธ์์ ์ฌ์ฉ ๊ฐ๋ฅํ ๊ฐ์ธ ํ๋ฌ๊ทธ์ธ (๊ธฐ๋ณธ๊ฐ) |
project |
.claude/settings.json |
๋ฒ์ ์ ์ด๋ฅผ ํตํด ๊ณต์ ๋๋ ํ ํ๋ฌ๊ทธ์ธ |
local |
.claude/settings.local.json |
ํ๋ก์ ํธ๋ณ ํ๋ฌ๊ทธ์ธ, gitignored |
managed |
๊ด๋ฆฌ๋๋ ์ค์ | ๊ด๋ฆฌ๋๋ ํ๋ฌ๊ทธ์ธ (์ฝ๊ธฐ ์ ์ฉ, ์ ๋ฐ์ดํธ๋ง ๊ฐ๋ฅ) |
ํ๋ฌ๊ทธ์ธ์ ๋ค๋ฅธ Claude Code ๊ตฌ์ฑ๊ณผ ๋์ผํ ๋ฒ์ ์์คํ ์ ์ฌ์ฉํฉ๋๋ค. ์ค์น ์ง์นจ ๋ฐ ๋ฒ์ ํ๋๊ทธ๋ ํ๋ฌ๊ทธ์ธ ์ค์น๋ฅผ ์ฐธ์กฐํ์ธ์. ๋ฒ์์ ๋ํ ์์ ํ ์ค๋ช ์ ๊ตฌ์ฑ ๋ฒ์๋ฅผ ์ฐธ์กฐํ์ธ์.
Skills-directory ํ๋ฌ๊ทธ์ธ
skills ๋๋ ํ ๋ฆฌ ์๋์ ๋ชจ๋ ํด๋๊ฐ .claude-plugin/plugin.json ๋งค๋ํ์คํธ๋ฅผ ํฌํจํ๋ฉด ๋ค์ ์ธ์
์์ <name>@skills-dir์ด๋ผ๋ ํ๋ฌ๊ทธ์ธ์ผ๋ก ๋ก๋๋๋ฉฐ, ๋ง์ผํ๋ ์ด์ค๋ ์ค์น ๋จ๊ณ๊ฐ ์์ต๋๋ค. plugin init์ผ๋ก ์ค์บํด๋ํ์ธ์. ๋ง์ผํ๋ ์ด์ค ์ค์น์ ๋ฌ๋ฆฌ ํ๋ฌ๊ทธ์ธ์ ํ๋ฌ๊ทธ์ธ ์บ์์ ๋ณต์ฌ๋์ง ์๊ณ ์ ์๋ฆฌ์์ ๋ฐ๊ฒฌ๋ฉ๋๋ค.
skills ๋๋ ํ ๋ฆฌ ํธ๋ฆฌ๋ ์ธ ๊ฐ์ง ์๋ก ๋ค๋ฅธ ๊ฒ์ ์ง์ํฉ๋๋ค:
| ๋ฌด์์ ๊ฐ์ง๊ณ ์๋์ง | ๋ฌด์์ธ์ง |
|---|---|
๋งค๋ํ์คํธ๊ฐ ์๋ <skills-dir>/foo/SKILL.md |
foo๋ผ๋ ์ผ๋ฐ skill |
<skills-dir>/foo/.claude-plugin/plugin.json |
foo@skills-dir ํ๋ฌ๊ทธ์ธ์ผ๋ก, ์์ฒด skills, agents, hooks ๋ฑ์ ๋ฒ๋ค๋ก ์ ๊ณตํ ์ ์์ต๋๋ค. |
<plugin>/skills/bar/SKILL.md |
ํ๋ฌ๊ทธ์ธ ๋ด์ ํจํค์ง๋ bar skill |
ํ๋ฌ๊ทธ์ธ์ด ๋ก๋๋๋ ์์น ์ ํ
| Skills ๋๋ ํ ๋ฆฌ | ๋ฒ์ | ๋ก๋ |
|---|---|---|
~/.claude/skills/ |
personal | ์์น๊ฐ ๋น์ ์ ๊ฒ์ด๋ฏ๋ก ๋ชจ๋ ํ๋ก์ ํธ์์ |
<cwd>/.claude/skills/ |
project | ํด๋น ํด๋์ ๋ํ ์์ ๊ณต๊ฐ ์ ๋ขฐ ๋ํ๋ฅผ ์๋ฝํ ํ์๋ง |
ํ๋ก์ ํธ ๋ฒ์ ํ๋ฌ๊ทธ์ธ์ ์ ์ฅ์์ ์ฒดํฌ์ธ๋๊ณ ๋ณต์ ํ๋ ๋ชจ๋ ํ๋ ฅ์์๊ฒ ๋๋ฌํฉ๋๋ค. ํด๋น ์ฝํ
์ธ ๋ ์ ์ฅ์์์ ์ค๋ฏ๋ก .claude/settings.json์ ๊ด๋ฆฌํ๋ ๊ฒ๊ณผ ๋์ผํ ์ ๋ขฐ ๊ฒ์ดํธ ํ์๋ง ๋ก๋๋๋ฉฐ, ์ฝ๋๋ฅผ ์คํํ๋ ์ปดํฌ๋ํธ๋ ์ถ๊ฐ๋ก ์ ํ๋ฉ๋๋ค:
- ์ ์ธํ๋ MCP servers๋ ํ๋ก์ ํธ
.mcp.json๊ณผ ๋์ผํ ์๋ฒ๋ณ ์น์ธ์ ๊ฑฐ์นฉ๋๋ค. - LSP servers๋ ์์ ๊ณต๊ฐ์ ์ ๋ขฐํ ํ์๋ง ์์๋ฉ๋๋ค.
- ๋ฐฑ๊ทธ๋ผ์ด๋ monitors๋ ๋ก๋๋์ง ์์ต๋๋ค.
๊ฐ์ธ ๋ฒ์ ํ๋ฌ๊ทธ์ธ์๋ ์ด๋ฌํ ์ ํ์ด ์์ต๋๋ค.
ํ๋ก์ ํธ ๋ฒ์ @skills-dir ํ๋ฌ๊ทธ์ธ์ Claude Code๋ฅผ ์์ํ๋ ๋๋ ํ ๋ฆฌ์ .claude/skills/์์๋ง ๋ก๋๋ฉ๋๋ค. ์ผ๋ฐ skills ๋ฐ commands๊ฐ ํ๋ ๊ฒ์ฒ๋ผ ์ ์ฅ์ ๋ฃจํธ๋ก ์ด๋ํ์ง ์์ผ๋ฏ๋ก ์๋ธ๋๋ ํ ๋ฆฌ์์ ์์ํ๋ฉด ์ ์ฅ์ ๋ฃจํธ์ ์๋ ํ๋ฌ๊ทธ์ธ์ ๋์นฉ๋๋ค. ์ ์ฅ์ ๋ฃจํธ์์ ์์ํ๊ฑฐ๋ ๋๋ ํ ๋ฆฌ๋ฅผ ๋ณ๊ฒฝํ ํ /reload-plugins๋ฅผ ์คํํ์ธ์.
Skills-directory ํ๋ฌ๊ทธ์ธ ํธ์ง, ๋ค์ ๋ก๋ ๋ฐ ๋นํ์ฑํ
skill์ SKILL.md์ ๋ํ ๋ณ๊ฒฝ ์ฌํญ์ ํ์ฌ ์ธ์
์์ ์ฆ์ ์ ์ฉ๋ฉ๋๋ค. hooks/, .mcp.json, agents/ ๋ฐ output-styles/์ ๊ฐ์ ํ๋ฌ๊ทธ์ธ์ ๋ค๋ฅธ ์ปดํฌ๋ํธ์ ๋ํ ๋ณ๊ฒฝ ์ฌํญ์ ๊ทธ๋ ์ง ์์ต๋๋ค. /reload-plugins๋ฅผ ์คํํ๊ฑฐ๋ Claude Code๋ฅผ ๋ค์ ์์ํ์ฌ ์ด๋ค์ ์ ํํ์ธ์. ๋ผ์ด๋ธ ๋ณ๊ฒฝ ๊ฐ์ง๋ฅผ ์ฐธ์กฐํ์ธ์.
skills-directory ํ๋ฌ๊ทธ์ธ ๋ก๋๋ฅผ ์ค์งํ๋ ค๋ฉด ํด๋น ํด๋๋ฅผ ์ญ์ ํ๊ฑฐ๋ ์ด๋ฆ์ผ๋ก ๋นํ์ฑํํ์ธ์. ๋ง์ผํ๋ ์ด์ค์์ ์๋ฌด๊ฒ๋ ์ค์น๋์ง ์์์ผ๋ฏ๋ก uninstall ๋จ๊ณ๊ฐ ์์ต๋๋ค.
claude plugin disable my-tool@skills-dir
ํ๋ฌ๊ทธ์ธ ๋งค๋ํ์คํธ ์คํค๋ง
.claude-plugin/plugin.json ํ์ผ์ ํ๋ฌ๊ทธ์ธ์ ๋ฉํ๋ฐ์ดํฐ ๋ฐ ๊ตฌ์ฑ์ ์ ์ํฉ๋๋ค. ์ด ์น์
์ ์ง์๋๋ ๋ชจ๋ ํ๋ ๋ฐ ์ต์
์ ๋ฌธ์ํํฉ๋๋ค.
๋งค๋ํ์คํธ๋ ์ ํ์ฌํญ์ ๋๋ค. ์๋ตํ๋ฉด Claude Code๋ ๊ธฐ๋ณธ ์์น์์ ์ปดํฌ๋ํธ๋ฅผ ์๋์ผ๋ก ๋ฐ๊ฒฌํ๊ณ ๋๋ ํ ๋ฆฌ ์ด๋ฆ์์ ํ๋ฌ๊ทธ์ธ ์ด๋ฆ์ ํ์ํฉ๋๋ค. ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ๊ฑฐ๋ ์ฌ์ฉ์ ์ ์ ์ปดํฌ๋ํธ ๊ฒฝ๋ก๊ฐ ํ์ํ ๋ ๋งค๋ํ์คํธ๋ฅผ ์ฌ์ฉํ์ธ์.
์์ ํ ์คํค๋ง
{
"name": "plugin-name",
"displayName": "Plugin Name",
"version": "1.2.0",
"description": "Brief plugin description",
"author": {
"name": "Author Name",
"email": "author@example.com",
"url": "https://github.com/author"
},
"homepage": "https://docs.example.com/plugin",
"repository": "https://github.com/author/plugin",
"license": "MIT",
"keywords": ["keyword1", "keyword2"],
"skills": "./custom/skills/",
"commands": ["./custom/commands/special.md"],
"agents": ["./custom/agents/reviewer.md"],
"hooks": "./config/hooks.json",
"mcpServers": "./mcp-config.json",
"outputStyles": "./styles/",
"lspServers": "./.lsp.json",
"experimental": {
"themes": "./themes/",
"monitors": "./monitors.json"
},
"dependencies": [
"helper-lib",
{ "name": "secrets-vault", "version": "~2.1.0" }
]
}
ํ์ ํ๋
๋งค๋ํ์คํธ๋ฅผ ํฌํจํ๋ ๊ฒฝ์ฐ name์ด ์ ์ผํ ํ์ ํ๋์
๋๋ค.
| ํ๋ | ํ์ | ์ค๋ช | ์์ |
|---|---|---|---|
name |
string | ๊ณ ์ ์๋ณ์ (kebab-case, ๊ณต๋ฐฑ ์์) | "deployment-tools" |
์ด ์ด๋ฆ์ ์ปดํฌ๋ํธ ๋ค์์คํ์ด์ฑ์ ์ฌ์ฉ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด UI์์ ์ด๋ฆ์ด plugin-dev์ธ ํ๋ฌ๊ทธ์ธ์ agent agent-creator๋ plugin-dev:agent-creator๋ก ๋ํ๋ฉ๋๋ค.
์ธ์๋์ง ์์ ํ๋
Claude Code๋ ์ธ์ํ์ง ๋ชปํ๋ ์ต์์ ํ๋๋ฅผ ๋ฌด์ํฉ๋๋ค. ๋ค๋ฅธ ์ํ๊ณ์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ plugin.json์ ์ ์งํ ์ ์์ผ๋ฉฐ ํ๋ฌ๊ทธ์ธ์ ์ฌ์ ํ ๋ก๋๋ฉ๋๋ค. ์ด๋ฅผ ํตํด VS Code ๋๋ Cursor ํ์ฅ ๋งค๋ํ์คํธ, npm package.json ๋๋ MCPB/DXT ๋ฒ๋ค ๋งค๋ํ์คํธ๋ก๋ ์๋ํ๋ ํ๋์ ๋งค๋ํ์คํธ๋ฅผ ์ ์งํ๋ ๊ฒ์ด ์ค์ฉ์ ์
๋๋ค.
claude plugin validate๋ ์ธ์๋์ง ์์ ํ๋๋ฅผ ์ค๋ฅ๊ฐ ์๋ ๊ฒฝ๊ณ ๋ก ๋ณด๊ณ ํฉ๋๋ค. ํ๋๊ฐ ์ธ์๋ ํ๋์ ํ๋ ๊ธ์ ์ฐจ์ด๋๋ฉด ๊ฒฝ๊ณ ๋ ์๋๋ ์ด๋ฆ์ ์ ์ํฉ๋๋ค. ์ธ์๋์ง ์์ ํ๋ ๊ฒฝ๊ณ ๋ง ์๋ ํ๋ฌ๊ทธ์ธ์ ์ฌ์ ํ ๊ฒ์ฆ์ ํต๊ณผํ๊ณ ๋ฐํ์์ ๋ก๋๋ฉ๋๋ค.
์๋ชป๋ ํ์
์ ํ๋๋ ์ฌ์ ํ ์คํจํฉ๋๋ค. ์๋ฅผ ๋ค์ด keywords ๊ฐ์ด ๋ฐฐ์ด ๋์ ๋ฌธ์์ด์ธ ๊ฒฝ์ฐ ๋ก๋ ์ค๋ฅ์ด๋ฉฐ claude plugin validate๋ ์ด๋ฅผ ์ค๋ฅ๋ก ๋ณด๊ณ ํฉ๋๋ค.
--strict๋ฅผ ์ ๋ฌํ์ฌ ๊ฒฝ๊ณ ๋ฅผ ์ค๋ฅ๋ก ์ทจ๊ธํฉ๋๋ค. CI์์ ์ด๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ฌ๊ทธ์ธ์ด ๋ฐํ์์ ๋ก๋๋๋๋ผ๋ ๊ฒ์ํ๊ธฐ ์ ์ ์คํ๊ฐ ๋ ํ๋ ์ด๋ฆ์ด๋ ๋ค๋ฅธ ๋๊ตฌ์ ๋งค๋ํ์คํธ์์ ๋จ๊ฒจ์ง ํ๋๋ฅผ ํฌ์ฐฉํฉ๋๋ค.
claude plugin validate ./my-plugin --strict
๋ฉํ๋ฐ์ดํฐ ํ๋
| ํ๋ | ํ์ | ์ค๋ช | ์์ |
|---|---|---|---|
$schema |
string | ํธ์ง๊ธฐ ์๋ ์์ฑ ๋ฐ ๊ฒ์ฆ์ ์ํ JSON Schema URL. Claude Code๋ ๋ก๋ ์ ์ด ํ๋๋ฅผ ๋ฌด์ํฉ๋๋ค. | "https://json.schemastore.org/claude-code-plugin-manifest.json" |
displayName |
string | {/* min-version: 2.1.143 */}/plugin ์ ํ๊ธฐ ๋ฐ ๊ธฐํ UI ํ๋ฉด์ ํ์๋๋ ์ฌ๋์ด ์ฝ์ ์ ์๋ ์ด๋ฆ์
๋๋ค. ์๋ตํ๋ฉด name์ผ๋ก ํด๋ฐฑ๋ฉ๋๋ค. name๊ณผ ๋ฌ๋ฆฌ ๊ณต๋ฐฑ๊ณผ ๋ชจ๋ ๋์๋ฌธ์๋ฅผ ํฌํจํ ์ ์์ต๋๋ค. ๋ค์์คํ์ด์ฑ ๋๋ ์กฐํ์ ์ฌ์ฉ๋์ง ์์ต๋๋ค. Claude Code v2.1.143 ์ด์์ด ํ์ํฉ๋๋ค. |
"Deployment Tools" |
version |
string | ์ ํ์ฌํญ. ์๋ฏธ ์๋ ๋ฒ์ ์
๋๋ค. ์ด๋ฅผ ์ค์ ํ๋ฉด ํ๋ฌ๊ทธ์ธ์ด ํด๋น ๋ฒ์ ๋ฌธ์์ด๋ก ๊ณ ์ ๋๋ฏ๋ก ์ฌ์ฉ์๋ ๋ฒ์ ์ ์ฌ๋ฆด ๋๋ง ์
๋ฐ์ดํธ๋ฅผ ๋ฐ์ต๋๋ค. ์๋ตํ๋ฉด Claude Code๋ git ์ปค๋ฐ SHA๋ก ํด๋ฐฑ๋๋ฏ๋ก ๋ชจ๋ ์ปค๋ฐ์ด ์ ๋ฒ์ ์ผ๋ก ์ทจ๊ธ๋ฉ๋๋ค. ๋ง์ผํ๋ ์ด์ค ํญ๋ชฉ์๋ ์ค์ ๋ ๊ฒฝ์ฐ plugin.json์ด ์ฐ์ ํฉ๋๋ค. ๋ฒ์ ๊ด๋ฆฌ๋ฅผ ์ฐธ์กฐํ์ธ์. |
"2.1.0" |
description |
string | ํ๋ฌ๊ทธ์ธ ๋ชฉ์ ์ ๋ํ ๊ฐ๋จํ ์ค๋ช | "๋ฐฐํฌ ์๋ํ ๋๊ตฌ" |
author |
object | ์์ฑ์ ์ ๋ณด | {"name": "Dev Team", "email": "dev@company.com"} |
homepage |
string | ๋ฌธ์ URL | "https://docs.example.com" |
repository |
string | ์์ค ์ฝ๋ URL | "https://github.com/user/plugin" |
license |
string | ๋ผ์ด์ ์ค ์๋ณ์ | "MIT", "Apache-2.0" |
keywords |
array | ๋ฐ๊ฒฌ ํ๊ทธ | ["deployment", "ci-cd"] |
defaultEnabled |
boolean | {/* min-version: 2.1.154 */}์ฌ์ฉ์๊ฐ ์ค์ ํ์ง ์์์ ๋ ํ๋ฌ๊ทธ์ธ์ด ํ์ฑํ๋ ์ํ๋ก ์์ํ ์ง ์ฌ๋ถ์
๋๋ค. ๊ธฐ๋ณธ๊ฐ์ true์
๋๋ค. ๊ธฐ๋ณธ ํ์ฑํ๋ฅผ ์ฐธ์กฐํ์ธ์. Claude Code v2.1.154 ์ด์์ด ํ์ํฉ๋๋ค. |
false |
๊ธฐ๋ณธ ํ์ฑํ
plugin.json์์ defaultEnabled: false๋ฅผ ์ค์ ํ์ฌ ๋นํ์ฑํ๋ ์ํ๋ก ์ค์น๋๋ ํ๋ฌ๊ทธ์ธ์ ์ ๊ณตํ์ธ์. ์ฌ์ฉ์๋ claude plugin enable <plugin> ๋๋ /plugin ์ธํฐํ์ด์ค๋ก ์ผญ๋๋ค. ์ธ๋ถ ์๋น์ค์ ์ฐ๊ฒฐํ๋ ํ๋ฌ๊ทธ์ธ๊ณผ ๊ฐ์ด ์ฌ์ฉ์๊ฐ ์ตํธ์ธํด์ผ ํ๋ ๋น์ฉ์ด๋ ๋ฒ์๋ฅผ ์ถ๊ฐํ๋ ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ์ธ์. ์ด๋ Claude Code v2.1.154 ์ด์์ด ํ์ํฉ๋๋ค. ์ด์ ๋ฒ์ ์ ํ๋๋ฅผ ๋ฌด์ํ๊ณ ์ค์น ์ ํ๋ฌ๊ทธ์ธ์ ํ์ฑํํฉ๋๋ค.
defaultEnabled๋ ๋ค๋ฅธ ๊ฒ์ด ํ๋ฌ๊ทธ์ธ์ ์ํ๋ฅผ ๊ฒฐ์ ํ์ง ์์์ ๋์ ํด๋ฐฑ์
๋๋ค. ๋ ๊ฐ์ง๊ฐ ์ด๋ฅผ ์ฐ์ ํฉ๋๋ค:
- ์ฌ์ฉ์์ ์ค์ : ๋ชจ๋ ์ค์ ๋ฒ์์์ ํ๋ฌ๊ทธ์ธ์ ๋ํ
enabledPlugins์ ํญ๋ชฉ์ ๋๋ค. ์์ฑ๋๋ฉด ํ๋ฌ๊ทธ์ธ ์ ๋ฐ์ดํธ ๋ฐ ์ฌ์ค์น ์ ์ฒด์์ ์ ์ง๋๋ฏ๋ก ๋์ค ๋ฆด๋ฆฌ์ค์์defaultEnabled๋ฅผ ๋ณ๊ฒฝํด๋ ๊ธฐ์กด ์ฌ์ฉ์๋ฅผ ๋ค์ง์ง ์์ต๋๋ค. - ์ข
์์ฑ ์๊ตฌ ์ฌํญ: ํ๋ฌ๊ทธ์ธ์ด ํ์ฑํ๋ ๋ค๋ฅธ ํ๋ฌ๊ทธ์ธ์ ์ํด ํ์ํ ๋ Claude Code๋ ์ค์น ๋๋ ํ์ฑํ ์
true๋ฅผ ์์ฑํฉ๋๋ค. ์ด๋ ๋ช ์์ ์ค์ ์ ์ ๊ณตํ๋ฏ๋ก ์์ฒด ๊ธฐ๋ณธ๊ฐ์ด ๋ ์ด์ ์ ์ฉ๋์ง ์์ต๋๋ค. ์ข ์์ฑ์ด ์๋ ํ๋ฌ๊ทธ์ธ ํ์ฑํ ๋๋ ๋นํ์ฑํ๋ฅผ ์ฐธ์กฐํ์ธ์.
๋์ผํ ํ๋๊ฐ ํ๋ฌ๊ทธ์ธ์ ๋ง์ผํ๋ ์ด์ค ํญ๋ชฉ์ ๋ํ๋ ์ ์์ผ๋ฉฐ, ์ฌ๊ธฐ์ plugin.json์ ๊ฐ๋ณด๋ค ์ฐ์ ํฉ๋๋ค. ์ ํ์ฌํญ ํ๋ฌ๊ทธ์ธ ํ๋๋ฅผ ์ฐธ์กฐํ์ธ์.
์ปดํฌ๋ํธ ๊ฒฝ๋ก ํ๋
| ํ๋ | ํ์ | ์ค๋ช | ์์ |
|---|---|---|---|
skills |
string|array | <name>/SKILL.md๋ฅผ ํฌํจํ๋ ์ฌ์ฉ์ ์ ์ skill ๋๋ ํ ๋ฆฌ (๊ธฐ๋ณธ skills/ ์ธ์ ์ถ๊ฐ) |
"./custom/skills/" |
commands |
string|array | ์ฌ์ฉ์ ์ ์ ํ๋ฉด .md skill ํ์ผ ๋๋ ๋๋ ํ ๋ฆฌ (๊ธฐ๋ณธ commands/ ๋์ฒด) |
"./custom/cmd.md" ๋๋ ["./cmd1.md"] |
agents |
string|array | ์ฌ์ฉ์ ์ ์ agent ํ์ผ (๊ธฐ๋ณธ agents/ ๋์ฒด) |
"./custom/agents/reviewer.md" |
hooks |
string|array|object | Hook ๊ตฌ์ฑ ๊ฒฝ๋ก ๋๋ ์ธ๋ผ์ธ ๊ตฌ์ฑ | "./my-extra-hooks.json" |
mcpServers |
string|array|object | MCP ๊ตฌ์ฑ ๊ฒฝ๋ก ๋๋ ์ธ๋ผ์ธ ๊ตฌ์ฑ | "./my-extra-mcp-config.json" |
outputStyles |
string|array | ์ฌ์ฉ์ ์ ์ ์ถ๋ ฅ ์คํ์ผ ํ์ผ/๋๋ ํ ๋ฆฌ (๊ธฐ๋ณธ output-styles/ ๋์ฒด) |
"./styles/" |
lspServers |
string|array|object | Language Server Protocol ์ฝ๋ ์ธํ ๋ฆฌ์ ์ค ๊ตฌ์ฑ (์ ์๋ก ์ด๋, ์ฐธ์กฐ ์ฐพ๊ธฐ ๋ฑ) | "./.lsp.json" |
experimental.themes |
string|array | ์์ ํ
๋ง ํ์ผ/๋๋ ํ ๋ฆฌ (๊ธฐ๋ณธ themes/ ๋์ฒด). ํ
๋ง ์ฐธ์กฐ |
"./themes/" |
experimental.monitors |
string|array | ํ๋ฌ๊ทธ์ธ์ด ํ์ฑํ๋ ๋ ์๋์ผ๋ก ์์๋๋ ๋ฐฑ๊ทธ๋ผ์ด๋ Monitor ๊ตฌ์ฑ. Monitors ์ฐธ์กฐ | "./monitors.json" |
userConfig |
object | ํ๋ฌ๊ทธ์ธ์ด ํ์ฑํ๋ ๋ ์ฌ์ฉ์์๊ฒ ํ๋กฌํํธํ๋ ์ฌ์ฉ์ ๊ตฌ์ฑ ๊ฐ๋ฅ ๊ฐ. ์ฌ์ฉ์ ๊ตฌ์ฑ ์ฐธ์กฐ | ์๋ ์ฐธ์กฐ |
channels |
array | ๋ฉ์์ง ์ฃผ์ ์ ์ํ ์ฑ๋ ์ ์ธ (Telegram, Slack, Discord ์คํ์ผ). ์ฑ๋ ์ฐธ์กฐ | ์๋ ์ฐธ์กฐ |
dependencies |
array | ์ด ํ๋ฌ๊ทธ์ธ์ด ํ์๋ก ํ๋ ๋ค๋ฅธ ํ๋ฌ๊ทธ์ธ, ์ ํ์ ์ผ๋ก semver ๋ฒ์ ์ ์ฝ ํฌํจ. ํ๋ฌ๊ทธ์ธ ์ข ์์ฑ ๋ฒ์ ์ ์ฝ ์ฐธ์กฐ | [{ "name": "secrets-vault", "version": "~2.1.0" }] |
์คํ์ ์ปดํฌ๋ํธ
experimental ํค ์๋์ ์ปดํฌ๋ํธ์ธ themes ๋ฐ monitors๋ ์์ ํ๋๋ ๋์ ๋ฆด๋ฆฌ์ค ๊ฐ์ ๋ณ๊ฒฝ๋ ์ ์๋ ๋งค๋ํ์คํธ ์คํค๋ง๋ฅผ ๊ฐ์ง๋๋ค. ์ด๋ค์ ์ ์ธํ๋ ์์น๋ ๋ณ๋์ ๋ง์ด๊ทธ๋ ์ด์
์
๋๋ค. ์ต์์ ์์ค์ ์ฌ์ ํ ์๋ํ๊ณ , claude plugin validate๋ ๊ฒฝ๊ณ ํ๋ฉฐ, ํฅํ ๋ฆด๋ฆฌ์ค์์๋ experimental.*์ด ํ์ํฉ๋๋ค.
์ฌ์ฉ์ ๊ตฌ์ฑ
userConfig ํ๋๋ ํ๋ฌ๊ทธ์ธ์ด ํ์ฑํ๋ ๋ Claude Code๊ฐ ์ฌ์ฉ์์๊ฒ ํ๋กฌํํธํ๋ ๊ฐ์ ์ ์ธํฉ๋๋ค. ์ฌ์ฉ์๊ฐ settings.json์ ์๋์ผ๋ก ํธ์งํ๋๋ก ์๊ตฌํ๋ ๋์ ์ด๋ฅผ ์ฌ์ฉํ์ธ์.
{
"userConfig": {
"api_endpoint": {
"type": "string",
"title": "API ์๋ํฌ์ธํธ",
"description": "ํ์ API ์๋ํฌ์ธํธ"
},
"api_token": {
"type": "string",
"title": "API ํ ํฐ",
"description": "API ์ธ์ฆ ํ ํฐ",
"sensitive": true
}
}
}
ํค๋ ์ ํจํ ์๋ณ์์ฌ์ผ ํฉ๋๋ค. ๊ฐ ์ต์ ์ ๋ค์ ํ๋๋ฅผ ์ง์ํฉ๋๋ค:
| ํ๋ | ํ์ | ์ค๋ช |
|---|---|---|
type |
์ | string, number, boolean, directory ๋๋ file ์ค ํ๋ |
title |
์ | ๊ตฌ์ฑ ๋ํ์ ํ์๋๋ ๋ ์ด๋ธ |
description |
์ | ํ๋ ์๋์ ํ์๋๋ ๋์๋ง ํ ์คํธ |
sensitive |
์๋์ค | true์ธ ๊ฒฝ์ฐ ์
๋ ฅ์ ๋ง์คํนํ๊ณ ๊ฐ์ settings.json ๋์ ๋ณด์ ์ ์ฅ์์ ์ ์ฅํฉ๋๋ค. |
required |
์๋์ค | true์ธ ๊ฒฝ์ฐ ํ๋๊ฐ ๋น์ด ์์ผ๋ฉด ๊ฒ์ฆ์ด ์คํจํฉ๋๋ค. |
default |
์๋์ค | ์ฌ์ฉ์๊ฐ ์๋ฌด๊ฒ๋ ์ ๊ณตํ์ง ์์ ๋ ์ฌ์ฉ๋๋ ๊ฐ |
multiple |
์๋์ค | string ํ์
์ ๊ฒฝ์ฐ ๋ฌธ์์ด ๋ฐฐ์ด ํ์ฉ |
min / max |
์๋์ค | number ํ์
์ ๋ฒ์ |
๊ฐ ๊ฐ์ MCP ๋ฐ LSP ์๋ฒ ๊ตฌ์ฑ, hook ๋ช
๋ น์ด ๋ฐ monitor ๋ช
๋ น์ด์์ ${user_config.KEY}๋ก ๋์ฒดํ ์ ์์ต๋๋ค. ๋ฏผ๊ฐํ์ง ์์ ๊ฐ์ skill ๋ฐ agent ์ฝํ
์ธ ์์๋ ๋์ฒดํ ์ ์์ต๋๋ค. ๋ชจ๋ ๊ฐ์ ํ๋ฌ๊ทธ์ธ ์๋ธํ๋ก์ธ์ค์ CLAUDE_PLUGIN_OPTION_<KEY> ํ๊ฒฝ ๋ณ์๋ก ๋ด๋ณด๋ด์ง๋๋ค.
๋ฏผ๊ฐํ์ง ์์ ๊ฐ์ settings.json์ pluginConfigs[<plugin-id>].options ์๋์ ์ ์ฅ๋ฉ๋๋ค. ๋ฏผ๊ฐํ ๊ฐ์ ์์คํ
ํค์ฒด์ธ (๋๋ ํค์ฒด์ธ์ ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ ~/.claude/.credentials.json)์ผ๋ก ์ด๋ํฉ๋๋ค. ํค์ฒด์ธ ์ ์ฅ์๋ OAuth ํ ํฐ๊ณผ ๊ณต์ ๋๋ฉฐ ์ฝ 2 KB์ ์ด ์ ํ์ด ์์ผ๋ฏ๋ก ๋ฏผ๊ฐํ ๊ฐ์ ์๊ฒ ์ ์งํ์ธ์.
์ฑ๋
channels ํ๋๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋ฌ๊ทธ์ธ์ด ํ๋ ์ด์์ ๋ฉ์์ง ์ฑ๋์ ์ ์ธํ์ฌ ๋ํ์ ์ฝํ
์ธ ๋ฅผ ์ฃผ์
ํ ์ ์์ต๋๋ค. ๊ฐ ์ฑ๋์ ํ๋ฌ๊ทธ์ธ์ด ์ ๊ณตํ๋ MCP ์๋ฒ์ ๋ฐ์ธ๋ฉ๋ฉ๋๋ค.
{
"channels": [
{
"server": "telegram",
"userConfig": {
"bot_token": {
"type": "string",
"title": "๋ด ํ ํฐ",
"description": "Telegram ๋ด ํ ํฐ",
"sensitive": true
},
"owner_id": {
"type": "string",
"title": "์์ ์ ID",
"description": "Telegram ์ฌ์ฉ์ ID"
}
}
}
]
}
server ํ๋๋ ํ์์ด๋ฉฐ ํ๋ฌ๊ทธ์ธ์ mcpServers์ ํค์ ์ผ์นํด์ผ ํฉ๋๋ค. ์ ํ์ฌํญ์ธ ์ฑ๋๋ณ userConfig๋ ์ต์์ ํ๋์ ๋์ผํ ์คํค๋ง๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ฌ๊ทธ์ธ์ด ํ๋ฌ๊ทธ์ธ์ด ํ์ฑํ๋ ๋ ๋ด ํ ํฐ ๋๋ ์์ ์ ID๋ฅผ ํ๋กฌํํธํ ์ ์์ต๋๋ค.
๊ฒฝ๋ก ๋์ ๊ท์น
์ฌ์ฉ์ ์ ์ ๊ฒฝ๋ก๊ฐ ํ๋ฌ๊ทธ์ธ์ ๊ธฐ๋ณธ ๋๋ ํ ๋ฆฌ๋ฅผ ๋์ฒดํ๋์ง ํ์ฅํ๋์ง๋ ํ๋์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค:
- ๊ธฐ๋ณธ๊ฐ ๋์ฒด:
commands,agents,outputStyles,experimental.themes,experimental.monitors. ์๋ฅผ ๋ค์ด ๋งค๋ํ์คํธ๊ฐcommands๋ฅผ ์ง์ ํ๋ฉด ๊ธฐ๋ณธcommands/๋๋ ํ ๋ฆฌ๋ ์ค์บ๋์ง ์์ต๋๋ค. ๊ธฐ๋ณธ๊ฐ์ ์ ์งํ๊ณ ๋ ๋ง์ ๊ฒ์ ์ถ๊ฐํ๋ ค๋ฉด ๋ช ์์ ์ผ๋ก ๋์ดํ์ธ์:"commands": ["./commands/", "./extras/"] - ๊ธฐ๋ณธ๊ฐ์ ์ถ๊ฐ:
skills. ๊ธฐ๋ณธskills/๋๋ ํ ๋ฆฌ๋ ํญ์ ์ค์บ๋๋ฉฐ,skills์ ๋์ด๋ ๋๋ ํ ๋ฆฌ๋ ํจ๊ป ๋ก๋๋ฉ๋๋ค. - ์์ฒด ๋ณํฉ ๊ท์น: hooks, MCP servers ๋ฐ LSP servers. ๊ฐ ์น์ ์์ ์ฌ๋ฌ ์์ค๊ฐ ์ด๋ป๊ฒ ๊ฒฐํฉ๋๋์ง ์ฐธ์กฐํ์ธ์.
ํ๋ฌ๊ทธ์ธ์ ๊ธฐ๋ณธ ํด๋์ ์ผ์นํ๋ ๋งค๋ํ์คํธ ํค๊ฐ ๋ชจ๋ ์์ผ๋ฉด Claude Code v2.1.140 ์ด์์ /doctor, claude plugin list ๋ฐ /plugin ์์ธ ๋ณด๊ธฐ์์ ๋ฌด์๋ ํด๋์ ํ๋๊ทธ๋ฅผ ์ง์ ํฉ๋๋ค. ํ๋ฌ๊ทธ์ธ์ ์ฌ์ ํ ๋งค๋ํ์คํธ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ์ฌ ๋ก๋๋ฉ๋๋ค. ๋งค๋ํ์คํธ ํค๊ฐ ๊ธฐ๋ณธ ํด๋๋ฅผ ๊ฐ๋ฆฌํฌ ๋๋ ๊ฒฝ๊ณ ๊ฐ ํ์๋์ง ์์ต๋๋ค (์: "commands": ["./commands/deploy.md"]). ์ด ๊ฒฝ์ฐ ํด๋๊ฐ ๋ช
์์ ์ผ๋ก ์ฒ๋ฆฌ๋๊ธฐ ๋๋ฌธ์
๋๋ค.
๋ชจ๋ ๊ฒฝ๋ก ํ๋์ ๊ฒฝ์ฐ:
- ๋ชจ๋ ๊ฒฝ๋ก๋ ํ๋ฌ๊ทธ์ธ ๋ฃจํธ์ ์๋์ ์ด์ด์ผ ํ๋ฉฐ
./๋ก ์์ํด์ผ ํฉ๋๋ค. - ์ฌ์ฉ์ ์ ์ ๊ฒฝ๋ก์ ์ปดํฌ๋ํธ๋ ๋์ผํ ๋ช ๋ช ๋ฐ ๋ค์์คํ์ด์ฑ ๊ท์น์ ์ฌ์ฉํฉ๋๋ค.
- ์ฌ๋ฌ ๊ฒฝ๋ก๋ฅผ ๋ฐฐ์ด๋ก ์ง์ ํ ์ ์์ต๋๋ค.
- skill ๊ฒฝ๋ก๊ฐ
SKILL.md๋ฅผ ์ง์ ํฌํจํ๋ ๋๋ ํ ๋ฆฌ๋ฅผ ๊ฐ๋ฆฌํฌ ๋ (์: ํ๋ฌ๊ทธ์ธ ๋ฃจํธ๋ฅผ ๊ฐ๋ฆฌํค๋"skills": ["./"]), frontmatter์nameํ๋๊ฐ skill์ ํธ์ถ ์ด๋ฆ์ ๊ฒฐ์ ํฉ๋๋ค. ์ด๋ ์ค์น ๋๋ ํ ๋ฆฌ์ ๊ด๊ณ์์ด ์์ ์ ์ธ ์ด๋ฆ์ ์ ๊ณตํฉ๋๋ค.name์ด frontmatter์ ์ค์ ๋์ง ์์ผ๋ฉด ๋๋ ํ ๋ฆฌ basename์ด ํด๋ฐฑ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
ํ๋ฌ๊ทธ์ธ์ด ๋ฃจํธ์ SKILL.md๋ฅผ ๊ฐ์ง๊ณ ์๊ณ , skills/ ์๋ธ๋๋ ํ ๋ฆฌ๊ฐ ์์ผ๋ฉฐ, skills ๋งค๋ํ์คํธ ํ๋๊ฐ ์์ผ๋ฉด Claude Code v2.1.142 ์ด์์์ ์๋์ผ๋ก ๋จ์ผ skill ํ๋ฌ๊ทธ์ธ์ผ๋ก ๋ก๋๋ฉ๋๋ค. ์ด ๋ ์ด์์์ ๋ํด plugin.json์์ "skills": ["./"]๋ฅผ ์ค์ ํ ํ์๊ฐ ์์ต๋๋ค. skill์ ํธ์ถ ์ด๋ฆ์ ์์ ๋์ผํ ๊ท์น์ ๋ฐ๋ฆ
๋๋ค: frontmatter name ํ๋ ๋๋ ๋๋ ํ ๋ฆฌ basename์ ํด๋ฐฑ์ผ๋ก ์ฌ์ฉํฉ๋๋ค.
๊ฒฝ๋ก ์์:
{
"commands": [
"./specialized/deploy.md",
"./utilities/batch-process.md"
],
"agents": [
"./custom-agents/reviewer.md",
"./custom-agents/tester.md"
]
}
ํ๊ฒฝ ๋ณ์
Claude Code๋ ํ๋ฌ๊ทธ์ธ ๊ฒฝ๋ก๋ฅผ ์ฐธ์กฐํ๊ธฐ ์ํ ์ธ ๊ฐ์ง ๋ณ์๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ชจ๋ skill ์ฝํ ์ธ , agent ์ฝํ ์ธ , hook ๋ช ๋ น์ด, monitor ๋ช ๋ น์ด ๋ฐ MCP ๋๋ LSP ์๋ฒ ๊ตฌ์ฑ์ ๋ํ๋๋ ๋ชจ๋ ๊ณณ์์ ์ธ๋ผ์ธ์ผ๋ก ๋์ฒด๋ฉ๋๋ค. ๋ชจ๋ hook ํ๋ก์ธ์ค ๋ฐ MCP ๋๋ LSP ์๋ฒ ์๋ธํ๋ก์ธ์ค์ ํ๊ฒฝ ๋ณ์๋ก ๋ด๋ณด๋ด์ง๋๋ค.
${CLAUDE_PLUGIN_ROOT}: ํ๋ฌ๊ทธ์ธ ์ค์น ๋๋ ํ ๋ฆฌ์ ์ ๋ ๊ฒฝ๋ก์
๋๋ค. ํ๋ฌ๊ทธ์ธ๊ณผ ํจ๊ป ๋ฒ๋ค๋ก ์ ๊ณต๋๋ ์คํฌ๋ฆฝํธ, ๋ฐ์ด๋๋ฆฌ ๋ฐ ๊ตฌ์ฑ ํ์ผ์ ์ฐธ์กฐํ๋ ๋ฐ ์ฌ์ฉํ์ธ์. hook ๋ช
๋ น์ด์์ exec form์ args์ ํจ๊ป ์ฌ์ฉํ์ฌ ๊ฒฝ๋ก๊ฐ ๋ฐ์ดํ ์์ด ํ๋์ ์ธ์๋ก ์ ๋ฌ๋๋๋ก ํ์ธ์. shell-form hook ๋ฐ monitor ๋ช
๋ น์ด์์ "${CLAUDE_PLUGIN_ROOT}"์ ๊ฐ์ด ํฐ๋ฐ์ดํ๋ก ๊ฐ์ธ์ธ์. ์ด ๊ฒฝ๋ก๋ ํ๋ฌ๊ทธ์ธ์ด ์
๋ฐ์ดํธ๋ ๋ ๋ณ๊ฒฝ๋ฉ๋๋ค. ์ด์ ๋ฒ์ ์ ๋๋ ํ ๋ฆฌ๋ ์
๋ฐ์ดํธ ํ ์ฝ 7์ผ ๋์ ๋์คํฌ์ ๋จ์ ์์ง๋ง ์ด๋ฅผ ์์๋ก ์ทจ๊ธํ๊ณ ์ฌ๊ธฐ์ ์ํ๋ฅผ ์์ฑํ์ง ๋ง์ธ์.
ํ๋ฌ๊ทธ์ธ์ด ์ธ์
์ค์ ์
๋ฐ์ดํธ๋ ๋ hook ๋ช
๋ น์ด, monitors, MCP ์๋ฒ ๋ฐ LSP ์๋ฒ๋ ์ด์ ๋ฒ์ ์ ๊ฒฝ๋ก๋ฅผ ๊ณ์ ์ฌ์ฉํฉ๋๋ค. /reload-plugins๋ฅผ ์คํํ์ฌ hook, MCP ์๋ฒ ๋ฐ LSP ์๋ฒ๋ฅผ ์ ๊ฒฝ๋ก๋ก ์ ํํ์ธ์. monitors๋ ์ธ์
์ฌ์์์ด ํ์ํฉ๋๋ค.
${CLAUDE_PLUGIN_DATA}: ์
๋ฐ์ดํธ ํ์๋ ์ ์ง๋๋ ํ๋ฌ๊ทธ์ธ ์ํ๋ฅผ ์ํ ์๊ตฌ ๋๋ ํ ๋ฆฌ์
๋๋ค. node_modules ๋๋ Python ๊ฐ์ ํ๊ฒฝ๊ณผ ๊ฐ์ ์ค์น๋ ์ข
์์ฑ, ์์ฑ๋ ์ฝ๋, ์บ์ ๋ฐ ํ๋ฌ๊ทธ์ธ ๋ฒ์ ์ ์ฒด์์ ์ ์ง๋์ด์ผ ํ๋ ๊ธฐํ ํ์ผ์ ์ฌ์ฉํ์ธ์. ์ด ๋ณ์๊ฐ ์ฒ์ ์ฐธ์กฐ๋ ๋ ๋๋ ํ ๋ฆฌ๊ฐ ์๋์ผ๋ก ์์ฑ๋ฉ๋๋ค.
${CLAUDE_PROJECT_DIR}: ํ๋ก์ ํธ ๋ฃจํธ์
๋๋ค. ์ด๋ hook์ด CLAUDE_PROJECT_DIR ๋ณ์์์ ๋ฐ๋ ๊ฒ๊ณผ ๋์ผํ ๋๋ ํ ๋ฆฌ์
๋๋ค. ํ๋ก์ ํธ ๋ก์ปฌ ์คํฌ๋ฆฝํธ ๋๋ ๊ตฌ์ฑ ํ์ผ์ ์ฐธ์กฐํ๋ ๋ฐ ์ฌ์ฉํ์ธ์. ๊ณต๋ฐฑ์ด ์๋ ๊ฒฝ๋ก๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋ฐ์ดํ๋ก ๊ฐ์ธ์ธ์ (์: "${CLAUDE_PROJECT_DIR}/scripts/server.sh"). MCP ์๋ฒ๋ MCP roots/list ์์ฒญ์ ํธ์ถํ ์๋ ์์ผ๋ฉฐ, ์ด๋ Claude Code๊ฐ ์์๋ ๋๋ ํ ๋ฆฌ๋ฅผ ๋ฐํํฉ๋๋ค.
{
"hooks": {
"PostToolUse": [
{
"hooks": [
{
"type": "command",
"command": "\"${CLAUDE_PLUGIN_ROOT}\"/scripts/process.sh"
}
]
}
]
}
}
์๊ตฌ ๋ฐ์ดํฐ ๋๋ ํ ๋ฆฌ
${CLAUDE_PLUGIN_DATA} ๋๋ ํ ๋ฆฌ๋ ~/.claude/plugins/data/{id}/๋ก ํ์ธ๋๋ฉฐ, ์ฌ๊ธฐ์ {id}๋ a-z, A-Z, 0-9, _ ๋ฐ - ์ธ๋ถ์ ๋ฌธ์๊ฐ -๋ก ๋์ฒด๋ ํ๋ฌ๊ทธ์ธ ์๋ณ์์
๋๋ค. formatter@my-marketplace๋ก ์ค์น๋ ํ๋ฌ๊ทธ์ธ์ ๊ฒฝ์ฐ ๋๋ ํ ๋ฆฌ๋ ~/.claude/plugins/data/formatter-my-marketplace/์
๋๋ค.
์ผ๋ฐ์ ์ธ ์ฌ์ฉ์ ์ธ์ด ์ข ์์ฑ์ ํ ๋ฒ ์ค์นํ๊ณ ์ธ์ ๋ฐ ํ๋ฌ๊ทธ์ธ ์ ๋ฐ์ดํธ ์ ์ฒด์์ ์ฌ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. ๋ฐ์ดํฐ ๋๋ ํ ๋ฆฌ๊ฐ ๋จ์ผ ํ๋ฌ๊ทธ์ธ ๋ฒ์ ๋ณด๋ค ์ค๋ ์ง์๋๋ฏ๋ก ๋๋ ํ ๋ฆฌ ์กด์ฌ ์ฌ๋ถ๋ง ํ์ธํ๋ฉด ์ ๋ฐ์ดํธ๊ฐ ํ๋ฌ๊ทธ์ธ์ ์ข ์์ฑ ๋งค๋ํ์คํธ๋ฅผ ๋ณ๊ฒฝํ ๋๋ฅผ ๊ฐ์งํ ์ ์์ต๋๋ค. ๊ถ์ฅ ํจํด์ ๋ฒ๋ค๋ ๋งค๋ํ์คํธ๋ฅผ ๋ฐ์ดํฐ ๋๋ ํ ๋ฆฌ์ ๋ณต์ฌ๋ณธ๊ณผ ๋น๊ตํ๊ณ ๋ค๋ฅผ ๋ ๋ค์ ์ค์นํฉ๋๋ค.
์ด SessionStart hook์ ์ฒซ ์คํ ์ node_modules๋ฅผ ์ค์นํ๊ณ ํ๋ฌ๊ทธ์ธ ์
๋ฐ์ดํธ๊ฐ ๋ณ๊ฒฝ๋ package.json์ ํฌํจํ ๋๋ง๋ค ๋ค์ ์ค์นํฉ๋๋ค:
{
"hooks": {
"SessionStart": [
{
"hooks": [
{
"type": "command",
"command": "diff -q \"${CLAUDE_PLUGIN_ROOT}/package.json\" \"${CLAUDE_PLUGIN_DATA}/package.json\" >/dev/null 2>&1 || (cd \"${CLAUDE_PLUGIN_DATA}\" && cp \"${CLAUDE_PLUGIN_ROOT}/package.json\" . && npm install) || rm -f \"${CLAUDE_PLUGIN_DATA}/package.json\""
}
]
}
]
}
}
diff๋ ์ ์ฅ๋ ๋ณต์ฌ๋ณธ์ด ๋๋ฝ๋๊ฑฐ๋ ๋ฒ๋ค๋ ๋ณต์ฌ๋ณธ๊ณผ ๋ค๋ฅผ ๋ 0์ด ์๋ ๊ฐ์ผ๋ก ์ข
๋ฃ๋์ด ์ฒซ ์คํ๊ณผ ์ข
์์ฑ ๋ณ๊ฒฝ ์
๋ฐ์ดํธ๋ฅผ ๋ชจ๋ ๋ค๋ฃน๋๋ค. npm install์ด ์คํจํ๋ฉด ํํ rm์ ๋ณต์ฌ๋ ๋งค๋ํ์คํธ๋ฅผ ์ ๊ฑฐํ๋ฏ๋ก ๋ค์ ์ธ์
์ด ๋ค์ ์๋ํฉ๋๋ค.
${CLAUDE_PLUGIN_ROOT}์ ๋ฒ๋ค๋ ์คํฌ๋ฆฝํธ๋ ์ง์๋ node_modules์ ๋ํด ์คํํ ์ ์์ต๋๋ค:
{
"mcpServers": {
"routines": {
"command": "node",
"args": ["${CLAUDE_PLUGIN_ROOT}/server.js"],
"env": {
"NODE_PATH": "${CLAUDE_PLUGIN_DATA}/node_modules"
}
}
}
}
๋ฐ์ดํฐ ๋๋ ํ ๋ฆฌ๋ ํ๋ฌ๊ทธ์ธ์ ์ค์นํ ๋ง์ง๋ง ๋ฒ์์์ ์ ๊ฑฐํ ๋ ์๋์ผ๋ก ์ญ์ ๋ฉ๋๋ค. /plugin ์ธํฐํ์ด์ค๋ ๋๋ ํ ๋ฆฌ ํฌ๊ธฐ๋ฅผ ํ์ํ๊ณ ์ญ์ ์ ์ ํ๋กฌํํธํฉ๋๋ค. CLI๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ญ์ ํฉ๋๋ค. --keep-data๋ฅผ ์ ๋ฌํ์ฌ ์ ์งํ์ธ์.
ํ๋ฌ๊ทธ์ธ ์บ์ฑ ๋ฐ ํ์ผ ํด์
ํ๋ฌ๊ทธ์ธ์ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ ์ค ํ๋๋ก ์ง์ ๋ฉ๋๋ค:
claude --plugin-dir๋๋claude --plugin-url์ ํตํด, ์ธ์ ๊ธฐ๊ฐ ๋์.- ๋ง์ผํ๋ ์ด์ค๋ฅผ ํตํด, ํฅํ ์ธ์ ์ ์ํด ์ค์น๋จ.
๋ณด์ ๋ฐ ๊ฒ์ฆ ๋ชฉ์ ์ผ๋ก Claude Code๋ ๋ง์ผํ๋ ์ด์ค ํ๋ฌ๊ทธ์ธ์ ์ ์๋ฆฌ์์ ์ฌ์ฉํ๋ ๋์ ์ฌ์ฉ์์ ๋ก์ปฌ ํ๋ฌ๊ทธ์ธ ์บ์ (~/.claude/plugins/cache)์ ๋ณต์ฌํฉ๋๋ค. ์ธ๋ถ ํ์ผ์ ์ฐธ์กฐํ๋ ํ๋ฌ๊ทธ์ธ์ ๊ฐ๋ฐํ ๋ ์ด ๋์์ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
๊ฐ ์ค์น๋ ๋ฒ์ ์ ์บ์์ ๋ณ๋ ๋๋ ํ ๋ฆฌ์ ๋๋ค. ํ๋ฌ๊ทธ์ธ์ ์ ๋ฐ์ดํธํ๊ฑฐ๋ ์ ๊ฑฐํ๋ฉด ์ด์ ๋ฒ์ ๋๋ ํ ๋ฆฌ๋ ๊ณ ์๋ก ํ์๋๊ณ 7์ผ ํ ์๋์ผ๋ก ์ ๊ฑฐ๋ฉ๋๋ค. ์ ์ ๊ธฐ๊ฐ์ ํตํด ์ด๋ฏธ ์ด์ ๋ฒ์ ์ ๋ก๋ํ ๋์ Claude Code ์ธ์ ์ด ์ค๋ฅ ์์ด ๊ณ์ ์คํ๋ ์ ์์ต๋๋ค.
Claude์ Glob ๋ฐ Grep ๋๊ตฌ๋ ๊ฒ์ ์ค์ ๊ณ ์ ๋ฒ์ ๋๋ ํ ๋ฆฌ๋ฅผ ๊ฑด๋๋ฐ๋ฏ๋ก ํ์ผ ๊ฒฐ๊ณผ์๋ ์ค๋๋ ํ๋ฌ๊ทธ์ธ ์ฝ๋๊ฐ ํฌํจ๋์ง ์์ต๋๋ค.
๊ฒฝ๋ก ์ํ ์ ํ
์ค์น๋ ํ๋ฌ๊ทธ์ธ์ ํด๋น ๋๋ ํ ๋ฆฌ ์ธ๋ถ์ ํ์ผ์ ์ฐธ์กฐํ ์ ์์ต๋๋ค. ํ๋ฌ๊ทธ์ธ ๋ฃจํธ ์ธ๋ถ๋ฅผ ์ํํ๋ ๊ฒฝ๋ก(์: ../shared-utils)๋ ์ค์น ํ ์๋ํ์ง ์์ต๋๋ค. ์๋ํ๋ฉด ์ด๋ฌํ ์ธ๋ถ ํ์ผ์ด ์บ์์ ๋ณต์ฌ๋์ง ์๊ธฐ ๋๋ฌธ์
๋๋ค.
๋ง์ผํ๋ ์ด์ค ๋ด์์ ์ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ์ฌ์ฉํ์ฌ ํ์ผ ๊ณต์
ํ๋ฌ๊ทธ์ธ์ด ๋์ผํ ๋ง์ผํ๋ ์ด์ค์ ๋ค๋ฅธ ๋ถ๋ถ๊ณผ ํ์ผ์ ๊ณต์ ํด์ผ ํ๋ ๊ฒฝ์ฐ ํ๋ฌ๊ทธ์ธ ๋๋ ํ ๋ฆฌ ๋ด์ ์ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ํ๋ฌ๊ทธ์ธ์ด ์บ์์ ๋ณต์ฌ๋ ๋ ์ฌ๋ณผ๋ฆญ ๋งํฌ๊ฐ ์ฒ๋ฆฌ๋๋ ๋ฐฉ์์ ํด๋น ๋์์ด ์ด๋๋ก ํด์๋๋์ง์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค:
- ํ๋ฌ๊ทธ์ธ ์์ฒด ๋๋ ํ ๋ฆฌ ๋ด: ์ฌ๋ณผ๋ฆญ ๋งํฌ๋ ์บ์์ ์๋ ์ฌ๋ณผ๋ฆญ ๋งํฌ๋ก ๋ณด์กด๋๋ฏ๋ก ๋ฐํ์์ ๋ณต์ฌ๋ ๋์์ผ๋ก ๊ณ์ ํด์๋ฉ๋๋ค.
- ๋์ผํ ๋ง์ผํ๋ ์ด์ค ๋ด์ ๋ค๋ฅธ ๊ณณ: ์ฌ๋ณผ๋ฆญ ๋งํฌ๋ ์ญ์ฐธ์กฐ๋ฉ๋๋ค. ๋์์ ์ฝํ
์ธ ๊ฐ ์บ์์ ๋ณต์ฌ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ฉํ ํ๋ฌ๊ทธ์ธ์
skills/๋๋ ํ ๋ฆฌ๊ฐ ๋ง์ผํ๋ ์ด์ค์ ๋ค๋ฅธ ํ๋ฌ๊ทธ์ธ์ผ๋ก ์ ์๋ skills์ ๋งํฌํ ์ ์์ต๋๋ค. - ๋ง์ผํ๋ ์ด์ค ์ธ๋ถ: ์ฌ๋ณผ๋ฆญ ๋งํฌ๋ ๋ณด์์์ ์ด์ ๋ก ๊ฑด๋๋๋๋ค. ์ด๋ ํ๋ฌ๊ทธ์ธ์ด ์์คํ ๊ฒฝ๋ก์ ๊ฐ์ ์์์ ํธ์คํธ ํ์ผ์ ์บ์๋ก ๊ฐ์ ธ์ค๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
--plugin-dir์ผ๋ก ์ค์น๋๊ฑฐ๋ ๋ก์ปฌ ๊ฒฝ๋ก์์ ์ค์น๋ ํ๋ฌ๊ทธ์ธ์ ๊ฒฝ์ฐ ํ๋ฌ๊ทธ์ธ ์์ฒด ๋๋ ํ ๋ฆฌ ๋ด์์ ํด์๋๋ ์ฌ๋ณผ๋ฆญ ๋งํฌ๋ง ๋ณด์กด๋ฉ๋๋ค. ๋ค๋ฅธ ๋ชจ๋ ๊ฒ์ ๊ฑด๋๋๋๋ค.
๋ค์ ๋ช
๋ น์ด๋ ๋ง์ผํ๋ ์ด์ค ํ๋ฌ๊ทธ์ธ ๋ด๋ถ์์ ํ์ ํ๋ฌ๊ทธ์ธ์ผ๋ก ์ ์๋ ๊ณต์ skill๋ก์ ๋งํฌ๋ฅผ ๋ง๋ญ๋๋ค. Windows์์๋ ๊ด๋ฆฌ์ ๊ถํ ๋ช
๋ น ํ๋กฌํํธ์์ mklink /D๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ๊ฐ๋ฐ์ ๋ชจ๋๋ฅผ ํ์ฑํํ์ธ์:
ln -s ../../shared-plugin/skills/foo ./skills/foo
์ด๋ ์บ์ฑ ์์คํ ์ ๋ณด์ ์ด์ ์ ์ ์งํ๋ฉด์ ์ ์ฐ์ฑ์ ์ ๊ณตํฉ๋๋ค.
ํ๋ฌ๊ทธ์ธ ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ
ํ์ค ํ๋ฌ๊ทธ์ธ ๋ ์ด์์
์์ ํ ํ๋ฌ๊ทธ์ธ์ ๋ค์ ๊ตฌ์กฐ๋ฅผ ๋ฐ๋ฆ ๋๋ค:
enterprise-plugin/
โโโ .claude-plugin/ # ๋ฉํ๋ฐ์ดํฐ ๋๋ ํ ๋ฆฌ (์ ํ์ฌํญ)
โ โโโ plugin.json # ํ๋ฌ๊ทธ์ธ ๋งค๋ํ์คํธ
โโโ skills/ # Skills
โ โโโ code-reviewer/
โ โ โโโ SKILL.md
โ โโโ pdf-processor/
โ โโโ SKILL.md
โ โโโ scripts/
โโโ commands/ # ํ๋ฉด .md ํ์ผ๋ก์์ Skills
โ โโโ status.md
โ โโโ logs.md
โโโ agents/ # Subagent ์ ์
โ โโโ security-reviewer.md
โ โโโ performance-tester.md
โ โโโ compliance-checker.md
โโโ output-styles/ # ์ถ๋ ฅ ์คํ์ผ ์ ์
โ โโโ terse.md
โโโ themes/ # ์์ ํ
๋ง ์ ์
โ โโโ dracula.json
โโโ monitors/ # ๋ฐฑ๊ทธ๋ผ์ด๋ ๋ชจ๋ํฐ ๊ตฌ์ฑ
โ โโโ monitors.json
โโโ hooks/ # Hook ๊ตฌ์ฑ
โ โโโ hooks.json # ์ฃผ hook ๊ตฌ์ฑ
โ โโโ security-hooks.json # ์ถ๊ฐ hooks
โโโ bin/ # PATH์ ์ถ๊ฐ๋ ํ๋ฌ๊ทธ์ธ ์คํ ํ์ผ
โ โโโ my-tool # Bash tool์์ bare ๋ช
๋ น์ด๋ก ํธ์ถ ๊ฐ๋ฅ
โโโ settings.json # ํ๋ฌ๊ทธ์ธ์ ๊ธฐ๋ณธ ์ค์
โโโ .mcp.json # MCP ์๋ฒ ์ ์
โโโ .lsp.json # LSP ์๋ฒ ๊ตฌ์ฑ
โโโ scripts/ # Hook ๋ฐ ์ ํธ๋ฆฌํฐ ์คํฌ๋ฆฝํธ
โ โโโ security-scan.sh
โ โโโ format-code.py
โ โโโ deploy.js
โโโ LICENSE # ๋ผ์ด์ ์ค ํ์ผ
โโโ CHANGELOG.md # ๋ฒ์ ๊ธฐ๋ก
.claude-plugin/ ๋๋ ํ ๋ฆฌ๋ plugin.json ํ์ผ์ ํฌํจํฉ๋๋ค. ๋ค๋ฅธ ๋ชจ๋ ๋๋ ํ ๋ฆฌ (commands/, agents/, skills/, output-styles/, themes/, monitors/, hooks/)๋ .claude-plugin/ ๋ด๋ถ๊ฐ ์๋ ํ๋ฌ๊ทธ์ธ ๋ฃจํธ์ ์์ด์ผ ํฉ๋๋ค.
CLAUDE.md ํ์ผ์ด ํ๋ฌ๊ทธ์ธ ๋ฃจํธ์ ์์ด๋ ํ๋ก์ ํธ ์ปจํ
์คํธ๋ก ๋ก๋๋์ง ์์ต๋๋ค. ํ๋ฌ๊ทธ์ธ์ CLAUDE.md๊ฐ ์๋ skills, agents, hooks๋ฅผ ํตํด ์ปจํ
์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. Claude์ ์ปจํ
์คํธ์ ๋ก๋๋๋ ์ง์นจ์ ์ ๊ณตํ๋ ค๋ฉด skill์ ๋ฐฐ์นํ์ญ์์ค.
ํ์ผ ์์น ์ฐธ์กฐ
| ์ปดํฌ๋ํธ | ๊ธฐ๋ณธ ์์น | ๋ชฉ์ |
|---|---|---|
| ๋งค๋ํ์คํธ | .claude-plugin/plugin.json |
ํ๋ฌ๊ทธ์ธ ๋ฉํ๋ฐ์ดํฐ ๋ฐ ๊ตฌ์ฑ (์ ํ์ฌํญ) |
| Skills | skills/ |
<name>/SKILL.md ๊ตฌ์กฐ์ Skills |
| Commands | commands/ |
ํ๋ฉด ๋งํฌ๋ค์ด ํ์ผ๋ก์์ Skills. ์ ํ๋ฌ๊ทธ์ธ์๋ skills/ ์ฌ์ฉ |
| Agents | agents/ |
Subagent ๋งํฌ๋ค์ด ํ์ผ |
| Output styles | output-styles/ |
์ถ๋ ฅ ์คํ์ผ ์ ์ |
| Themes | themes/ |
์์ ํ ๋ง ์ ์ |
| Hooks | hooks/hooks.json |
Hook ๊ตฌ์ฑ |
| MCP servers | .mcp.json |
MCP ์๋ฒ ์ ์ |
| LSP servers | .lsp.json |
์ธ์ด ์๋ฒ ๊ตฌ์ฑ |
| Monitors | monitors/monitors.json |
๋ฐฑ๊ทธ๋ผ์ด๋ ๋ชจ๋ํฐ ๊ตฌ์ฑ |
| Executables | bin/ |
Bash tool์ PATH์ ์ถ๊ฐ๋ ์คํ ํ์ผ. ์ฌ๊ธฐ์ ํ์ผ์ ํ๋ฌ๊ทธ์ธ์ด ํ์ฑํ๋ ๋์ ๋ชจ๋ Bash tool ํธ์ถ์์ bare ๋ช
๋ น์ด๋ก ํธ์ถ ๊ฐ๋ฅ |
| Settings | settings.json |
ํ๋ฌ๊ทธ์ธ์ด ํ์ฑํ๋ ๋ ์ ์ฉ๋๋ ๊ธฐ๋ณธ ๊ตฌ์ฑ. ํ์ฌ agent ๋ฐ subagentStatusLine ํค๋ง ์ง์๋ฉ๋๋ค |
CLI ๋ช ๋ น์ด ์ฐธ์กฐ
Claude Code๋ ์คํฌ๋ฆฝํ ๋ฐ ์๋ํ์ ์ ์ฉํ ๋น๋ํํ ํ๋ฌ๊ทธ์ธ ๊ด๋ฆฌ๋ฅผ ์ํ CLI ๋ช ๋ น์ด๋ฅผ ์ ๊ณตํฉ๋๋ค.
plugin init
~/.claude/skills/<name>/์์ ์ ํ๋ฌ๊ทธ์ธ์ ์ค์บํด๋ํฉ๋๋ค. ๋ค์ Claude Code ์ธ์
์์ <name>@skills-dir์ผ๋ก ์๋์ผ๋ก ๋ก๋๋๊ณ ์ค์น ๋จ๊ณ ์์ด /plugin ๋ฐ claude plugin list์ ๋ํ๋ฉ๋๋ค.
Skills-directory ํ๋ฌ๊ทธ์ธ์์ ๋ฒ์ ๋ฐ ์ ๋ขฐ ์๊ตฌ ์ฌํญ์ ์ฐธ์กฐํ์ธ์.
claude plugin init <name> [options]
์ธ์:
<name>: ํ๋ฌ๊ทธ์ธ ์ด๋ฆ. skill ๋ค์์คํ์ด์ค ๋ฐ~/.claude/skills/์๋์ ๋๋ ํ ๋ฆฌ ์ด๋ฆ์ด ๋๋ฏ๋ก ๊ณต๋ฐฑ์ด๋ ๊ฒฝ๋ก ๊ตฌ๋ถ์๋ฅผ ํฌํจํ ์ ์์ต๋๋ค.
์ต์ :
| ์ต์ | ์ค๋ช | ๊ธฐ๋ณธ๊ฐ |
|---|---|---|
--description <text> |
๋งค๋ํ์คํธ ์ค๋ช | |
--author <name> |
์์ฑ์ ์ด๋ฆ | git config user.name |
--author-email <email> |
์์ฑ์ ์ด๋ฉ์ผ | git config user.email |
--with <components...> |
์ปดํฌ๋ํธ ํด๋๋ ์ค์บํด๋ํฉ๋๋ค. ์ ํจํ ๊ฐ: skills, agents, hooks, mcp, lsp, output-style, channel |
|
-f, --force |
๋์์ ๊ธฐ์กด .claude-plugin/ ๋ฎ์ด์ฐ๊ธฐ |
|
-h, --help |
๋ช ๋ น์ด ๋์๋ง ํ์ |
๋ณ์นญ: new
๊ฐ --with ๊ฐ์ ํด๋น ์ปดํฌ๋ํธ์ ๋ํ ์คํํฐ ํ์ผ์ ์ถ๊ฐํ์ฌ ํธ์งํ ์ค๋น๊ฐ ๋ฉ๋๋ค:
| ์ปดํฌ๋ํธ | ์ค์บํด๋ํ๋ ๊ฒ |
|---|---|
skills |
๊ธฐ๋ณธ skill๊ณผ ํจ๊ป ์ถ๊ฐ ๋ค์์คํ์ด์ค <name>:example skill |
agents |
agents/ subagent ์ ์ |
hooks |
์ํ ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ์๋ hooks/hooks.json |
mcp |
HTTP ๋ฐ stdio ์๋ฒ ์์๊ฐ ์๋ .mcp.json |
lsp |
์ธ์ด ์๋ฒ ์์๊ฐ ์๋ .lsp.json |
output-style |
ํ๋ฌ๊ทธ์ธ์ด ํ์ฑํ๋ ๋์ ์๋์ผ๋ก ์ ์ฉ๋๋ output-styles/<name>.md |
channel |
MCP ๊ธฐ๋ฐ channel: stdio ์๋ฒ (server.ts), ํด๋น .mcp.json ๋ฐ package.json |
์ค์บํด๋๋ ํ๋ฌ๊ทธ์ธ์ ๋ง์ผํ๋ ์ด์ค๊ฐ ์๋ @skills-dir ์์ค๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ด๋ฆฌ์๋ ๊ด๋ฆฌ๋๋ ์ค์ ์์ strictKnownMarketplaces๋ก ์ด ์์ค๋ฅผ ์ฐจ๋จํ๊ฑฐ๋ blockedMarketplaces์ {"source": "skills-dir"}์ ์ถ๊ฐํ ์ ์์ต๋๋ค. ์ฐจ๋จ๋๋ฉด plugin init์ ์์ฑํ๊ธฐ ์ ์ ์คํจํฉ๋๋ค.
์์:
# ์ต์ ํ๋ฌ๊ทธ์ธ ์ค์บํด๋
claude plugin init my-helper
# skill ๋ฐ hook ํด๋๋ก ์ค์บํด๋
claude plugin init my-helper --with skills hooks
# ๊ธฐ์กด ์ค์บํด๋ ๋ฎ์ด์ฐ๊ธฐ
claude plugin init my-helper --force
plugin install
์ฌ์ฉ ๊ฐ๋ฅํ ๋ง์ผํ๋ ์ด์ค์์ ํ๋ฌ๊ทธ์ธ์ ์ค์นํฉ๋๋ค.
claude plugin install <plugin> [options]
์ธ์:
<plugin>: ํ๋ฌ๊ทธ์ธ ์ด๋ฆ ๋๋ ํน์ ๋ง์ผํ๋ ์ด์ค์ ๊ฒฝ์ฐplugin-name@marketplace-name
์ต์ :
| ์ต์ | ์ค๋ช | ๊ธฐ๋ณธ๊ฐ |
|---|---|---|
-s, --scope <scope> |
์ค์น ๋ฒ์: user, project ๋๋ local |
user |
-h, --help |
๋ช ๋ น์ด ๋์๋ง ํ์ |
๋ฒ์๋ ์ค์น๋ ํ๋ฌ๊ทธ์ธ์ด ์ถ๊ฐ๋๋ ์ค์ ํ์ผ์ ๊ฒฐ์ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด --scope project๋ .claude/settings.json์ enabledPlugins์ ์ฐ๋ฏ๋ก ํ๋ก์ ํธ ์ ์ฅ์๋ฅผ ๋ณต์ ํ๋ ๋ชจ๋ ์ฌ๋์ด ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์์:
# ์ฌ์ฉ์ ๋ฒ์์ ์ค์น (๊ธฐ๋ณธ๊ฐ)
claude plugin install formatter@my-marketplace
# ํ๋ก์ ํธ ๋ฒ์์ ์ค์น (ํ๊ณผ ๊ณต์ )
claude plugin install formatter@my-marketplace --scope project
# ๋ก์ปฌ ๋ฒ์์ ์ค์น (gitignored)
claude plugin install formatter@my-marketplace --scope local
plugin uninstall
์ค์น๋ ํ๋ฌ๊ทธ์ธ์ ์ ๊ฑฐํฉ๋๋ค.
claude plugin uninstall <plugin> [options]
์ธ์:
<plugin>: ํ๋ฌ๊ทธ์ธ ์ด๋ฆ ๋๋plugin-name@marketplace-name
์ต์ :
| ์ต์ | ์ค๋ช | ๊ธฐ๋ณธ๊ฐ |
|---|---|---|
-s, --scope <scope> |
๋ฒ์์์ ์ ๊ฑฐ: user, project ๋๋ local |
user |
--keep-data |
ํ๋ฌ๊ทธ์ธ์ ์๊ตฌ ๋ฐ์ดํฐ ๋๋ ํ ๋ฆฌ ์ ์ง | |
--prune |
๋ค๋ฅธ ํ๋ฌ๊ทธ์ธ์ด ํ์๋ก ํ์ง ์๋ ์๋ ์ค์น๋ ์ข ์์ฑ๋ ์ ๊ฑฐํฉ๋๋ค. plugin prune ์ฐธ์กฐ | |
-y, --yes |
--prune ํ์ธ ํ๋กฌํํธ ๊ฑด๋๋ฐ๊ธฐ. stdin์ด TTY๊ฐ ์๋ ๋ ํ์ |
|
-h, --help |
๋ช ๋ น์ด ๋์๋ง ํ์ |
๋ณ์นญ: remove, rm
๊ธฐ๋ณธ์ ์ผ๋ก ๋ง์ง๋ง ๋จ์ ๋ฒ์์์ ์ ๊ฑฐํ๋ฉด ํ๋ฌ๊ทธ์ธ์ ${CLAUDE_PLUGIN_DATA} ๋๋ ํ ๋ฆฌ๋ ์ญ์ ๋ฉ๋๋ค. ์ ๋ฒ์ ํ
์คํธ ํ ์ฌ์ค์นํ ๋์ ๊ฐ์ด ์ ์งํ๋ ค๋ฉด --keep-data๋ฅผ ์ฌ์ฉํ์ธ์.
plugin prune
๋ ์ด์ ์ค์น๋ ํ๋ฌ๊ทธ์ธ์์ ํ์๋ก ํ์ง ์๋ ์๋ ์ค์น๋ ํ๋ฌ๊ทธ์ธ ์ข
์์ฑ์ ์ ๊ฑฐํฉ๋๋ค. Claude Code๊ฐ ๋ค๋ฅธ ํ๋ฌ๊ทธ์ธ์ dependencies ํ๋๋ฅผ ๋ง์กฑํ๊ธฐ ์ํด ๊ฐ์ ธ์จ ์ข
์์ฑ์ ์ ๊ฑฐ๋๋ฉฐ, ์ง์ ์ค์นํ ํ๋ฌ๊ทธ์ธ์ ์ ๋ ๊ฑด๋๋ฆฌ์ง ์์ต๋๋ค.
claude plugin prune [options]
์ต์ :
| ์ต์ | ์ค๋ช | ๊ธฐ๋ณธ๊ฐ |
|---|---|---|
-s, --scope <scope> |
๋ฒ์์์ ์ ๋ฆฌ: user, project ๋๋ local |
user |
--dry-run |
์ ๊ฑฐ๋ ํญ๋ชฉ์ ๋์ดํ๋ ์ค์ ๋ก ์ ๊ฑฐํ์ง ์์ | |
-y, --yes |
ํ์ธ ํ๋กฌํํธ ๊ฑด๋๋ฐ๊ธฐ. stdin์ด TTY๊ฐ ์๋ ๋ ํ์ | |
-h, --help |
๋ช ๋ น์ด ๋์๋ง ํ์ |
๋ณ์นญ: autoremove
๋ช
๋ น์ด๋ ๊ณ ์ ์ข
์์ฑ์ ๋์ดํ๊ณ ์ ๊ฑฐํ๊ธฐ ์ ์ ํ์ธ์ ์์ฒญํฉ๋๋ค. ํ๋ฌ๊ทธ์ธ์ ์ ๊ฑฐํ๊ณ ํ ๋จ๊ณ์์ ์ข
์์ฑ์ ์ ๋ฆฌํ๋ ค๋ฉด claude plugin uninstall <plugin> --prune์ ์คํํ์ธ์.
claude plugin prune์ Claude Code v2.1.121 ์ด์์ด ํ์ํฉ๋๋ค.
plugin enable
๋นํ์ฑํ๋ ํ๋ฌ๊ทธ์ธ์ ํ์ฑํํฉ๋๋ค. ํ๋ฌ๊ทธ์ธ์ด ์ข ์์ฑ์ ์ ์ธํ๋ฉด Claude Code๋ ๋์ผํ ๋ฒ์์์ ์ด๋ค์ ์ ์ด์ ์ผ๋ก ํ์ฑํํ๋ฉฐ, ์ข ์์ฑ์ด ์ค์น๋์ง ์์ผ๋ฉด ๋ช ๋ น์ด๊ฐ ์คํจํฉ๋๋ค.
claude plugin enable <plugin> [options]
์ธ์:
<plugin>: ํ๋ฌ๊ทธ์ธ ์ด๋ฆ ๋๋plugin-name@marketplace-name
์ต์ :
| ์ต์ | ์ค๋ช | ๊ธฐ๋ณธ๊ฐ |
|---|---|---|
-s, --scope <scope> |
ํ์ฑํํ ๋ฒ์: user, project ๋๋ local |
user |
-h, --help |
๋ช ๋ น์ด ๋์๋ง ํ์ |
plugin disable
ํ๋ฌ๊ทธ์ธ์ ์ ๊ฑฐํ์ง ์๊ณ ๋นํ์ฑํํฉ๋๋ค. ๋ค๋ฅธ ํ์ฑํ๋ ํ๋ฌ๊ทธ์ธ์ด ๋์์ ์ข ์๋์ด ์์ผ๋ฉด ์คํจํฉ๋๋ค. ์ค๋ฅ ๋ฉ์์ง์๋ ๋จผ์ ๋ชจ๋ ์ข ์ ํ๋ฌ๊ทธ์ธ์ ๋นํ์ฑํํ๋ ์ฐ์ ๋ช ๋ น์ด๊ฐ ํฌํจ๋ฉ๋๋ค.
claude plugin disable <plugin> [options]
์ธ์:
<plugin>: ํ๋ฌ๊ทธ์ธ ์ด๋ฆ ๋๋plugin-name@marketplace-name
์ต์ :
| ์ต์ | ์ค๋ช | ๊ธฐ๋ณธ๊ฐ |
|---|---|---|
-s, --scope <scope> |
๋นํ์ฑํํ ๋ฒ์: user, project ๋๋ local |
user |
-h, --help |
๋ช ๋ น์ด ๋์๋ง ํ์ |
plugin update
ํ๋ฌ๊ทธ์ธ์ ์ต์ ๋ฒ์ ์ผ๋ก ์ ๋ฐ์ดํธํฉ๋๋ค.
claude plugin update <plugin> [options]
์ธ์:
<plugin>: ํ๋ฌ๊ทธ์ธ ์ด๋ฆ ๋๋plugin-name@marketplace-name
์ต์ :
| ์ต์ | ์ค๋ช | ๊ธฐ๋ณธ๊ฐ |
|---|---|---|
-s, --scope <scope> |
์
๋ฐ์ดํธํ ๋ฒ์: user, project, local ๋๋ managed |
user |
-h, --help |
๋ช ๋ น์ด ๋์๋ง ํ์ |
plugin list
์ค์น๋ ํ๋ฌ๊ทธ์ธ์ ๋ฒ์ , ์์ค ๋ง์ผํ๋ ์ด์ค ๋ฐ ํ์ฑํ ์ํ์ ํจ๊ป ๋์ดํฉ๋๋ค.
claude plugin list [options]
์ต์ :
| ์ต์ | ์ค๋ช | ๊ธฐ๋ณธ๊ฐ |
|---|---|---|
--json |
JSON์ผ๋ก ์ถ๋ ฅ | |
--available |
๋ง์ผํ๋ ์ด์ค์์ ์ฌ์ฉ ๊ฐ๋ฅํ ํ๋ฌ๊ทธ์ธ ํฌํจ. --json ํ์ |
|
-h, --help |
๋ช ๋ น์ด ๋์๋ง ํ์ |
plugin details
ํ๋ฌ๊ทธ์ธ์ ์ปดํฌ๋ํธ ์ธ๋ฒคํ ๋ฆฌ ๋ฐ ์์ ํ ํฐ ๋น์ฉ์ ํ์ํฉ๋๋ค. ์ถ๋ ฅ์ ํ๋ฌ๊ทธ์ธ์ด ๊ธฐ์ฌํ๋ ๋ชจ๋ ์ปดํฌ๋ํธ๋ฅผ Skills, Agents, Hooks, MCP ์๋ฒ ๋ฐ LSP ์๋ฒ๋ก ๊ทธ๋ฃนํํ์ฌ ๋์ดํ๋ฉฐ, ๊ฐ ์ธ์
์ ์ถ๊ฐ๋๋ ํ ํฐ ์์ ์ถ์ ์น๋ฅผ ํจ๊ป ํ์ํฉ๋๋ค. Skills ๊ทธ๋ฃน์๋ skills/ ๋ฐ commands/ ํญ๋ชฉ์ด ๋ชจ๋ ํฌํจ๋ฉ๋๋ค.
claude plugin details <name>
์ธ์:
<name>: ํ๋ฌ๊ทธ์ธ ์ด๋ฆ ๋๋plugin-name@marketplace-name
์ต์ :
| ์ต์ | ์ค๋ช | ๊ธฐ๋ณธ๊ฐ |
|---|---|---|
-h, --help |
๋ช ๋ น์ด ๋์๋ง ํ์ |
์ถ๋ ฅ์ ๊ฐ ์ปดํฌ๋ํธ์ ๋ํด ๋ ๊ฐ์ง ๋น์ฉ ์์น๋ฅผ ํ์ํฉ๋๋ค:
- Always-on: ์ปดํฌ๋ํธ๊ฐ ์คํ๋๋์ง ์ฌ๋ถ์ ๊ด๊ณ์์ด ํ๋ฌ๊ทธ์ธ์ ๋ชฉ๋ก ํ ์คํธ(์: ์คํฌ ์ค๋ช , ์์ด์ ํธ ์ค๋ช , ๋ช ๋ น์ด ์ด๋ฆ)์ ์ํด ๋ชจ๋ ์ธ์ ์ ์ถ๊ฐ๋๋ ํ ํฐ์ ๋๋ค.
- On-invoke: ์ปดํฌ๋ํธ๊ฐ ์คํ๋ ๋ ๋น์ฉ์ด ๋๋ ํ ํฐ์ ๋๋ค. ์ผ๋ฐ์ ์ธ ์ธ์ ์์๋ ์ปดํฌ๋ํธ์ ์ผ๋ถ๋ง ํธ์ถ๋๋ฏ๋ก ํ๋ฌ๊ทธ์ธ ์ ์ฒด๊ฐ ์๋ ์ปดํฌ๋ํธ๋ณ๋ก ํ์๋ฉ๋๋ค.
๋ค์ ์์๋ ๋ ๊ฐ์ ์คํฌ์ด ์๋ ํ๋ฌ๊ทธ์ธ์ ์ถ๋ ฅ ๋ชจ์ต์ ๋ณด์ฌ์ค๋๋ค:
dependency-guard 1.2.0
Dependency analysis for Claude Code sessions
Source: dependency-guard@example-marketplace
Component inventory
Skills (2) scan-dependencies, review-changes
Agents (0)
Hooks (1) (harness-only โ no model context cost)
MCP servers (0)
LSP servers (0)
Projected token cost
Always-on: ~180 tok added to every session
Per-component (rounded)
component always-on on-invoke
scan-dependencies ~100 ~2400
review-changes ~80 ~1800
On-invoke cost is paid each time a skill or agent fires.
Token counts are estimates and may differ from actual usage.
Always-on ํฉ๊ณ๋ ํ์ฑ ๋ชจ๋ธ์ ๋ํ count_tokens API๋ฅผ ํตํด ๊ณ์ฐ๋ฉ๋๋ค. ์ปดํฌ๋ํธ๋ณ ์์น๋ ํด๋น ํฉ๊ณ์์ ๋น๋ก์ ์ผ๋ก ์กฐ์ ๋ฉ๋๋ค. API์ ์ฐ๊ฒฐํ ์ ์์ผ๋ฉด ๋ช
๋ น์ด๋ ๋ฌธ์ ๊ธฐ๋ฐ ์ถ์ ์ผ๋ก ํด๋ฐฑ๋ฉ๋๋ค.
plugin tag
ํ์ฌ ๋๋ ํ ๋ฆฌ์ ํ๋ฌ๊ทธ์ธ์ ๋ํ ๋ฆด๋ฆฌ์ค git ํ๊ทธ๋ฅผ ์์ฑํฉ๋๋ค. ํ๋ฌ๊ทธ์ธ์ ํด๋ ๋ด์์ ์คํํ์ธ์. ํ๋ฌ๊ทธ์ธ ๋ฆด๋ฆฌ์ค ํ๊ทธ ์ง์ ์ ์ฐธ์กฐํ์ธ์.
claude plugin tag [options]
์ต์ :
| ์ต์ | ์ค๋ช | ๊ธฐ๋ณธ๊ฐ |
|---|---|---|
--push |
ํ๊ทธ๋ฅผ ์์ฑํ ํ ์๊ฒฉ์ผ๋ก ํธ์ | |
--dry-run |
ํ๊ทธ๋ฅผ ์์ฑํ์ง ์๊ณ ํ๊ทธ ์ง์ ๋ ๋ด์ฉ ์ถ๋ ฅ | |
-f, --force |
์์ ํธ๋ฆฌ๊ฐ ๋ํฐํ๊ฑฐ๋ ํ๊ทธ๊ฐ ์ด๋ฏธ ์กด์ฌํด๋ ํ๊ทธ ์์ฑ | |
-h, --help |
๋ช ๋ น์ด ๋์๋ง ํ์ |
๋๋ฒ๊น ๋ฐ ๊ฐ๋ฐ ๋๊ตฌ
๋๋ฒ๊น ๋ช ๋ น์ด
claude --debug๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ฌ๊ทธ์ธ ๋ก๋ฉ ์ธ๋ถ ์ ๋ณด๋ฅผ ํ์ธํ์ธ์:
์ด๋ ๋ค์์ ํ์ํฉ๋๋ค:
- ๋ก๋๋๋ ํ๋ฌ๊ทธ์ธ
- ํ๋ฌ๊ทธ์ธ ๋งค๋ํ์คํธ์ ์ค๋ฅ
- Skill, agent ๋ฐ hook ๋ฑ๋ก
- MCP ์๋ฒ ์ด๊ธฐํ
์ผ๋ฐ์ ์ธ ๋ฌธ์
| ๋ฌธ์ | ์์ธ | ํด๊ฒฐ์ฑ |
|---|---|---|
| ํ๋ฌ๊ทธ์ธ์ด ๋ก๋๋์ง ์์ | ์๋ชป๋ plugin.json |
claude plugin validate ๋๋ /plugin validate๋ฅผ ์คํํ์ฌ plugin.json, skill/agent/command frontmatter ๋ฐ hooks/hooks.json์ ๊ตฌ๋ฌธ ๋ฐ ์คํค๋ง ์ค๋ฅ ํ์ธ |
| Skills๊ฐ ๋ํ๋์ง ์์ | ์๋ชป๋ ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ | skills/ ๋๋ commands/๊ฐ ํ๋ฌ๊ทธ์ธ ๋ฃจํธ์ ์๋์ง ํ์ธ, .claude-plugin/ ๋ด๋ถ๊ฐ ์๋ |
| Hooks๊ฐ ์คํ๋์ง ์์ | ์คํฌ๋ฆฝํธ๊ฐ ์คํ ๊ฐ๋ฅํ์ง ์์ | chmod +x script.sh ์คํ |
| MCP ์๋ฒ ์คํจ | ${CLAUDE_PLUGIN_ROOT} ๋๋ฝ |
๋ชจ๋ ํ๋ฌ๊ทธ์ธ ๊ฒฝ๋ก์ ๋ณ์ ์ฌ์ฉ |
| ๊ฒฝ๋ก ์ค๋ฅ | ์ ๋ ๊ฒฝ๋ก ์ฌ์ฉ๋จ | ๋ชจ๋ ๊ฒฝ๋ก๋ ์๋์ ์ด์ด์ผ ํ๋ฉฐ ./๋ก ์์ํด์ผ ํจ |
LSP Executable not found in $PATH |
์ธ์ด ์๋ฒ๊ฐ ์ค์น๋์ง ์์ | ๋ฐ์ด๋๋ฆฌ ์ค์น (์: npm install -g typescript-language-server typescript) |
์์ ์ค๋ฅ ๋ฉ์์ง
๋งค๋ํ์คํธ ๊ฒ์ฆ ์ค๋ฅ:
Invalid JSON syntax: Unexpected token } in JSON at position 142: ๋๋ฝ๋ ์ผํ, ์ถ๊ฐ ์ผํ ๋๋ ๋ฐ์ดํ ์๋ ๋ฌธ์์ด ํ์ธPlugin has an invalid manifest file at .claude-plugin/plugin.json. Validation errors: name: Required: ํ์ ํ๋๊ฐ ๋๋ฝ๋จPlugin has a corrupt manifest file at .claude-plugin/plugin.json. JSON parse error: ...: JSON ๊ตฌ๋ฌธ ์ค๋ฅ
ํ๋ฌ๊ทธ์ธ ๋ก๋ฉ ์ค๋ฅ:
Warning: No commands found in plugin my-plugin custom directory: ./cmds. Expected .md files or SKILL.md in subdirectories.: ๋ช ๋ น์ด ๊ฒฝ๋ก๊ฐ ์กด์ฌํ์ง๋ง ์ ํจํ ๋ช ๋ น์ด ํ์ผ์ด ์์Plugin directory not found at path: ./plugins/my-plugin. Check that the marketplace entry has the correct path.: marketplace.json์source๊ฒฝ๋ก๊ฐ ์กด์ฌํ์ง ์๋ ๋๋ ํ ๋ฆฌ๋ฅผ ๊ฐ๋ฆฌํดPlugin my-plugin has conflicting manifests: both plugin.json and marketplace entry specify components.: ์ค๋ณต ์ปดํฌ๋ํธ ์ ์ ์ ๊ฑฐ ๋๋ marketplace ํญ๋ชฉ์์strict: false์ ๊ฑฐ
Hook ๋ฌธ์ ํด๊ฒฐ
Hook ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋์ง ์์:
- ์คํฌ๋ฆฝํธ๊ฐ ์คํ ๊ฐ๋ฅํ์ง ํ์ธ:
chmod +x ./scripts/your-script.sh - shebang ๋ผ์ธ ํ์ธ: ์ฒซ ๋ฒ์งธ ์ค์
#!/bin/bash๋๋#!/usr/bin/env bash์ฌ์ผ ํจ - ๊ฒฝ๋ก๊ฐ
${CLAUDE_PLUGIN_ROOT}์ฌ์ฉํ๋์ง ํ์ธ:"command": "\"${CLAUDE_PLUGIN_ROOT}\"/scripts/your-script.sh" - ์คํฌ๋ฆฝํธ๋ฅผ ์๋์ผ๋ก ํ
์คํธ:
./scripts/your-script.sh
Hook์ด ์์ ์ด๋ฒคํธ์์ ํธ๋ฆฌ๊ฑฐ๋์ง ์์:
- ์ด๋ฒคํธ ์ด๋ฆ์ด ์ฌ๋ฐ๋ฅธ์ง ํ์ธ (๋์๋ฌธ์ ๊ตฌ๋ถ):
PostToolUse,postToolUse์๋ - ๋งค์ฒ ํจํด์ด ๋๊ตฌ์ ์ผ์นํ๋์ง ํ์ธ: ํ์ผ ์์
์ ๊ฒฝ์ฐ
"matcher": "Write|Edit" - Hook ์ ํ์ด ์ ํจํ์ง ํ์ธ:
command,http,mcp_tool,prompt๋๋agent
MCP ์๋ฒ ๋ฌธ์ ํด๊ฒฐ
์๋ฒ๊ฐ ์์๋์ง ์์:
- ๋ช ๋ น์ด๊ฐ ์กด์ฌํ๊ณ ์คํ ๊ฐ๋ฅํ์ง ํ์ธ
- ๋ชจ๋ ๊ฒฝ๋ก๊ฐ
${CLAUDE_PLUGIN_ROOT}๋ณ์๋ฅผ ์ฌ์ฉํ๋์ง ํ์ธ - MCP ์๋ฒ ๋ก๊ทธ ํ์ธ:
claude --debug๋ ์ด๊ธฐํ ์ค๋ฅ๋ฅผ ํ์ํฉ๋๋ค - Claude Code ์ธ๋ถ์์ ์๋ฒ๋ฅผ ์๋์ผ๋ก ํ ์คํธ
์๋ฒ ๋๊ตฌ๊ฐ ๋ํ๋์ง ์์:
- ์๋ฒ๊ฐ
.mcp.json๋๋plugin.json์ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌ์ฑ๋์๋์ง ํ์ธ - ์๋ฒ๊ฐ MCP ํ๋กํ ์ฝ์ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌํํ๋์ง ํ์ธ
- ๋๋ฒ๊ทธ ์ถ๋ ฅ์์ ์ฐ๊ฒฐ ์๊ฐ ์ด๊ณผ ํ์ธ
๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ ์ค์
์ฆ์: ํ๋ฌ๊ทธ์ธ์ด ๋ก๋๋์ง๋ง ์ปดํฌ๋ํธ (skills, agents, hooks)๊ฐ ๋๋ฝ๋จ.
์ฌ๋ฐ๋ฅธ ๊ตฌ์กฐ: ์ปดํฌ๋ํธ๋ ํ๋ฌ๊ทธ์ธ ๋ฃจํธ์ ์์ด์ผ ํ๋ฉฐ .claude-plugin/ ๋ด๋ถ๊ฐ ์๋๋๋ค. plugin.json๋ง .claude-plugin/์ ์ํฉ๋๋ค.
my-plugin/
โโโ .claude-plugin/
โ โโโ plugin.json โ ๋งค๋ํ์คํธ๋ง ์ฌ๊ธฐ
โโโ commands/ โ ๋ฃจํธ ์์ค
โโโ agents/ โ ๋ฃจํธ ์์ค
โโโ hooks/ โ ๋ฃจํธ ์์ค
์ปดํฌ๋ํธ๊ฐ .claude-plugin/ ๋ด๋ถ์ ์์ผ๋ฉด ํ๋ฌ๊ทธ์ธ ๋ฃจํธ๋ก ์ด๋ํ์ธ์.
๋๋ฒ๊ทธ ์ฒดํฌ๋ฆฌ์คํธ:
claude --debug๋ฅผ ์คํํ๊ณ "loading plugin" ๋ฉ์์ง๋ฅผ ์ฐพ์ผ์ธ์- ๊ฐ ์ปดํฌ๋ํธ ๋๋ ํ ๋ฆฌ๊ฐ ๋๋ฒ๊ทธ ์ถ๋ ฅ์ ๋์ด๋๋์ง ํ์ธ
- ํ์ผ ๊ถํ์ด ํ๋ฌ๊ทธ์ธ ํ์ผ ์ฝ๊ธฐ๋ฅผ ํ์ฉํ๋์ง ํ์ธ
๋ฐฐํฌ ๋ฐ ๋ฒ์ ๊ด๋ฆฌ ์ฐธ์กฐ
๋ฒ์ ๊ด๋ฆฌ
Claude Code๋ ํ๋ฌ๊ทธ์ธ์ ๋ฒ์ ์ ์บ์ ํค๋ก ์ฌ์ฉํ์ฌ ์
๋ฐ์ดํธ๋ฅผ ์ฌ์ฉํ ์ ์๋์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. /plugin update๋ฅผ ์คํํ๊ฑฐ๋ ์๋ ์
๋ฐ์ดํธ๊ฐ ์คํ๋๋ฉด Claude Code๋ ํ์ฌ ๋ฒ์ ์ ๊ณ์ฐํ๊ณ ์ด๋ฏธ ์ค์น๋ ๋ฒ์ ๊ณผ ์ผ์นํ๋ฉด ์
๋ฐ์ดํธ๋ฅผ ๊ฑด๋๋๋๋ค.
๋ฒ์ ์ ๋ค์ ์ค ์ค์ ๋ ์ฒซ ๋ฒ์งธ ํญ๋ชฉ์์ ํ์ธ๋ฉ๋๋ค:
- ํ๋ฌ๊ทธ์ธ์
plugin.json์ ์๋versionํ๋ marketplace.json์ ํ๋ฌ๊ทธ์ธ ๋ง์ผํ๋ ์ด์ค ํญ๋ชฉ์ ์๋versionํ๋- git ํธ์คํ
๋ง์ผํ๋ ์ด์ค์
github,url,git-subdir๋ฐ ์๋ ๊ฒฝ๋ก ์์ค์ ๋ํ ํ๋ฌ๊ทธ์ธ ์์ค์ git ์ปค๋ฐ SHA - git ์ ์ฅ์ ๋ด์ ์์ง ์์
npm์์ค ๋๋ ๋ก์ปฌ ๋๋ ํ ๋ฆฌ์ ๊ฒฝ์ฐunknown
์ด๋ ํ๋ฌ๊ทธ์ธ์ ๋ฒ์ ๊ด๋ฆฌํ๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค:
| ์ ๊ทผ ๋ฐฉ์ | ๋ฐฉ๋ฒ | ์ ๋ฐ์ดํธ ๋์ | ์ต์ ์ฌ์ฉ |
|---|---|---|---|
| ๋ช ์์ ๋ฒ์ | plugin.json์์ "version": "2.1.0"์ผ๋ก ์ค์ |
์ฌ์ฉ์๋ ์ด ํ๋๋ฅผ ๋ฒํํ ๋๋ง ์
๋ฐ์ดํธ๋ฅผ ๋ฐ์ต๋๋ค. ์ด๋ฅผ ๋ฒํํ์ง ์๊ณ ์ ์ปค๋ฐ์ ํธ์ํ๋ฉด ํจ๊ณผ๊ฐ ์์ผ๋ฉฐ /plugin update๋ "์ด๋ฏธ ์ต์ ๋ฒ์ ์
๋๋ค"๋ฅผ ๋ณด๊ณ ํฉ๋๋ค. |
์์ ์ ์ธ ๋ฆด๋ฆฌ์ค ์ฃผ๊ธฐ๊ฐ ์๋ ๊ฒ์๋ ํ๋ฌ๊ทธ์ธ |
| ์ปค๋ฐ-SHA ๋ฒ์ | plugin.json ๋ฐ ๋ง์ผํ๋ ์ด์ค ํญ๋ชฉ ๋ชจ๋์์ version ์๋ต |
์ฌ์ฉ์๋ ํ๋ฌ๊ทธ์ธ์ git ์์ค์ ๋ํ ๋ชจ๋ ์ ์ปค๋ฐ์์ ์ ๋ฐ์ดํธ๋ฅผ ๋ฐ์ต๋๋ค | ํ๋ฐํ ๊ฐ๋ฐ ์ค์ธ ๋ด๋ถ ๋๋ ํ ํ๋ฌ๊ทธ์ธ |
plugin.json์์ version์ ์ค์ ํ๋ฉด ์ฌ์ฉ์๊ฐ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐ๊ธฐ๋ฅผ ์ํ ๋๋ง๋ค ์ด๋ฅผ ๋ฒํํด์ผ ํฉ๋๋ค. ์ ์ปค๋ฐ์ ํธ์ํ๋ ๊ฒ๋ง์ผ๋ก๋ ์ถฉ๋ถํ์ง ์์ต๋๋ค. Claude Code๊ฐ ๋์ผํ ๋ฒ์ ๋ฌธ์์ด์ ๋ณด๊ณ ์บ์๋ ์ฌ๋ณธ์ ์ ์งํ๊ธฐ ๋๋ฌธ์
๋๋ค. ๋น ๋ฅด๊ฒ ๋ฐ๋ณตํ๋ ๊ฒฝ์ฐ version์ ์ค์ ํ์ง ์์ ์ํ๋ก ๋์ด ๋์ git ์ปค๋ฐ SHA๊ฐ ์ฌ์ฉ๋๋๋ก ํ์ธ์.
๋ช
์์ ๋ฒ์ ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์๋ฏธ ์๋ ๋ฒ์ ๊ด๋ฆฌ(MAJOR.MINOR.PATCH)๋ฅผ ๋ฐ๋ฅด์ธ์: ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ๊ฒฝ์ฐ MAJOR๋ฅผ ๋ฒํํ๊ณ , ์๋ก์ด ๊ธฐ๋ฅ์ ๊ฒฝ์ฐ MINOR๋ฅผ ๋ฒํํ๊ณ , ๋ฒ๊ทธ ์์ ์ ๊ฒฝ์ฐ PATCH๋ฅผ ๋ฒํํ์ธ์. CHANGELOG.md์์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฌธ์ํํ์ธ์.
์ฐธ๊ณ ํญ๋ชฉ
- ํ๋ฌ๊ทธ์ธ - ํํ ๋ฆฌ์ผ ๋ฐ ์ค์ ์ฌ์ฉ
- ํ๋ฌ๊ทธ์ธ ๋ง์ผํ๋ ์ด์ค - ๋ง์ผํ๋ ์ด์ค ์์ฑ ๋ฐ ๊ด๋ฆฌ
- Skills - Skill ๊ฐ๋ฐ ์ธ๋ถ ์ ๋ณด
- Subagents - Agent ๊ตฌ์ฑ ๋ฐ ๊ธฐ๋ฅ
- Hooks - ์ด๋ฒคํธ ์ฒ๋ฆฌ ๋ฐ ์๋ํ
- MCP - ์ธ๋ถ ๋๊ตฌ ํตํฉ
- ์ค์ - ํ๋ฌ๊ทธ์ธ์ ๊ตฌ์ฑ ์ต์