에이전트 스킬을 79개 런타임에 꽂는다: vercel-labs/skills(npx skills)의 심링크 설치·이중 락·well-known 디스커버리 심층 해부

한 줄 요약: 코딩 에이전트마다 스킬 디렉터리 경로가 다르다. vercel-labs/skills는 그 파편을 npx skills 한 줄로 묶는 설치·검색·업데이트 CLI다. Agent Skills 스펙(SKILL.md + YAML frontmatter)을 파싱하고, 79개 에이전트 정의(src/agents.ts)에 맞춰 심링크·복사·링크 모드로 꽂으며, 글로벌 ~/.agents/.skill-lock.json(v3)과 프로젝트 skills-lock.json 이중 락으로 재현성을 분리한다. 오늘은 GitHub Trending 전체 일간 6위권(별 34,590·오늘 +190), npm skills@1.7.2(주간 다운로드 약 480만), MIT 라이선스를 API·레지스트리로 재확인하고, 10/09에 다룬 mattpocock/skills(콘텐츠 커리큘럼)와 계층을 분명히 가른 뒤 아키텍처를 코드·스모크로 해부한다.

npx skills add가 GitHub·GitLab·well-known·로컬 소스를 받아 ~/.agents/skills 캐논컬에 두고 79개 에이전트 경로로 심링크한다
npx skills add가 GitHub·GitLab·well-known·로컬 소스를 받아 ~/.agents/skills 캐논컬에 두고 79개 에이전트 경로로 심링크한다

왜 지금 이 저장소인가

에이전트 스킬 논의는 두 층으로 갈린다. 하나는 무엇을 가르칠지(스킬 본문·워크플로·TDD 가이드), 다른 하나는 어디에 어떻게 꽂을지(경로·심링크·락·멀티 에이전트). 10/09 포스트의 mattpocock/skills는 전자다. 오늘 다룰 vercel-labs/skills는 후자—Vercel Labs가 공개한 오픈 에이전트 스킬 생태계 CLI이며, 디렉터리는 skills.sh, 공식 스킬 묶음은 vercel-labs/agent-skills다. 같은 “skills” 이름이지만 패키지 경계가 다르다.

항목 확인한 값 (2026-10-14 ~11:56 KST) 해석
저장소 vercel-labs/skills — TypeScript CLI 설명문 그대로 “The open agent skills tool – npx skills”. 홈페이지 skills.sh
별 / 포크 / 이슈 34,590 / 2,953 / 1,115 (GitHub API) 오늘 Trending 전체 일간 6위, stars today 190. 2026-01-14 생성
최근 푸시 / 태그 2026-10-09 17:54 UTC → 10/10 02:54 KST. 태그 v1.7.2 (sha 671e8c3) 릴리스·트렌딩이 맞물림. 박스에서 v1.7.2 shallow clone
npm skills@1.7.2, license MIT, bin skills/add-skill 주간 다운로드 4,804,674 · 월간 25,093,274 (npm downloads API). 런타임 의존성 tar, yaml
라이선스 MIT (Copyright 2026 Vercel, Inc.). LICENSE·배지·npm 필드 일치 재배포·상용 연동에 부담이 적다. ELv2(Context Mode)와 대비
엔진 engines.node >= 22.20.0 fs/promises.glob 사용. Node 20에서는 SyntaxError. 박스에 Node 22.20.0 바이너리로 스모크
에이전트 매핑 src/agents.ts에 name 79개 README는 “OpenCode, Claude Code, Codex, Cursor, and 75 more”. 유니버설·공유 경로 포함

이 글은 README, LICENSE, AGENTS.md, package.json 1.7.2, src/{cli,add,installer,agents,skill-lock,local-lock,use,providers}/*, npm 레지스트리·다운로드 API, 그리고 박스에서 Node 22.20.0으로 돌린 skills --help·add --list·init·add … --copy -y·use·list -g 결과를 바탕으로 썼다. 대화형 fzf find와 전체 vitest 스위트(69개 테스트 파일)는 이 환경에서 돌리지 않았다.

네 단계 파이프라인: source-parser → SKILL.md 발견(depth≤3) → installer(symlink/copy/link) → 글로벌·프로젝트 이중 락
네 단계 파이프라인: source-parser → SKILL.md 발견(depth≤3) → installer(symlink/copy/link) → 글로벌·프로젝트 이중 락

mattpocock/skills와 무엇이 다른가

독자가 “또 skills 포스트?”라고 넘기지 않게 경계를 먼저 긋는다.

축 mattpocock/skills (10/09) vercel-labs/skills (오늘)
계층 에이전트 엔지니어링 콘텐츠 생태계 설치 CLI + 디렉터리
산출물 흐름·태스크 그래프·TDD 가이드 npx skills 바이너리, 락 파일, 에이전트 경로 매핑
배포 레포를 읽고 따라 하기 npm 패키지 skills, skills.sh 검색
멀티 에이전트 개념·프랙티스 중심 79개 --agent 타깃 + 자동 감지
같이 쓸 수 있나 보완 관계. 콘텐츠 레포를 skills add owner/repo로 꽂는 쪽이 오늘 CLI의 역할

문제가 무엇인가

Agent Skills 스펙은 단순하다—디렉터리 하나와 SKILL.md(YAML name/description). 현실은 그렇지 않다. Claude Code는 .claude/skills/, Cursor·Codex·Cline 다수는 .agents/skills/, OpenClaw는 프로젝트 루트 skills/, Windsurf는 글로벌이 ~/.codeium/windsurf/skills/다. 팀이 Cursor와 Claude Code를 동시에 쓰면 같은 스킬을 두 경로에 수동 복사하거나, 경로를 잊고 “스킬이 안 떠요”로 빠진다. skills CLI는 그 매핑 테이블을 코드로 고정하고, 캐논컬 한 곳에 둔 뒤 에이전트 쪽으로 심링크(권장)한다.

저장소 구조

경로 역할 실무 포인트
bin/cli.mjs → dist/cli.mjs 배포 엔트리(~341KB 번들) obuild. 런타임 deps는 tar·yaml만 남기고 @clack·simple-git·detect-agent는 청크로 내장
src/cli.ts 커맨드 라우팅 add/use/list/find/remove/update/init + experimental_install·experimental_sync
src/add.ts (~2.6k줄) 설치 오케스트레이션 well-known → download → git clone 순서. CI용 -y/--all/--json
src/installer.ts (~1.4k줄) 심링크·복사·경로 안전 InstallMode = symlink|copy|link. path traversal 가드 sanitizeName/isPathSafe
src/agents.ts (915줄) 에이전트 카탈로그 project/global 경로, 감지 함수, Eve 서브에이전트, universal 그룹
src/skill-lock.ts / local-lock.ts 이중 락 글로벌 v3(폴더 해시), 프로젝트 skills-lock.json 커밋용
src/source-parser.ts 소스 URL 정규화 GitHub shorthand, tree URL, GitLab, Azure Repos, SSH, 로컬
src/providers/* 원격 프로바이더 well-known v1/v2(schemas.agentskills.io/discovery/0.2.0), Mintlify·HuggingFace 등
src/use.ts 설치 없이 프롬프트 생성 임시 디렉터리에 풀어 stdout만. --agent면 대화형 에이전트 기동
skills/find-skills/ 번들 메타 스킬 CLI 레포 자체에 포함. agent-skills의 9개 스킬과는 별개
tests/ + *.test.ts vitest 69개 테스트 파일. 심링크·sanitize·well-known·cross-platform path
글로벌 ~/.agents/.skill-lock.json v3(폴더 tree SHA)와 프로젝트 skills-lock.json(커밋·experimental_install)의 역할 분리
글로벌 ~/.agents/.skill-lock.json v3(폴더 tree SHA)와 프로젝트 skills-lock.json(커밋·experimental_install)의 역할 분리

설계 결정과 트레이드오프

결정 선택 트레이드오프
캐논컬 + 심링크 기본은 ~/.agents/skills/(글로벌) 또는 프로젝트 캐논컬에 복사 후 에이전트 경로에 심링크 단일 소스·업데이트 용이. Windows·일부 샌드박스에선 심링크 실패 → --copy 폴백
이중 락 글로벌 .skill-lock.json v3 + 프로젝트 skills-lock.json 개인 머신 추적과 팀 재현을 분리. 복원은 experimental_install—아직 실험 API
폴더 해시(tree SHA) 스킬 폴더 전체 GitHub tree SHA를 락에 저장 SKILL.md만 해시하면 부속 파일 변경을 놓침. API 의존·프라이빗 레포는 토큰 필요
발견 depth≤3 알려진 컨테이너 안에서 최대 3단계. 얕은 SKILL.md가 하위 섀도 거대한 monorepo 오탐 감소. 깊은 예제는 --full-depth
well-known 스코프 비폴백 경로 스코프 미해결 시 루트 인덱스로 떨어지지 않음 호스트 전체 카탈로그 오설치 방지. URL 오타는 명시적 에러
자격 증명 격리 Git credential → gh repo clone → SSH. gh auth token을 Node로 읽지 않음 토큰 유출면 축소. 디버깅은 덜 직관적. 명시 GITHUB_TOKEN/GH_TOKEN은 허용
텔레메트리 skills.sh /tele/t. 공개 GitHub만 식별자 전송 제품 개선용. DISABLE_TELEMETRY=1 또는 DO_NOT_TRACK=1로 차단
보안 평가 UI 설치 요약에 Gen/Socket/Snyk 배지(skills.sh) 스킬은 에이전트 전체 권한으로 돈다—배지는 보조. 리뷰는 여전히 필수

설치 스코프·모드·커맨드

스코프 플래그 위치 언제
Project (기본) ./<agent>/skills/ 팀과 커밋·공유
Global -g ~/<agent>/skills/ 모든 프로젝트 공통
모드 동작 선택 기준
symlink (권장) 캐논컬 복사 + 에이전트 심링크 업데이트·단일 진실
copy 에이전트별 독립 복사 심링크 불가 환경
link 캐논컬이 소스 자체를 가리킴 experimental_sync / node_modules 연동
커맨드 역할 스모크에서 확인
skills --help / --version 도움말·버전 1.7.2, add/use/list/find/… 노출
skills add <src> --list 설치 없이 목록 vercel-labs/agent-skills에서 9개 스킬 나열
skills add … -g -a claude-code --copy -y 비대화형 설치 web-design-guidelines → ~/.claude/skills/… + 락 v3
skills use owner/repo@skill 임시 프롬프트 stdout SKILL.md frontmatter+본문 출력 (설치 없음)
skills init [name] 템플릿 생성 demo-skill/SKILL.md name/description 스캐폴드
skills list -g 설치 목록 Agents: Claude Code, Source: vercel-labs/agent-skills
skills find / update / remove 검색·갱신·제거 help에 옵션 확인. 대화형 find는 미실행
mattpocock/skills는 에이전트 엔지니어링 콘텐츠, vercel-labs/skills는 생태계 설치 CLI—같은 skills 이름이지만 계층이 다르다
mattpocock/skills는 에이전트 엔지니어링 콘텐츠, vercel-labs/skills는 생태계 설치 CLI—같은 skills 이름이지만 계층이 다르다

에이전트 경로 매트릭스 (발췌)

전체 79개는 README 표와 agents 배열이 권위다. 실무에서 자주 겹치는 것만 정리한다.

에이전트 --agent 프로젝트 글로벌
Claude Code claude-code .claude/skills/ ~/.claude/skills/
Cursor cursor .agents/skills/ ~/.cursor/skills/
Codex / Cline / Pi / Zed 등 codex … .agents/skills/ ~/.agents/skills/
OpenCode opencode .agents/skills/ ~/.config/opencode/skills/
Gemini CLI gemini-cli .agents/skills/ ~/.gemini/skills/
GitHub Copilot github-copilot .agents/skills/ ~/.copilot/skills/
OpenClaw openclaw skills/ ~/.openclaw/skills/
Amp / Replit / Universal amp 등 .agents/skills/ ~/.config/agents/skills/

호환성 표(README) 기준: Basic skills는 주요 에이전트 전부 Yes. allowed-tools는 대부분 Yes(Kiro CLI·Zencoder는 No). context: fork는 Claude Code만 Yes. Hooks는 Claude Code·Cline·Kiro CLI 등으로 제한된다. 스킬 본문이 모든 런타임에서 동일하게 동작한다고 가정하면 안 된다.

대안 비교

대안 계층 강점 이 CLI 대비
수동 복사 / git submodule 파일 단순·감사 용이 에이전트 수×경로 폭발. 업데이트·락 없음
에이전트 네이티브 마켓(Claude plugin 등) 플랫폼 1급 UX·훅 연동 벤더 록인. 크로스 에이전트 팀에는 부족
mattpocock/skills 콘텐츠 엔지니어링 커리큘럼 설치기가 아님. 보완재
Context Mode / Headroom 컨텍스트 절약 토큰·도구 출력 통제 스킬 배포와 다른 문제. 병행 가능
직접 well-known 호스팅 배포 사내 카탈로그 이 CLI가 클라이언트. 서버 스펙은 agentskills.io discovery

박스에서 돌린 스모크

환경: Node v22.20.0(공식 linux-x64 tar), npm install skills@1.7.2, 격리 HOME=…/smoke-home. 시스템 Node 20.19.2는 fs/promises.glob 미지원으로 CLI 기동 실패—엔진 제약이 실제임을 확인했다.

  1. skills --version → 1.7.2
  2. skills add vercel-labs/agent-skills --list -y → Found 9 skills (composition-patterns, deploy-to-vercel, react-best-practices, … writing-guidelines)
  3. skills init demo-skill → demo-skill/SKILL.md 스캐폴드
  4. skills add vercel-labs/agent-skills --skill web-design-guidelines -g -a claude-code --copy -y → ~/.claude/skills/web-design-guidelines/SKILL.md, 락 v3에 skillFolderHash 기록, skills.sh 보안 평가(Gen Safe / Socket 0 / Snyk Low) 표시
  5. skills use vercel-labs/agent-skills@web-design-guidelines → 설치 없이 SKILL.md 프롬프트 stdout
  6. skills list -g → Agents: Claude Code, Source: vercel-labs/agent-skills

의도적 실패 사례: --skill find-skills는 agent-skills에 없어 “No matching skills” + 가용 목록 출력. find-skills는 CLI 레포 skills/ 번들이다.

한계·주의·라이선스

항목 내용
권한 모델 설치된 스킬은 에이전트와 동일 권한. CLI 설치 완료 메시지 그대로 “Review skills before use”. 배지≠감사
Node ≥22.20 구형 CI 이미지·일부 컨테이너는 바로 깨짐. 엔진을 먼저 올려야 함
실험 API experimental_install/experimental_sync는 이름 그대로. 프로덕션 표준화 전 계약 변경 가능
오픈 이슈 1,115 별 대비 이슈 수가 큼. 에이전트 경로 드리프트·엣지 케이스가 계속 유입되는 신호
텔레메트리 기본 ON 기업망·규정 환경은 배포 스크립트에 DO_NOT_TRACK=1을 박을 것
다운로드 한도 직접 URL 기본 10MiB / 추출 25MiB / 파일 1000. 신뢰 소스에서만 상향
라이선스 MIT (Vercel, Inc. 2026). ThirdPartyNoticeText로 번들 고지. 스킬 콘텐츠 라이선스는 각 업스트림을 따로 볼 것

누가 도입해야 하는가

  • 맞다: Claude Code·Cursor·Codex·OpenCode 등을 섞어 쓰는 팀. 스킬을 git에 넣고 CI로 -y 재현 설치하고 싶은 조직. skills.sh/well-known으로 사내·오픈 카탈로그를 배포하려는 플랫폼 팀.
  • 보류: 에이전트 하나·스킬 소수만 쓰는 개인(수동 복사로 충분). Node 22를 아직 못 올리는 레거시 CI. 스킬 내용 자체의 품질·가드레일이 더 급한 팀(그때는 콘텐츠·정책이 병목).
  • 같이 보면 좋은 것: Agent Skills 스펙(agentskills.io), vercel-labs/agent-skills 공식 묶음, 10/09 mattpocock/skills 콘텐츠 심층, 컨텍스트 계층의 Context Mode/Headroom.

정리하면, vercel-labs/skills는 “에이전트에게 무엇을 가르칠지”가 아니라 “가르친 것을 79개 런타임에 같은 계약으로 심는 배관”이다. Trending 6위·주간 npm 480만이 말해 주듯, 2026년 에이전트 스택에서 설치·락·경로 매핑은 이미 인프라 문제다.