# Claude Code Custom Command

항상 사용하는 prompt가 있다면 slash command로 만들어서 사용하자.

## 기본 slash command

* <https://code.claude.com/docs/en/slash-commands>

## 커스텀 slash command 만들기

### 파일 위치

* 전체 적용 : \~/.claude/commands
* Project 별 적용 : 프로젝트 루트의 `.claude/commands`

### 커맨드 만들기

슬래시 이후에 쓸 커맨드 이름으로 마크다운 파일을 만든다.

```sh
mkdir -p ~/.claude/commands
echo "Review this code for security vulnerabilities:" > ~/.claude/commands/security-review.md
```

완료

사용해보자

/를 입력하면 커맨드가 보이고 이걸 선택하면 프롬프트가 실행된다.

![alt text](https://3379277180-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MaoWGMVdC3ztoOAzHPq%2Fuploads%2Fgit-blob-5f3c41bc6adc77554faba01ebd1b8812fdb9b9c6%2Fimage.png?alt=media)

## 사용 방법

```sh
/command-name arg1 arg2
```

## 실전예제

### git commit / push command

git commit message를 만들어주고 commit / push 를 해보자.

```sh
vi ~/.claude/commands/git-commit.md
```

```markdown
---
title: git add, commit, push
# allowed-tools: Bash(git add:*), Bash(git status:*), Bash(git commit:*)
description: Create a git commit
model: haiku
---

## git commit message를 만들어주고 commit / push

git에 commit할 commit message를 만든다.

이제 commit 및 push를 하자.

git add --all && git commit -m "$message" && git push

$message에 적당한 메세지를 추가해줘
```

핵심은 프폼프트를 적당히 만들면되고 frontmatter에 model이나 allowed-tools를 지정할수 있다.

![alt text](https://3379277180-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MaoWGMVdC3ztoOAzHPq%2Fuploads%2Fgit-blob-6cc098fb2dd5ef33e461d2b1994e8315ad2f3f4a%2Fimage-1.png?alt=media)

command가 파일명으로 나오는것을 알수있다.

![alt text](https://3379277180-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MaoWGMVdC3ztoOAzHPq%2Fuploads%2Fgit-blob-9dcfff58110f959c78ee399180f19871af19c37b%2Fimage-2.png?alt=media)

한글로 하고싶으면 언어를 고정하자.

```prompt
vi ~/.claude/commands/git-commit.md

$message에 적당한 메세지를 추가해줘. 한글을 써줘
```

/git 를 입력하면 아래 선택할 창이 보이는데 git-commit이 선택되잇을것이다 엔터를 치면 바로 실행이되고 탭을 치면 커맨드완성후 추가 프롬프트를 전달할수 있다.

![alt text](https://3379277180-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MaoWGMVdC3ztoOAzHPq%2Fuploads%2Fgit-blob-f1e12b4d737a1f366b0d5af9654374fe23996402%2Fimage-3.png?alt=media)

### arguments 사용하기

`$ARGUMENTS` 변수를 사용하여 커맨드에 인자를 전달할 수 있다.

```sh
echo 'Fix issue #$ARGUMENTS following our coding standards' > fix-issue.md
```

이런 마크다운을 만든후 다음처럼 사용한다.

```promt
/fix-issue 123
```

그러면 프롬프트에 `Fix issue #123 following our coding standards`가 전달된다.

### 개별 arguments with $1, $2

`$1`, `$2` 등을 사용하여 개별 인자에 접근할 수 있다.

```sh
echo 'Review PR #$1 with priority $2 and assign to $3' > .claude/commands/review-pr.md
```

```prompt
/review-pr 456 high alice
```

순차적으로 인자가 전달된다.

### bash 사용

슬래시 명령이 실행되기 전에 !접두사를 사용하여 bash 명령을 실행합니다.

allowed-tools frontmatter를 사용하여 특정 bash 명령을 허용할 수도 있습니다.

```
---
allowed-tools: Bash(git add:*), Bash(git status:*), Bash(git commit:*)
description: Create a git commit
---

## Context

- Current git status: !`git status`
- Current git diff (staged and unstaged changes): !`git diff HEAD`
- Current branch: !`git branch --show-current`
- Recent commits: !`git log --oneline -10`

## Your task

Based on the above changes, create a single git commit.
```

![alt text](https://3379277180-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MaoWGMVdC3ztoOAzHPq%2Fuploads%2Fgit-blob-3b39d2d466966b49d751f02a8d467f680d9a70ff%2Fimage-4.png?alt=media)

### frontmatter 사용하기

frontmatter를 사용하여 slash command의 동작을 제어할 수 있습니다.

| 속성                       | 설명                                                                                                      | 기본값                |
| ------------------------ | ------------------------------------------------------------------------------------------------------- | ------------------ |
| allowed-tools            | 커맨드에서 사용할 수 있는 도구 목록                                                                                    | 대화에서 상속            |
| argument-hint            | 슬래시 커맨드에 대한 인자 힌트. 예: `argument-hint: add [tagId] \| remove [tagId] \| list`. 사용자가 슬래시 커맨드를 자동완성할 때 표시됨 | None               |
| description              | 커맨드에 대한 간단한 설명                                                                                          | prompt의 첫 번째 줄을 사용 |
| model                    | 특정 모델 문자열 (Models overview 참조)                                                                          | 대화에서 상속            |
| disable-model-invocation | SlashCommand 도구가 이 커맨드를 호출하는 것을 방지할지 여부                                                                 | false              |

```prompt
---
allowed-tools: Bash(git add:*), Bash(git status:*), Bash(git commit:*)
argument-hint: [message]
description: Create a git commit
model: haiku
---

Create a git commit with message: $ARGUMENTS
```

### Example using positional arguments:

```prompt
---
argument-hint: [pr-number] [priority] [assignee]
description: Review pull request
---

Review PR #$1 with priority $2 and assign to $3.
Focus on security, performance, and code style.
```

## mcp를 slash command로 사용하기 (MCP 서버가 prompts를 제공할 때)

tool만 제공하면 이게 안됨

```sh
/mcp__<server-name>__<prompt-name> [arguments]
```

보통 자동으로 실행됨.

### 예시

```sh
# 인수 없음
> /mcp__github__list_prs

# 인수 포함
> /mcp__github__pr_review 456
> /mcp__jira__create_issue "Bug title" high
```

## 자동으로 실행됨

Claude가 자동으로 slash command를 실행할 수 있다.

### 자동 실행 조건

* skill의 `description`에 명확한 트리거 키워드 포함
* 대화 문맥과 skill 설명이 매칭될 때

### 자동 실행 예시

```yaml
---
description: Use when explaining how code works or when user asks "how does this work?"
---
```

사용자가 "How does this code work?"라고 물으면, Claude가 자동으로 이 skill을 실행한다.

### 자동 실행 막기

배포나 커밋처럼 부작용이 있는 작업은 자동 실행을 막는 것이 좋다.

frontmatter에 다음을 추가:

```yaml
---
disable-model-invocation: true
---
```

## slash command vs skills

### 슬래시 명령어 (Slash Commands)

**사용 대상:** 빠르고 자주 사용하는 프롬프트

**특징:**

* 간단한 프롬프트 스니펫
* 빠른 미리 알림 또는 템플릿
* 한 파일에 맞는 자주 사용하는 지침

**예시:**

* `/review` → "Review this code for bugs and suggest improvements"
* `/explain` → "Explain this code in simple terms"
* `/optimize` → "Analyze this code for performance issues"

### 스킬 (Skills)

**사용 대상:** 구조가 있는 포괄적인 기능

**특징:**

* 여러 단계가 있는 복잡한 워크플로우
* 스크립트 또는 유틸리티가 필요한 기능
* 여러 파일에 걸쳐 구성된 지식
* 표준화하려는 팀 워크플로우

**예시:**

* 양식 작성 스크립트 및 검증이 있는 PDF 처리 스킬
* 다양한 데이터 유형에 대한 참조 문서가 있는 데이터 분석 스킬
* 스타일 가이드 및 템플릿이 있는 문서 스킬

### 주요 차이점

| 측면      | 슬래시 명령어           | 에이전트 스킬                 |
| ------- | ----------------- | ----------------------- |
| **복잡성** | 간단한 프롬프트          | 복잡한 기능                  |
| **구조**  | 단일 .md 파일         | SKILL.md + 리소스가 있는 디렉토리 |
| **발견**  | 명시적 호출 (/command) | 자동 (컨텍스트 기반)            |
| **파일**  | 한 파일만             | 여러 파일, 스크립트, 템플릿        |

### 예제 비교

#### 슬래시 명령어로

**파일 구조:**

```
.claude/commands/review.md
```

**내용:**

```markdown
Review this code for:

- Security vulnerabilities
- Performance issues
- Code style violations
```

**사용법:** `/review` (수동 호출)

#### skill

**파일 구조:**

```
.claude/skills/code-review/
├── SKILL.md (overview and workflows)
├── SECURITY.md (security checklist)
├── PERFORMANCE.md (performance patterns)
├── STYLE.md (style guide reference)
└── scripts/
    └── run-linters.sh
```

**사용법:** "Can you review this code?" (자동 발견)

**결론:** 스킬은 더 풍부한 컨텍스트, 검증 스크립트 및 구성된 참조 자료를 제공합니다.

### 나의 결론

나는 아직 잘 구분이 안됨. /command는 항상 내가 필요할때 강제로 요청 claude가 자동으로 이걸 사용하면 skills와 비슷한거같음.

둘다 비슷한거같음.
