Skip to content

네임스페이스와 스킬 우선순위

학습 후 할 수 있는 것

  • 스킬의 네임스페이스 시스템을 이해하고, 다른 출처의 동명 스킬을 구분하기
  • 스킬 발견 우선순위 규칙을 파악하고, 어떤 스킬이 로드될지 예측하기
  • 네임스페이스 접두사를 사용하여 스킬 출처를 정확히 지정하기
  • 동명 스킬 충돌 문제 해결하기

현재 겪고 있는 문제

스킬 수가 증가하면서 이런 혼란스러운 상황을 겪을 수 있습니다:

  • 동명 스킬 충돌: 프로젝트 디렉터리와 사용자 디렉터리 모두 git-helper라는 이름의 스킬이 있을 때, 어떤 것이 로드되는지 모름
  • 스킬 출처 혼란: 어떤 스킬이 프로젝트 레벨에서 온 것이고, 어떤 것이 사용자 레벨이나 플러그인 캐시에서 온 것인지 불분명
  • 덮어쓰기 동작 이해 불가: 사용자 레벨 스킬을 수정했는데도 적용되지 않고, 프로젝트 레벨 스킬이 덮어씀
  • 정확한 제어 어려움: 특정 출처의 스킬을 강제로 사용하고 싶은데, 어떻게 지정해야 할지 모름

이러한 문제들은 스킬 네임스페이스와 우선순위 규칙을 이해하지 못해서 발생합니다.

핵심 개념

네임스페이스는 OpenCode Agent Skills가 다양한 출처의 동명 스킬을 구분하기 위해 사용하는 메커니즘입니다. 각 스킬에는 출처를 식별하는 라벨(label)이 있으며, 이러한 라벨들이 스킬의 네임스페이스를 구성합니다.

네임스페이스가 필요한 이유는?

두 개의 동명 스킬이 있다고 상상해보세요:

  • 프로젝트 레벨 .opencode/skills/git-helper/ (현재 프로젝트에 맞게 커스텀)
  • 사용자 레벨 ~/.config/opencode/skills/git-helper/ (범용 버전)

네임스페이스가 없으면 시스템은 어떤 것을 사용할지 알 수 없습니다. 네임스페이스가 있으면 명확하게 지정할 수 있습니다:

  • project:git-helper - 프로젝트 레벨 버전을 강제로 사용
  • user:git-helper - 사용자 레벨 버전을 강제로 사용

우선순위 규칙은 네임스페이스를 지정하지 않을 때 시스템이 합리적인 선택을 할 수 있도록 합니다. 프로젝트 레벨 스킬이 사용자 레벨 스킬보다 우선하므로, 프로젝트에서 특정 동작을 커스텀할 수 있으면서도 전역 설정에는 영향을 주지 않습니다.

스킬 출처와 라벨

OpenCode Agent Skills는 여러 스킬 출처를 지원하며, 각 출처에는 대응하는 라벨이 있습니다:

출처라벨 (label)경로설명
OpenCode 프로젝트 레벨project.opencode/skills/현재 프로젝트 전용 스킬
Claude 프로젝트 레벨claude-project.claude/skills/Claude Code 호환 프로젝트 스킬
OpenCode 사용자 레벨user~/.config/opencode/skills/모든 프로젝트에서 공유하는 범용 스킬
Claude 사용자 레벨claude-user~/.claude/skills/Claude Code 호환 사용자 스킬
Claude 플러그인 캐시claude-plugins~/.claude/plugins/cache/설치된 Claude 플러그인
Claude 플러그인 마켓claude-plugins~/.claude/plugins/marketplaces/마켓에서 설치한 Claude 플러그인

실제 사용 권장 사항

  • 프로젝트 특정 설정: .opencode/skills/에 배치
  • 범용 도구 스킬: ~/.config/opencode/skills/에 배치
  • Claude Code에서 마이그레이션: 이동할 필요 없음, 시스템이 자동으로 발견

스킬 발견 우선순위

시스템이 스킬을 발견할 때, 다음 순서로 각 위치를 스캔합니다:

1. .opencode/skills/              (project)        ← 가장 높은 우선순위
2. .claude/skills/                (claude-project)
3. ~/.config/opencode/skills/     (user)
4. ~/.claude/skills/              (claude-user)
5. ~/.claude/plugins/cache/       (claude-plugins)
6. ~/.claude/plugins/marketplaces/ (claude-plugins)  ← 가장 낮은 우선순위

핵심 규칙:

  • 첫 번째 일치 적용: 첫 번째로 발견된 스킬이 유지됨
  • 동명 스킬 중복 제거: 이후 발견된 동명 스킬은 무시됨 (경고는 출력)
  • 프로젝트 레벨 우선: 프로젝트 레벨 스킬이 사용자 레벨 스킬을 덮어씀

우선순위 예시

다음과 같은 스킬 분포가 있다고 가정해봅시다:

프로젝트 디렉터리:
.opencode/skills/
  └── git-helper/              ← 버전 A (프로젝트 커스텀)

사용자 디렉터리:
~/.config/opencode/skills/
  └── git-helper/              ← 버전 B (범용)

플러그인 캐시:
~/.claude/plugins/cache/xxx/skills/
  └── git-helper/              ← 버전 C (Claude 플러그인)

결과: 시스템은 버전 A (project:git-helper)를 로드하며, 이후 두 개의 동명 스킬은 무시됩니다.

네임스페이스를 사용하여 스킬 지정

use_skill 또는 다른 도구를 호출할 때, 네임스페이스 접두사를 사용하여 스킬 출처를 정확히 지정할 수 있습니다.

문법 형식

namespace:skill-name

또는

skill-name  # 네임스페이스 미지정, 기본 우선순위 사용

네임스페이스 목록

project:skill-name         # 프로젝트 레벨 OpenCode 스킬
claude-project:skill-name  # 프로젝트 레벨 Claude 스킬
user:skill-name            # 사용자 레벨 OpenCode 스킬
claude-user:skill-name     # 사용자 레벨 Claude 스킬
claude-plugins:skill-name  # Claude 플러그인 스킬

사용 예시

시나리오 1: 기본 로드 (우선순위에 따라)

use_skill("git-helper")
  • 시스템이 우선순위에 따라 첫 번째로 일치하는 스킬을 찾아 로드
  • project:git-helper (존재하는 경우)

시나리오 2: 사용자 레벨 스킬 강제 사용

use_skill("user:git-helper")
  • 우선순위 규칙을 무시하고 사용자 레벨 스킬을 직접 로드
  • 프로젝트 레벨이 사용자 레벨을 덮어쓰더라도 접근 가능

시나리오 3: Claude 플러그인 스킬 로드

use_skill("claude-plugins:git-helper")
  • Claude 플러그인에서 가져온 스킬을 명확하게 로드
  • 특정 플러그인 기능이 필요한 시나리오에 적합

네임스페이스 매칭 로직

namespace:skill-name 형식을 사용할 때, 시스템의 매칭 로직은 다음과 같습니다:

  1. 입력 파싱: 네임스페이스와 스킬 이름을 분리
  2. 모든 스킬 순회: 일치하는 스킬을 찾음
  3. 매칭 조건:
    • 스킬 이름 일치
    • 스킬의 label 필드가 지정된 네임스페이스와 같음
    • 또는 스킬의 namespace 커스텀 필드가 지정된 네임스페이스와 같음
  4. 결과 반환: 조건을 만족하는 첫 번째 스킬
매칭 로직 소스코드
typescript
export function resolveSkill(
  skillName: string,
  skillsByName: Map<string, Skill>
): Skill | null {
  if (skillName.includes(':')) {
    const [namespace, name] = skillName.split(':');
    for (const skill of skillsByName.values()) {
      if (skill.name === name &&
          (skill.label === namespace || skill.namespace === namespace)) {
        return skill;
      }
    }
    return null;
  }
  return skillsByName.get(skillName) || null;
}

Superpowers 모드에서의 네임스페이스

Superpowers 모드를 활성화하면, 시스템이 세션 초기화 시 네임스페이스 우선순위 설명을 주입합니다:

markdown
**Skill namespace priority:**
1. Project: `project:skill-name`
2. Claude project: `claude-project:skill-name`
3. User: `skill-name`
4. Claude user: `claude-user:skill-name`
5. Marketplace: `claude-plugins:skill-name`

The first discovered match wins.

이는 AI가 스킬을 선택할 때 올바른 우선순위 규칙을 따르도록 보장합니다.

Superpowers 모드 활성화 방법

환경 변수를 설정하세요:

bash
OPENCODE_AGENT_SKILLS_SUPERPOWERS_MODE=true opencode

일반적인 사용 시나리오

시나리오 1: 프로젝트 커스텀으로 범용 스킬 덮어쓰기

요구사항: 프로젝트에 특수한 Git 워크플로우가 필요한데, 사용자 레벨에는 이미 범용 git-helper 스킬이 있음.

해결방안:

  1. 프로젝트 디렉터리에 .opencode/skills/git-helper/ 생성
  2. 프로젝트별 Git 워크플로우 구성
  3. 기본 호출 use_skill("git-helper")이 자동으로 프로젝트 레벨 버전 사용

검증:

bash
## 스킬 목록 확인, 태그에 주목
get_available_skills("git-helper")

출력 예시:

git-helper (project)
  Project-specific Git workflow

시나리오 2: 일시적으로 범용 스킬로 전환

요구사항: 특정 작업에서 프로젝트 커스텀 버전이 아닌 사용자 레벨 범용 스킬을 사용해야 함.

해결방안:

use_skill("user:git-helper")

user: 네임스페이스를 명확히 지정하여 프로젝트 레벨 덮어쓰기를 우회.

시나리오 3: Claude 플러그인에서 스킬 로드

요구사항: Claude Code에서 마이그레이션하여 특정 Claude 플러그인 스킬을 계속 사용하고 싶음.

해결방안:

  1. Claude 플러그인 캐시 경로가 올바른지 확인: ~/.claude/plugins/cache/
  2. 스킬 목록 확인:
get_available_skills()
  1. 네임스페이스를 사용하여 로드:
use_skill("claude-plugins:plugin-name")

함정 피하기

❌ 오류 1: 동명 스킬이 덮어쓰여지는 것을 모름

증상: 사용자 레벨 스킬을 수정했는데 AI가 여전히 이전 버전을 사용함.

원인: 프로젝트 레벨 동명 스킬의 우선순위가 더 높아 사용자 레벨 스킬을 덮어씀.

해결:

  1. 프로젝트 디렉터리에 동명 스킬이 있는지 확인
  2. 네임스페이스를 사용하여 강제 지정: use_skill("user:skill-name")
  3. 또는 프로젝트 레벨 동명 스킬 삭제

❌ 오류 2: 네임스페이스 철자 오류

증상: use_skill("project:git-helper")를 사용했는데 404 반환.

원인: 네임스페이스 철자 오류(예: projcet로 작성) 또는 대소문자가 맞지 않음.

해결:

  1. 먼저 스킬 목록 확인: get_available_skills()
  2. 괄호 안의 태그(예: (project))에 주목
  3. 올바른 네임스페이스 이름 사용

❌ 오류 3: 라벨과 커스텀 네임스페이스 혼동

증상: use_skill("project:custom-skill")를 사용했는데 스킬을 찾을 수 없음.

원인: project는 라벨(label)이며, 커스텀 네임스페이스가 아님. 스킬의 namespace 필드가 명시적으로 project로 설정되지 않으면 매칭되지 않음.

해결:

  • 스킬 이름을 직접 사용: use_skill("custom-skill")
  • 또는 스킬의 label 필드를 확인하여 올바른 네임스페이스 사용

이번 강의 요약

OpenCode Agent Skills의 네임스페이스 시스템은 라벨과 우선순위 규칙을 통해 다양한 출처의 스킬을 통합 관리합니다:

  • 5가지 출처 라벨: project, claude-project, user, claude-user, claude-plugins
  • 6단계 우선순위: 프로젝트 레벨 > Claude 프로젝트 레벨 > 사용자 레벨 > Claude 사용자 레벨 > 플러그인 캐시 > 플러그인 마켓
  • 첫 번째 일치 적용: 동명 스킬은 우선순위에 따라 로드되며, 이후 것은 무시됨
  • 네임스페이스 접두사: namespace:skill-name 형식으로 스킬 출처를 정확히 지정

이 메커니즘을 통해 자동 발견의 편리함을 누리면서도 필요할 때 스킬 출처를 정확히 제어할 수 있습니다.

다음 강의 예고

다음 강의에서는 **컨텍스트 압축 복구 메커니즘**을 학습합니다.

배울 내용:

  • 컨텍스트 압축이 스킬에 미치는 영향
  • 플러그인이 스킬 목록을 자동 복구하는 방법
  • 장시간 세션에서 스킬을 계속 사용 가능하게 유지하는 팁

부록: 소스코드 참고

클릭하여 소스코드 위치 보기

업데이트 시간: 2026-01-24

기능파일 경로행 번호
SkillLabel 타입 정의src/skills.ts30
발견 우선순위 목록src/skills.ts241-246
동명 스킬 중복 제거 로직src/skills.ts258-259
resolveSkill 네임스페이스 처리src/skills.ts269-283
Superpowers 네임스페이스 설명src/superpowers.ts18-25

주요 타입:

  • SkillLabel: 스킬 출처 라벨 열거형
  • Skill: 스킬 메타데이터 인터페이스 (namespacelabel 필드 포함)

주요 함수:

  • discoverAllSkills(): 우선순위에 따라 스킬을 발견하고 자동으로 중복 제거
  • resolveSkill(): 네임스페이스 접두사를 파싱하여 스킬을 조회
  • maybeInjectSuperpowersBootstrap(): 네임스페이스 우선순위 설명 주입

발견 경로 목록 (우선순위 순):

  1. project - .opencode/skills/
  2. claude-project - .claude/skills/
  3. user - ~/.config/opencode/skills/
  4. claude-user - ~/.claude/skills/
  5. claude-plugins - ~/.claude/plugins/cache/~/.claude/plugins/marketplaces/