ai-common marketplace 플러그인 개발/수정 시 반드시 따라야 하는 규칙.
plugins/{plugin-name}/
├── .claude-plugin/
│ └── plugin.json # 매니페스트 (name, description, version, commands[])
├── commands/ # 사용자가 /로 호출하는 커맨드 (자동완성에 표시)
│ └── {command-name}.md # 플랫 파일, frontmatter에 name 없어야 함
├── skills/ # 백그라운드 스킬 (Claude가 내부적으로 로드)
│ └── {skill-name}/
│ └── SKILL.md # user-invocable: false 권장
├── agents/ # 서브에이전트 정의
│ └── {agent-name}.md
├── references/ # 커맨드/스킬이 참조하는 프로토콜 문서
├── templates/ # 프로젝트 생성 템플릿
└── hooks/ # 훅 설정
| commands/ | skills/ | |
|---|---|---|
| 용도 | 사용자가 /plugin:name으로 직접 호출 |
Claude가 내부적으로 로드하는 백그라운드 지식 |
| 자동완성 | / 메뉴에 표시됨 |
표시 안 됨 (user-invocable: false) |
| 파일 형식 | commands/name.md (플랫 파일) |
skills/name/SKILL.md (디렉토리) |
| prefix | plugin.json의 name이 prefix가 됨 |
plugin-name:skill-name으로 참조 |
---
name: start # 표시용. 호출명은 디렉토리명이 정한다
description: Use to … — 언제 쓰는지만. 절차를 요약하지 않는다
when_to_use: 새 기능, 기능 추가, new feature # 트리거 문구 (description 과 합쳐 1,536자에서 잘린다)
argument-hint: "[request] [--feat]"
disable-model-invocation: true # 또는 user-invocable: false. 둘 다 없으면 양쪽 호출
---description이 절차를 요약하면 모델이 본문을 읽지 않고 요약대로 움직인다. "언제" 만 쓴다.- 본문은 호출된 뒤 세션 내내 컨텍스트에 남는다. 짧게. 무거운 참조는 같은 폴더의 보조 파일로.
$ARGUMENTS,$0/$1,${CLAUDE_PLUGIN_ROOT},${CLAUDE_SKILL_DIR}치환을 쓸 수 있다.- 그 밖의 필드:
allowed-toolsmodeleffortcontext: fork+agenthookspaths.
skills/ 는 자동 발견된다. commands 필드는 legacy 평면 .md 용이며 기본 탐색을 대체하므로 쓰지 않는다.
이벤트 32종 · 핸들러 command http mcp_tool prompt agent · 차단은 exit 2 또는 permissionDecision: deny · 피드백은 additionalContext. 치트시트: plugins/hns/references/hooks-reference.md. 실패 입력을 주입해 빨간불을 본 뒤에만 켰다고 말한다 — hns 의 옛 템플릿은 존재하지 않는 필드(type: reminder PrePrompt condition)로 5개월간 무동작이었다.
플러그인 레벨 hooks/hooks.json 은 그 플러그인이 켜진 모든 프로젝트에서 발화한다. 전역 활성 플러그인이면 프로젝트별 설치(settings 병합)를 택한다.
---
name: session
description: "Load project context and key decisions at session start"
user-invocable: false
---description: "Use when starting a new session or recovering from compaction to load project context"Claude가 이 description을 보고 자동 로드 여부를 판단한다.
skills/review-architecture/
├── SKILL.md # 메인 지침 (500줄 이하)
├── skillsets/ # 절차적 서브스킬 (필요 시 로드)
│ ├── dependency-direction-analysis.md
│ └── port-adapter-compliance-audit.md
└── reference.md # 상세 참조 (필요 시 로드)
SKILL.md에서 [reference.md](reference.md) 형식으로 참조하면 Claude가 필요할 때만 로드.
새 플러그인을 만들거나 플러그인 이름/경로를 변경하면 반드시 .claude-plugin/marketplace.json 업데이트:
{
"plugins": [
{
"name": "hns",
"source": "./plugins/hns",
"description": "Universal AI harness engineering"
}
]
}이 파일이 없으면 claude plugins install이 실패한다. marketplace CLI는 이 인덱스로 플러그인을 발견한다.
{ "version": "0.3.1" }- MAJOR: 호환성 깨지는 변경
- MINOR: 새 커맨드/스킬 추가
- PATCH: 버그 수정, 문서 개선
version을 올리지 않으면 기존 사용자의 캐시가 갱신되지 않는다.
# marketplace 리프레시
cd ~/.claude/plugins/marketplaces/ai-common && git pull origin main
# 재설치 (캐시 강제 갱신)
claude plugins uninstall {plugin}@ai-common
claude plugins install {plugin}@ai-common
# 세션 내 리로드
/reload-pluginsclaude --plugin-dir ./plugins/hnsmarketplace 설치 없이 직접 로드. 변경 시 /reload-plugins로 핫 리로드.
/입력 후 커맨드 이름 타이핑(plugin-name)prefix와 함께 목록에 나오는지 확인- 안 나오면: frontmatter에
name필드가 있는지 확인 (있으면 제거)
| Plugin | Prefix | Skills (user) | Skills (model-only) | Agents |
|---|---|---|---|---|
| hns | /hns: |
15 | 8 | 5 |
| ai-debugger | /ai-debugger: |
2 | 6 | 1 |
| private-repo | /private-repo: |
1 | 1 | 0 |
| content-analyzer | /content-analyzer: |
1 | 3 | 1 |
플러그인이 자체 파이프라인(연속된 커맨드/스킬 체인)을 갖는 경우, 외부 플러그인 스킬과의 충돌을 방지해야 한다.
- 파이프라인 활성 중에는 해당 플러그인 스킬만 사용
- 기능이 겹치는 외부 스킬은 자동 invoke하지 않음
- 외부 스킬이 필요한 경우 사용자에게 질의 후 승인 시만 활용
파이프라인을 갖는 플러그인의 agent-behavior 또는 core 스킬에 다음을 명시:
## External Skill Isolation
본 플러그인 파이프라인 실행 중:
- 플러그인 내부 스킬만 사용
- 겹치는 외부 스킬(superpowers 등)은 자동 invoke 금지
- 외부 스킬 필요 시 → 사용자 질의 후 승인 시만 사용
- 파이프라인 비활성(일반 작업) 시 → 외부 스킬 자유 사용- 외부 스킬이 파이프라인 중간에 끼어들면 하네스 제어 흐름이 깨짐
- 동일 기능의 이중 실행으로 컨텍스트 낭비 및 충돌 발생
- 플러그인별 검증 루프·증거 기록 등의 일관성 훼손
| 겹치는 영역 | HNS (파이프라인 우선) | Superpowers (승인 시만) |
|---|---|---|
| 브레인스토밍 | shape-spec | brainstorming |
| 플랜 작성 | write-spec + create-tasks | writing-plans |
| 구현 실행 | implement-tasks | executing-plans |
| 검증 | verify | verification-before-completion |
증상: plugin.json의 commands[]를 수정했는데 /reload-plugins 후에도 이전 커맨드가 계속 보임.
원인: hns@ai-common처럼 marketplace에서 설치된 플러그인은 ~/.claude/plugins/cache/에 캐시된다. 로컬 소스(ai/plugins/hns/)를 수정해도 캐시가 갱신되지 않으면 이전 버전이 로드됨.
해결 순서:
# 1. plugin.json version bump (필수)
"version": "0.3.1" → "0.4.0"
# 2. commit + push (marketplace 소스 갱신)
git add -A && git commit -m "chore: version bump" && git push
# 3. marketplace 소스 pull (force push 이력이 있으면 reset --hard 필요)
cd ~/.claude/plugins/marketplaces/ai-common && git pull origin main
# diverge 에러 발생 시:
cd ~/.claude/plugins/marketplaces/ai-common && git reset --hard origin/main
# 4. 재설치 (캐시 강제 갱신)
claude plugins uninstall hns@ai-common
claude plugins install hns@ai-common
# 5. 반드시 새 세션 시작 (현재 세션은 이전 캐시 유지)증상: skills/ 에 파일을 두었는데 모델도 / 메뉴도 그 스킬을 모른다.
원인 1: 2단계 이하 디렉토리(skills/group/name/SKILL.md). 플러그인 skills/ 는 한 단계만 탐색한다. → skills/name/SKILL.md 로 올린다.
원인 2: disable-model-invocation: true 인데 모델에게 시켰다. 그 스킬은 사용자가 /name 으로만 실행한다.
원인 3: 프론트매터 name: 으로 호출명을 바꾸려 했다. 호출명은 디렉토리명이다.
확인 방법(설치본을 끄고 워킹카피만 로드):
claude -p --plugin-dir ./plugins/{name} --settings '{"enabledPlugins":{"{name}@ai-common":false}}' --model haiku --max-turns 1 \
"List every skill name starting with '{name}:' available via the Skill tool, one per line."증상: git pull origin main 시 "divergent branches" 에러.
원인: git filter-repo 등으로 force push한 이력이 있으면 marketplace 로컬 캐시와 remote가 diverge.
해결:
cd ~/.claude/plugins/marketplaces/ai-common && git reset --hard origin/main증상: 플러그인 재설치 + /reload-plugins 후에도 이전 스킬 목록이 보임.
원인: Claude Code 세션은 시작 시점에 스킬 목록을 메모리에 올려놓고, 세션 중에는 갱신하지 않음. /reload-plugins도 marketplace 캐시를 교체하지 못함.
해결: 반드시 새 터미널에서 새 세션 시작. 현재 세션에서는 확인 불가.
20개 커맨드를 8개로 축소하면서 겪은 전체 슈팅 과정:
| 단계 | 시도 | 결과 |
|---|---|---|
| 1 | plugin.json에서 commands[] 12개 제거 | ❌ commands/ 디렉토리 자동 스캔으로 여전히 노출 |
| 2 | commands/_deprecated/, commands/_internal/로 하위 이동 |
❌ 재귀 스캔으로 여전히 발견 |
| 3 | 플러그인 루트 밖(hns-internal/)으로 이동 |
❌ 여전히 발견 + feat 내부 호출 체인 끊김 우려 |
| 4 | frontmatter(description) 제거 | ❌ 파일명 기반으로 여전히 발견 |
| 5 | skills/commands/{name}/SKILL.md로 전환 + user-invocable: false |
✅ 자동완성에서 숨겨짐 |
| 6 | 새 세션에서도 이전 목록 보임 | ❌ marketplace 캐시(v0.3.1)가 갱신 안 됨 |
| 7 | ~/.claude/plugins/cache/ 수동 삭제 |
❌ marketplace 소스 자체가 오래됨 |
| 8 | version bump(0.4.0) + marketplace git reset --hard + uninstall/install | ✅ 최종 해결 |
핵심 교훈: marketplace 설치 플러그인은 로컬 소스 수정이 자동 반영되지 않는다. 반드시 version bump → push → marketplace pull → uninstall/install 순서를 거쳐야 한다.
새 스킬 추가:
1. skills/{name}/SKILL.md 생성 (한 단계, description 은 "언제" 만, 호출 주체 프론트매터)
2. `claude plugin validate ./plugins/{plugin} --strict`
3. 탐색 확인 (§9.2 명령) + 동작 확인 (`claude -p "/{plugin}:{name} …"`)
4. version bump
5. marketplace.json 확인
6. commit + push
7. claude plugin uninstall + install (또는 --plugin-dir 로 테스트)
훅 추가:
1. 실제 스키마로 작성 (`plugins/hns/references/hooks-reference.md`)
2. 실패 입력 주입 → 빨간불, 정상 입력 → 침묵 확인
3. `claude -p --settings <hooks.json> --output-format stream-json --include-hook-events` 로 발화 확인
새 플러그인 추가:
1. plugins/{name}/ 디렉토리 생성
2. .claude-plugin/plugin.json 매니페스트 작성
3. .claude-plugin/marketplace.json에 등록
4. commit + push + claude plugins install
플러그인을 사용하는 프로젝트에서 AI 에이전트(Claude Code 등)가 커맨드/스킬을 추가할 때 배포 절차를 빠뜨리는 문제가 반복된다. 이를 방지하기 위해 프로젝트별 피드백 메모리 등록을 권장한다.
---
name: plugin-command-checklist
description: 플러그인에 새 커맨드 추가 시 반드시 따라야 하는 배포 체크리스트
type: feedback
---
새 커맨드(commands/*.md) 추가 시 배포 절차를 빠뜨리지 말 것.
**How to apply:** 커맨드 파일 작성 완료 후 반드시:
1. commands/{name}.md (frontmatter에 name 없이 description만)
2. plugin.json commands[] 추가
3. plugin.json version bump (MINOR)
4. marketplace.json 확인
5. commit + push
6. 사용자에게 캐시 갱신 안내 (uninstall + install + 새 세션)- PostToolUse hook: 매 Write/Edit마다 토큰 소비
- gc-protocol: 실행 시에만 검증
- 피드백 메모리: 세션 시작 시 로드되어 토큰 비용 없이 에이전트 행동에 반영
각 프로젝트의 Claude Code 메모리 디렉터리:
.claude/projects/{project}/memory/feedback_plugin_command_checklist.md