{"_id":"@dweax/wea-skills","_rev":"2-6f175296c9fa2b054e3c1cad6b016383","name":"@dweax/wea-skills","dist-tags":{"latest":"1.1.0"},"versions":{"1.0.0":{"name":"@dweax/wea-skills","version":"1.0.0","license":"UNLICENSED","_id":"@dweax/wea-skills@1.0.0","maintainers":[{"name":"dweax-rnd","email":"dayeon@dweax.com"}],"bin":{"wea-skills":"dist/index.js"},"dist":{"shasum":"3ccd2d8017bb352fadc00d3ddc47b4248fffcf16","tarball":"https://registry.npmjs.org/@dweax/wea-skills/-/wea-skills-1.0.0.tgz","fileCount":3,"integrity":"sha512-gXSSjZRR6anm5qziBrysi+Bxfqa2itCj17pXUQS0UI392JziUq7YOL1m5BhroRstr+ZRZwJkqm5BesdHwJdtFw==","signatures":[{"sig":"MEYCIQCfKiJKBYCrDJsqi3wZNHg3i/6EYa2iv34iQMB8c6w7iAIhAKUT9VQu15IozoKbMl19AhJqJcKbHhQ9FRyAyf+h/DRO","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":380861},"engines":{"node":">=18"},"scripts":{"test":"vitest run","build":"esbuild src/index.ts --bundle --platform=node --format=cjs --target=node18 --outfile=dist/index.js \"--banner:js=#!/usr/bin/env node\"","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"dweax-rnd","email":"dayeon@dweax.com"},"_npmVersion":"11.16.0","description":"WEA Skills 레지스트리 CLI — 스킬·MCP 서버 검색/설치/등록","directories":{},"_nodeVersion":"24.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"yazl":"^3.3.1","yauzl":"^2.10.0","vitest":"^3.1.0","esbuild":"^0.25.0","commander":"^13.1.0","typescript":"^5.8.0","@types/node":"^20.17.0","@types/yazl":"^3.3.1","gray-matter":"^4.0.3","@types/yauzl":"^2.10.3","@dweax/wea-skills-shared":"workspace:*"},"_npmOperationalInternal":{"tmp":"tmp/wea-skills_1.0.0_1786408214107_0.13854729401482113","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@dweax/wea-skills","version":"1.1.0","description":"WEA Skills 레지스트리 CLI — 스킬·MCP 서버 검색/설치/등록","license":"UNLICENSED","bin":{"wea-skills":"dist/index.js"},"publishConfig":{"access":"public"},"engines":{"node":">=18"},"scripts":{"build":"esbuild src/index.ts --bundle --platform=node --format=cjs --target=node18 --outfile=dist/index.js \"--banner:js=#!/usr/bin/env node\"","typecheck":"tsc -p tsconfig.json --noEmit","test":"vitest run","prepublishOnly":"npm run build"},"devDependencies":{"@dweax/wea-skills-shared":"workspace:*","@types/node":"^20.17.0","@types/yauzl":"^2.10.3","@types/yazl":"^3.3.1","commander":"^13.1.0","esbuild":"^0.25.0","gray-matter":"^4.0.3","typescript":"^5.8.0","vitest":"^3.1.0","yauzl":"^2.10.0","yazl":"^3.3.1"},"gitHead":"ce1142f07cd78b9302fca3716e9464686aaefe28","_id":"@dweax/wea-skills@1.1.0","_nodeVersion":"24.18.0","_npmVersion":"11.16.0","dist":{"integrity":"sha512-NVLnF1u5vK9bSmOjr0t9Ne/O5kJjdVpPvAifr8KViYqBhcA8s7443KmOxfPDv02yzI6HMOh5zs8P68wGEtzlmw==","shasum":"1a0b32994d1166c5db35ea8b309dea0ae5b775ab","tarball":"https://registry.npmjs.org/@dweax/wea-skills/-/wea-skills-1.1.0.tgz","fileCount":3,"unpackedSize":384544,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQD+ZySLXhTB6YLyIFpo/OjGUPvVDelJ+3CXbmUNbfFg+AIgHVXdLWvuX1Kzl5LqhTPWaVOCkyNtshxryB7I3PTexe0="}]},"_npmUser":{"name":"dweax-rnd","email":"dayeon@dweax.com"},"directories":{},"maintainers":[{"name":"dweax-rnd","email":"dayeon@dweax.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/wea-skills_1.1.0_1787638554131_0.35542603583126864"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-11T00:30:13.938Z","modified":"2026-08-25T06:15:54.475Z","1.0.0":"2026-08-11T00:30:14.267Z","1.1.0":"2026-08-25T06:15:54.286Z"},"license":"UNLICENSED","description":"WEA Skills 레지스트리 CLI — 스킬·MCP 서버 검색/설치/등록","maintainers":[{"name":"dweax-rnd","email":"dayeon@dweax.com"}],"readme":"# @dweax/wea-skills — WEA Skills CLI\n\nWEA Skills 레지스트리의 커맨드라인 도구입니다. SKILL.md 표준 스킬과 MCP 서버를 터미널에서 검색·설치·등록합니다.\n\n```bash\nnpx @dweax/wea-skills search pdf                     # 검색 (스킬 + MCP 서버)\nnpx @dweax/wea-skills install @dweax/docx            # 스킬 설치 (해시 검증 포함)\nnpx @dweax/wea-skills install @dweax/context7        # MCP 서버 → .mcp.json 항목 출력\nnpx @dweax/wea-skills publish --id @dweax/my-skill   # 등록\n```\n\n> 이 CLI는 레지스트리 API를 호출하는 클라이언트입니다. **레지스트리 주소는 조직 내부에서 안내받아** `login --registry <주소>`로 한 번 저장하면 이후 생략할 수 있습니다.\n\n---\n\n## 요구 사항\n\n- Node.js 18 이상 (런타임 의존성 없음 — 단일 번들)\n- 접근 가능한 WEA Skills 레지스트리 서버 (기본값: `http://localhost:3001`)\n\n---\n\n## 명령어\n\n### `login` — API 토큰 확인 후 저장\n\n```bash\nnpx @dweax/wea-skills login                    # 토큰을 숨김 입력으로 질문\nnpx @dweax/wea-skills login --token skh_...    # 비대화형 (CI 등)\n```\n\n저장하기 전에 레지스트리에 토큰을 확인하고, **누구의 토큰이며 무엇을 할 수 있는지** 보여줍니다.\n\n```\n로그인 완료 — me@dweax.com\n  권한        조회·설치·등록 (read, publish)\n  토큰        cli\n  레지스트리   https://skillhub.example.com\n  저장 위치    ~/.skillhub/config.json (본인만 읽기 가능 · 파일 권한 0600)\n```\n\n- 토큰은 웹 UI **`/me/tokens`** 에서 발급합니다. 원문(`skh_...`)은 발급 순간 한 번만 표시되니 그때 복사하세요.\n- 등록(publish)까지 하려면 **publish 권한이 포함된 토큰**이어야 합니다. 검색·설치만 하면 read 토큰으로 충분합니다 — 위 **권한** 줄로 구분할 수 있습니다.\n- 토큰이 거부되면(오타·폐기·만료) **저장하지 않고 실패**합니다. 레지스트리에 연결하지 못하면 저장하되 확인하지 못했다고 알립니다.\n- 저장 위치: `~/.skillhub/config.json` — **파일 권한** 0600(본인만 읽기)으로 강제합니다. 토큰이 평문으로 담기기 때문이며, 토큰 자체의 권한(read/publish)과는 다른 이야기입니다.\n- `--registry`를 함께 주면 레지스트리 주소도 설정 파일에 저장됩니다:\n\n```bash\nnpx @dweax/wea-skills login --token skh_... --registry https://skillhub.example.com\n```\n\n### `search` — 스킬·MCP 서버 검색\n\n```bash\nnpx @dweax/wea-skills search <검색어> [--scope <scope>] [--type skill|mcp] [--limit <n>]\n```\n\n| 옵션 | 설명 | 기본값 |\n|---|---|---|\n| `--scope <scope>` | 특정 스코프로 필터 (`@` 붙여도, 빼도 됨) | 전체 |\n| `--type <type>` | 유형으로 필터 (`skill` \\| `mcp`) | 둘 다 |\n| `--limit <n>` | **유형별** 최대 결과 수 | 20 |\n\n- **두 유형을 함께 찾습니다.** 유형은 필터일 뿐 별도 명령이 아닙니다 — 웹 통합 목록과 같은 규칙입니다.\n- 검색 대상은 **표시 이름과 설명**입니다 (부분 일치, 대소문자 무시). 식별자 slug나 SKILL.md 본문은 검색하지 않습니다.\n- 정렬은 **유형별 상위부터 번갈아** 섞습니다. 두 유형의 인기 지표가 다르므로(스킬=다운로드 수, MCP=참조 스킬 수) 하나의 순위로 비교하지 않고 각 유형 안의 순위만 씁니다.\n- 한쪽 유형 조회가 실패해도 나머지 결과는 보여주고 경고를 남깁니다(\"결과 없음\"과 구분되도록).\n\n```\n$ npx @dweax/wea-skills search 문서\n[스킬]      @dweax/docx             v1       docx — Word 문서 생성·편집…\n[MCP 서버]  @dweax/context7         v1.0.22  Context7 — 라이브러리 문서 조회\n[스킬]      @dweax/medical-summary  v3       의료문서 요약 — 진료기록을 표준 양식으로…\n\n3건 — 설치: wea-skills install @scope/name\n```\n\n### `install` — 스킬·MCP 서버 설치\n\n```bash\nnpx @dweax/wea-skills install @scope/name              # 최신 버전\nnpx @dweax/wea-skills install @scope/name@3            # 버전 핀 (순번) — 스킬 전용\nnpx @dweax/wea-skills install @scope/name@sha256:...   # 해시 핀 (가장 엄격 — 내용 자체를 고정)\n```\n\n유형은 자동으로 판별합니다 — 스킬을 먼저 찾고, 없으면 MCP 서버로 다시 찾습니다(`--type`으로 못박을 수 있습니다).\n\n| 옵션 | 설명 |\n|---|---|\n| `--type <type>` | 유형 명시 (`skill` \\| `mcp`) |\n| `--dir <path>` | [스킬] 설치 대상 폴더 지정 |\n| `--force` | 이미 있으면 덮어쓰기 (스킬은 폴더, MCP는 `.mcp.json` 항목) |\n| `--yes` | [스킬] 대상 폴더 생성 질문에 자동으로 \"예\" |\n| `--write` | [MCP] 출력 대신 현재 폴더의 `.mcp.json`에 병합 |\n| `--provision <key>` | [MCP] 제공 형태 선택 (`pkg:npm:...` · `remote:streamable-http:...`) |\n\n**설치 위치 결정 순서** (`--dir` 미지정 시):\n\n1. `--dir <path>` (지정 시 항상 우선)\n2. 설정 파일의 `installDir`\n3. 현재 디렉토리의 `./.claude/skills` (존재하면 — 프로젝트 스킬)\n4. `~/.claude/skills` (존재하면 — 개인 스킬. 없으면 생성 여부를 물어봄)\n\n스킬은 `{대상 폴더}/{스킬이름}/` 폴더로 배치됩니다.\n\n#### MCP 서버를 설치할 때\n\nMCP 서버는 **받을 파일이 없습니다.** \"설치\"는 에이전트 설정 파일(`.mcp.json`)에 서버 항목을 추가하는 일이므로, CLI는 **붙여넣을 수 있는 설정을 출력**합니다. `--write`를 줘야 파일을 건드립니다 — 남의 설정 파일을 묻지 않고 고치지 않습니다.\n\n```\n$ npx @dweax/wea-skills install @dweax/context7\nMCP 서버 \"context7\" — 아래를 .mcp.json에 붙여넣으세요 (--write로 자동 병합):\n\n{\n  \"mcpServers\": {\n    \"context7\": { \"command\": \"npx\", \"args\": [\"-y\", \"@upstash/context7-mcp@1.0.22\"] }\n  }\n}\n\n제공 형태: pkg:npm:@upstash/context7-mcp\n다른 형태도 있습니다 — --provision 으로 선택: remote:streamable-http:https://mcp.context7.com/mcp\n```\n\n- **비밀값은 자리표시자로만 나옵니다** (`<필수 입력>`·`<선택>`). 레지스트리도 CLI도 값을 저장하지 않습니다 — 채우는 건 사용자 몫입니다.\n- `--write`는 파일의 **다른 서버 설정과 나머지 키를 보존**하고, 같은 이름이 이미 있으면 `--force` 없이는 덮어쓰지 않습니다. 파일이 깨진 JSON이면 덮어쓰지 않고 멈춥니다.\n- CLI가 커맨드를 만들 수 없는 형태(nuget·cargo·mcpb 등)는 **추측하지 않고** 형태를 밝힌 뒤 웹 상세로 안내합니다.\n- MCP 서버에는 버전·해시 핀 설치가 없습니다(설정 항목은 매니페스트 최신본에서 나옵니다).\n\n**무결성 검증**(스킬): 다운로드한 패키지를 해제한 뒤 contentHash를 로컬에서 재계산해 서버 선언값(해시 핀을 줬다면 그 값)과 대조합니다. **불일치하면 파일을 하나도 쓰지 않고 중단**하므로, 손상되거나 변조된 스킬이 조용히 설치되는 일은 없습니다.\n\n### `publish` — 스킬 등록\n\n```bash\ncd my-skill/\nnpx @dweax/wea-skills publish                          # 현재 디렉토리, frontmatter x-registry-id 사용\nnpx @dweax/wea-skills publish --id @dweax/my-skill    # 식별자 명시\nnpx @dweax/wea-skills publish ./path/to/skill --id @dweax/my-skill\n```\n\n- 사전 조건: `login` 완료 (publish 권한 토큰), 그리고 식별자의 **스코프가 본인 소유**여야 합니다 (가입 때 만든 핸들 — 남의 스코프는 403, 없는 스코프는 404).\n- 스킬 폴더 요건: 루트에 `SKILL.md`, frontmatter에 `name`·`description` 필수. 패키지 20MB / 파일당 5MB / 500개 이내, 실행 바이너리 불가. `.git/`·`node_modules/`·`.DS_Store`·숨김 디렉토리는 자동 제외.\n- 같은 식별자로 다시 등록하면 **새 버전**(v2, v3…)이 됩니다. 내용이 완전히 같으면 409로 거부됩니다.\n- 성공 시 버전 번호와 contentHash를 출력합니다.\n\n```\n$ npx @dweax/wea-skills publish --id @dweax/my-skill\n등록 완료: @dweax/my-skill v2\ncontentHash: sha256:6299358a...\n```\n\n---\n\n## 공통 옵션·설정\n\n### `--registry <url>`\n\n모든 명령에서 레지스트리 주소를 일회성으로 재정의합니다. 우선순위:\n\n```\n--registry 옵션  >  설정 파일(registry)  >  내장 기본값 (현재 http://localhost:3001)\n```\n\n### 설정 파일: `~/.skillhub/config.json`\n\n```json\n{\n  \"registry\": \"https://skillhub.example.com\",\n  \"token\": \"skh_...\",\n  \"installDir\": \"/Users/me/.claude/skills\"\n}\n```\n\n| 키 | 설명 |\n|---|---|\n| `registry` | 기본 레지스트리 URL |\n| `token` | API 토큰 (login이 기록) |\n| `installDir` | install 기본 대상 폴더 (수동 편집으로 지정) |\n\n- 토큰이 평문으로 담기므로 **파일 권한** 0600(본인만 읽기)이 강제됩니다.\n- 환경변수 `SKILLHUB_CONFIG_DIR`로 설정 폴더 위치를 바꿀 수 있습니다 (CI·테스트용).\n\n---\n\n## 문제 해결\n\n| 증상 | 원인·해결 |\n|---|---|\n| `연결할 수 없습니다` / 결과가 비어 있음 | 레지스트리 주소가 기본값(`http://localhost:3001`)일 수 있습니다. `login --registry <주소>`로 한 번 저장하세요. |\n| `비공개 레지스트리입니다 — 인증이 필요합니다` | 레지스트리가 비공개 모드입니다. `login`으로 토큰을 저장하세요. |\n| `API 토큰이 필요합니다` / `유효하지 않은 토큰입니다` | 토큰 미저장·폐기·만료. 웹 `/me/tokens`에서 재발급 후 `login`. |\n| `publish 권한이 없는 토큰입니다` | read 전용 토큰입니다. publish 포함 토큰으로 재발급. |\n| `존재하지 않는 스코프: @xxx` | 식별자의 스코프는 가입 때 만든 **본인 핸들**이어야 합니다. 임의 스코프는 만들 수 없습니다. |\n| `@xxx 스코프에 등록할 권한이 없습니다` | 남의 스코프입니다. 본인 스코프로 등록하세요. |\n| `동일한 contentHash의 버전이 이미 등록되어 있습니다` | 내용 변경 없이 재등록했습니다. 파일을 수정한 뒤 다시 등록하세요. |\n| `contentHash 불일치 — 설치를 중단합니다` | 전송 오류 또는 변조 신호. 재시도 후에도 같으면 관리자에게 알리세요. |\n| `이미 존재합니다: ... (덮어쓰려면 --force)` | 설치 폴더에 같은 스킬이 있습니다. `--force`로 재설치. |\n\n모든 오류는 `오류: <사유>` 형식으로 출력되고 종료 코드 1로 끝납니다 (CI에서 실패 감지 가능).\n","readmeFilename":"README.md"}