원문 캡처 · github.com
원문 캡처 · github.com

skill-spotter는 반복해서 수행하는 작업을 감지해 /name으로 실행할 수 있는 스킬로 저장하도록 제안하는 Claude Code 플러그인이다. 사용자가 직접 승인해야 스킬을 만들며, 기록은 기본적으로 로컬에 보관한다.

skill-spotter 저장소

데모 이미지

이 플러그인은 사용자가 입력한 문장뿐 아니라 Claude가 수행한 명령, 파일 작업, 도구 사용도 비교한다. 따라서 표현이 달라도 Claude의 행동이 비슷하면 같은 작업으로 볼 수 있고, 여러 프롬프트로 이어지는 작업 흐름도 찾아낸다. 서로 다른 요청에 반복해서 덧붙이는 규칙도 감지해 CLAUDE.md에 넣도록 제안한다.

기록 내용은 사용자의 컴퓨터에만 저장되고 업로드나 원격 분석, 계정은 없다. 플러그인은 턴마다 토큰을 사용하지 않으며, 제안은 Claude가 아니라 사용자에게 표시된다. 스킬을 자동으로 만들지는 않는다. 사용자가 /skill-spotter:draft를 실행해 초안을 요청해야 한다.

제안 확인과 스킬 만들기

저장소의 예시는 Claude Code 2.1.308을 사용해 데모 저장소에서 같은 변경 기록 업데이트를 세션 세 번에 걸쳐 요청한 실제 세션에서 가져왔다.

스킬 초안 화면

Create /update-changelog를 선택하면 /skill-spotter:draft p1이 실행된다. Claude는 기록된 단계를 읽고, 스킬을 사용자만 시작할 수 있게 할지 Claude도 시작할 수 있게 할지 한 가지 질문을 한다. 완성된 스킬은 Claude가 실제로 수행한 단계와 함께 .claude/skills/update-changelog/SKILL.md에 저장된다.

저장된 스킬 화면

다음부터는 명령 하나로 스킬을 실행할 수 있다.

스킬 사용 화면

/skill-spotter:status는 감지한 패턴과 사용자가 만든 스킬, 해당 스킬의 사용 빈도를 보여준다.

상태 화면

기록되는 정보와 개인정보 보호

저장소 설명에 따르면 모든 데이터는 사용자의 컴퓨터에 남는다. skill-spotter는 Claude Code 플러그인 데이터 폴더(~/.claude/plugins/data/skill-spotter-…/)에 SQLite 파일 하나를 둔다. 턴을 기록하는 훅은 네트워크 코드가 없는 일반 Python 코드다. 데이터는 업로드되지 않으며 분석 정보도 수집하지 않는다.

저장하는 정보는 다음과 같다.

  • 사용자의 프롬프트와 Claude가 실행한 셸 명령. 비밀정보를 제거하며 명령은 500자로 자른다.
  • Claude가 읽거나 수정한 파일의 이름. 경로는 프로젝트 기준 상대 경로로 기록한다.
  • Claude가 가져온 웹 페이지의 도메인, 호출한 MCP 도구의 이름과 인자 이름.
  • 패턴별 횟수, 지시문처럼 보이는 프롬프트 문장(예: “꼭 …”, “하지 마 …”), 규칙을 작성한 CLAUDE.md 파일의 이름.

도구 출력, 파일 내용, 편집 내용, MCP 인자 값, Claude의 답변은 저장하지 않는다. API 키, 토큰, 비밀번호, 개인 키, URL에 포함된 인증 정보도 저장하지 않는다고 설명한다. 턴 기록은 90일 동안 보관한 뒤 삭제하며, 패턴 요약은 계속 남는다. 저장된 내용을 전부 삭제하려면 /skill-spotter:forget을 실행한다. /skill-spotter:off는 제안을 멈추고, 기록 자체를 중단하려면 플러그인을 비활성화해야 한다.

데이터가 기기 밖으로 나가는 경우는 사용자가 직접 실행한 명령에 한정된다. /skill-spotter:draft는 스킬을 작성하도록 기록된 프롬프트(비밀정보 제거 후)와 작업 단계를 Claude에 보여준다. 이 내용은 Claude에 보여주는 다른 정보와 마찬가지로 대화의 일부로 Anthropic에 전송된다. 사용자는 해당 프롬프트를 처음 입력할 때 이미 보낸 상태다. /skill-spotter:rule도 규칙의 근거가 된 지시문을 Claude에 전달해 CLAUDE.md에 넣을 문장을 작성한다.

skill-spotter verify는 스킬 설명과 Claude가 작성한 테스트 프롬프트를 대상으로 claude -p를 실행한다. 기록된 과거 대화는 전송하지 않지만 토큰을 사용한다. 선택 기능인 /skill-spotter:extras는 사용자에게 확인한 뒤 PyPI에서 Python 패키지를, Hugging Face에서 임베딩 모델을 한 번 내려받는다. 사용자에 관한 정보는 전송하지 않는다.

비밀정보 제거는 알려진 키 형식, KEY=value, bearer 토큰, URL에 포함된 비밀번호 같은 패턴을 사용한다. 특이한 형식의 비밀정보는 남을 수 있다. 데이터베이스는 암호화되지 않으며, 일반 파일 권한으로 보호된다.

설치와 명령

설치는 다음 명령으로 진행한다.

text
claude plugin marketplace add ykisana/skill-spotter
claude plugin install skill-spotter@skill-spotter

저장소를 복제했다면 claude --plugin-dir /path/to/skill-spotter로 한 세션 동안 사용해 볼 수도 있다. Claude Code와 PATH에 등록된 python3 3.9 이상이 필요하며, macOS에 기본 포함된 Python도 사용할 수 있다. pip install은 필요하지 않다.

명령기능
/skill-spotter:status발견한 패턴과 제안, 사용자가 만든 스킬 및 사용 빈도를 표시한다.
/skill-spotter:draft <pN|wN>패턴 또는 작업 흐름을 스킬로 만든다.
/skill-spotter:rule <rN>반복해서 입력하는 지시문을 사용자 또는 프로젝트의 CLAUDE.md에 추가한다.
/skill-spotter:on / :off제안을 다시 시작하거나 일시 중지한다.
/skill-spotter:forget저장된 내용을 모두 삭제한다. 실행 전 확인을 요청한다.
/skill-spotter:train백그라운드 작업을 기다리지 않고 패턴을 다시 묶는다.
/skill-spotter:extras선택 기능으로 numpy, scikit-learn, fastembed를 설치한다. 용량은 약 400MB다.

CLI(scripts/skill-spotter)에는 show, dismiss, snooze, stats가 있다. scan-shell은 zsh/bash 기록을 가져와 반복 셸 작업도 패턴에 포함한다. verify는 Claude가 필요할 때 스킬을 실행하는지 시험한다.

감지 방식과 조건

훅은 비밀정보를 제거한 프롬프트와 Claude가 사용한 도구를 기록하고, 도구 사용은 템플릿 형태로 단순화한다. 예를 들어 uv run pytest -k foo는 pytest로 정리한다. Claude가 작업을 마치면 표현과 행동을 모두 이전 턴과 비교하며, 저장소 설명에 따르면 이 비교에는 약 40ms가 걸린다.

작업이 30일 안에 두 개 이상의 세션에서 세 번 발생하면 제안이 나타나며, 세션당 한 번을 넘지 않는다. git status만 실행하거나 파일 읽기만 하는 사소한 패턴은 제안하지 않는다. --force, deploy, rm -rf처럼 위험한 단계가 있는 작업은 사용자가 직접 실행할 때만 작동하는 스킬이 된다. 또한 위험한 단계를 진행하기 전에 확인을 요청한다. 제안을 무시하면 14일 동안 미뤄진 뒤 삭제된다. 만든 스킬의 사용 여부도 추적해 status에 표시한다.

작업이 아니라 여러 요청에 반복해서 붙이는 규칙도 찾는다. 예를 들어 “내가 유일한 작성자여야 한다, Claude는 안 된다”, “커밋 하나로 유지한다” 같은 문장이다. skill-spotter는 지시처럼 보이는 문장을 골라 핵심 단어로 줄이고, 오타도 허용해 비교한다. 30일 안에 세 개 이상의 세션에서 세 프롬프트에 같은 지시가 나타나면 CLAUDE.md에 추가하라고 제안한다. 규칙은 작업 패턴과 달리 모든 프로젝트를 통틀어 센다.

Claude Code가 불러오는 CLAUDE.md, CLAUDE.local.md, AGENTS.md 또는 .claude/rules/ 파일에 해당 규칙이 이미 있으면 제안하지 않는다. /skill-spotter:rule은 일반적인 문장 하나를 작성하며, 사용자의 ~/.claude/CLAUDE.md와 프로젝트 파일 중 어디에 넣을지 묻는다.

제안에는 반복된 내용을 확인할 수 있도록 가장 최근 프롬프트가 인용된다. 프롬프트에서 적절한 이름을 찾으면 그 이름을 제안하고, 그렇지 않으면 “스킬”로 저장하도록 안내한다. 초안을 만들 때 Claude가 이름을 정하며, 제안된 이름을 바꿀 수도 있다. Claude Code 2.1.287 이상에서는 프롬프트 위에 [Create /name], [Create skill] 또는 [Add to CLAUDE.md]와 [Not now] 버튼이 표시된다. 이전 버전에서는 Claude의 답변 아래에 메시지가 나타나며, Claude Code가 이를 Stop says:로 표시한다.

매칭 방식을 선택한 방법은 docs/method-lab.md, 설계 결정은 docs/adr에서 확인할 수 있다.

벤치마크와 한계

제작자는 합성 벤치마크에서 작업 유형 98개와 턴 6,460개를 사용해 실제 훅 코드를 재생했다고 밝혔다. 데이터는 대부분 한 번만 발생하는 작업으로 구성됐다. 자세한 결과는 전체 결과에서 볼 수 있다. 테스트 분할에서 배포된 매처는 정밀도 1.00, 재현율 0.97을 기록했고, 단순 규칙 기준선은 각각 0.67과 0.87이었다.

다만 제작자는 이 수치가 잠정적이라고 밝혔다. 템플릿으로 만든 합성 세션은 실제 세션보다 쉬울 수 있기 때문이다. 실제 세션을 사람이 라벨링한 검사(bench.label)에서 정밀도 0.85 이상을 보이려면 몇 주간 실제 사용 데이터가 필요하다고 설명한다.

알려진 한계도 있다. 탐색만으로 답하는 질문은 행동 기록이 없으므로 표현을 바꾸면 매칭되지 않는다. 아주 작은 수정 작업은 표현이 크게 다르면 별도 패턴으로 나뉠 수 있지만, 백그라운드 작업이 일부를 합친다. 요청을 다르게 표현하고 매번 다른 명령으로 수행하면 매칭되지 않을 수 있다. Claude는 명령을 자주 바꾸며, 실제 테스트에서도 표현이 다른 변경 기록 업데이트 세 건이 서로 다른 패턴으로 남았다. 평소 쓰던 표현을 반복하면 도움이 된다. Claude가 셸 명령이나 sed -i 같은 스크립트로 수정한 파일은 편집으로 집계되지 않는다.

개발과 라이선스

개발 테스트 명령은 다음과 같다.

text
python3 -m pytest # stdlib only
pipx run ruff check . && pipx run ruff format --check .
claude plugin validate .
claude plugin test # the mod band
python3 -m bench.replay --quick --min-precision 0.9 # what CI replays on every push

Method Lab(bench/)에는 별도 환경이 필요하다.

text
python3 -m venv .venv && .venv/bin/pip install -r bench/requirements.txt

각 마일스톤의 수동 확인 절차는 docs/e2e.md에 있다. 라이선스는 MIT다.