본문으로 건너뛰기

© 2026 Molayo

Qiita헤드라인2026. 05. 29. 21:47

Claude Code, Skills 통합 이후 슬래시 명령어(Slash Commands)의 함정

요약

Claude Code의 커스텀 슬래시 명령어가 Skills로 통합되면서 발생하는 자동 호출 문제를 다룹니다. 명시적 호출을 의도한 명령어라도 description이 입력과 매치되면 자동으로 실행될 수 있으므로 주의가 필요합니다.

핵심 포인트

  • 커스텀 슬래시 명령어와 Skills 통합 후 자동 호출 현상 발생
  • description 내용이 사용자 입력과 일치하면 명령어가 자동 실행됨
  • 자동 호출을 방지하려면 'disable-model-invocation: true' 옵션 사용 필수
  • 명시적 호출용 명령어는 컨텍스트 절약을 위해 옵션 설정을 권장

여러분은 Claude Code의 커스텀 슬래시 명령어(custom slash commands)와 Skills를 어떻게 구분해서 사용하고 계신가요?

올해 초에 "커스텀 슬래시 명령어는 Skills로 통합되었습니다"라는 안내가 있었기 때문에, 이미 커스텀 슬래시 명령어를 사용하지 않는 분들도 많을 것이라 생각합니다. 하지만 폴더가 나뉘어 있어 관리하기 편한 측면도 있었기에, 저는 다음과 같은 방식으로 계속 사용해 왔습니다.

  • 명시적으로만 호출하고 싶은 것
    → 커스텀 슬래시 명령어 (custom slash commands)
    .claude/commands/

  • 명시적 호출 혹은 자동으로 읽혀져도 괜찮은 것
    → Skills
    .claude/skills/

하지만 그로 인해, 조금 예상치 못했던 일이 일어났습니다.

통합됨에 따라, 프런트매터(frontmatter)의 description에 작성된 내용과 일치하면, 커스텀 슬래시 명령어도 자동으로 호출되는 방식이 되어 있었습니다.

즉, 지금까지 "명시적으로만 호출되겠지"라고 생각하며 .claude/commands/ 하위에 두었던 명령어들도, 사용자의 입력에 따라 멋대로 발화(trigger)될 가능성이 있다는 뜻입니다.

예를 들어, 릴리스 노트(release note) 초안을 자동으로 출력하기 위한 커스텀 슬래시 명령어를 두었다고 가정해 봅시다.

---
description: 최근 커밋으로부터 다음 릴리스 노트 초안을 생성한다
---
...

이 상태에서 Claude Code에게 "다음 릴리스 노트를 쓰고 싶은데"라고 상담했다고 가정해 보겠습니다. 본인은 작성 방법에 대해 상담하고 싶었을 뿐, /release-note-idea라고 명시적으로 입력한 것은 아닙니다.

그럼에도 description이 입력 내용과 매치되기 때문에, Claude는 이 명령어를 자동으로 호출하여 텍스트 파일이 생성되어 버립니다.

description을 생략한 경우라도, 본문의 첫 줄이 입력과 매치되면 마찬가지로 자동으로 호출됩니다.

# 최근 커밋으로부터 다음 릴리스 노트 초안을 생성한다
git log와 이전 태그로부터 차분을 추출하여, 릴리스 노트 초안을 생성하고
텍스트 파일로 출력해 주세요.

"아니, .claude/commands/ 하위는 명시적 호출용이잖아"라고 믿고 있었던 입장에서는, 이것은 꽤 함정 같다고 느꼈습니다. 위 예시에서는 텍스트 파일이 생성될 뿐이라 피해가 작지만, 만약 MCP를 사용하여 어딘가에 게시하는 등의 내용이 포함되어 있었다면 조금 문제가 되었을 것입니다.

애초에 Skills로 통합되었다는 것은 그런 의미가 아니었을까요? 설명을 더 읽어봤다면 알 수 있었을 것이라는 생각도 들지만 말입니다...

프런트매터에 아래 내용을 한 줄 추가하기만 하면 됩니다.

---
description: 〜
disable-model-invocation: true
...

이렇게 하면 Claude가 description(이나 본문)을 보고 멋대로 호출하는 일이 없어집니다. 물론 Skills 측에도 동일한 옵션이 준비되어 있습니다.

이 옵션 자체는 알고 있었지만, 커스텀 슬래시 명령어의 동작을 Skills 통합 전의 동작으로 되돌리기 위해 필요할 줄은 몰랐습니다.

역으로 말하면, disable-model-invocation: true가 붙어 있지 않은 커스텀 슬래시 명령어의 description은 항상 컨텍스트(context)에 읽혀지고 있다는 뜻이기도 합니다. 컨텍스트 절약 관점에서도, 명시적 호출만 할 것들에는 붙여두는 것이 무난해 보입니다.

사용법위치
명시적으로만 호출하고 싶은 경우커스텀 슬래시 명령어 (.claude/commands/)
명시적 호출 혹은 자동으로 읽혀져도 괜찮은 경우Skills (.claude/skills/)

위와 같이 구분해서 사용하고 있는 분들은, 우선 커스텀 슬래시 명령어 쪽에 disable-model-invocation: true를 추가해 두는 것이 사고를 방지하고 컨텍스트를 절약하는 데 도움이 될 것이라고 생각합니다.

저 개인적으로는 우선 사고가 발생하지 않도록 위의 대응을 취하고 있었으나, 현재는 관리상 명확하게 구분할 수 있도록 Skills 이름에 접두사(예: cmd- 등)를 붙이는 방식으로 Skills로 이전하고 있습니다. (물론 그 수가 아주 많지는 않습니다.)

혹시 아직 커스텀 슬래시 명령어(Slash Commands)를 사용하고 계신 분들께 참고가 된다면 좋겠습니다.

AI 자동 생성 콘텐츠

본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0