curl -L -o i18n-keys-toolkit.skill "https://aiskillstore.io/v1/agent/skills/b7f40a38-3147-4626-937e-1f9d4a1ff620/download?platform=ClaudeCode"
{
"tool": "download_skill",
"arguments": {
"skill_id": "b7f40a38-3147-4626-937e-1f9d4a1ff620",
"platform": "ClaudeCode"
}
}
{
"mcpServers": {
"skill-store": {
"url": "https://aiskillstore.io/mcp/"
}
}
}
i18n/l10n key management toolkit — find missing/orphan keys, merge locales, sort, and report translation coverage (zero dependencies)
호환 플랫폼: any
검사 결과: ["메타데이터 경고: 권장 필드 없음: 'requirements' (SKILL.md v2 권장)", "메타데이터 경고: 권장 필드 없음: 'changelog' (SKILL.md v2 권장)", '정보: spec: usk/1.0 미선언 — v2 패키지로 처리됩니다. 자동 변환 및 에이전트 검색 기능을 사용하려면 USK v3로 업그레이드하세요.']
✅ 보안 위험 항목이 발견되지 않았습니다.
AI 검수 단계
제공된 스킬 메타데이터와 정적 분석 결과를 바탕으로 보안 검수를 진행했습니다. 1. **선언된 권한 (Permissions)**: 스킬은 `network: false`, `filesystem: false`, `subprocess: false`로 매우 제한적인 권한을 선언하고 있습니다. 이는 외부 통신, 파일 시스템 접근, 외부 프로그램 실행 등 잠재적 위험이 있는 모든 행위를 차단하므로, 스킬의 공격 표면이 극도로 작습니다. 환경 변수 접근도 선언되지 않았습니다. 2. **악의적 목적 코드**: 정적 분석 결과는 `status: "approved"`, `red_flags_found: []`, `obfuscation_warnings: []`, `forbidden_exec_files_found: []`를 보고하고 있습니다. 이는 코드 내에 악의적인 목적의 코드(데이터 탈취, 시스템 파괴, 난독화 등)가 없음을 시사합니다. 3. **선언되지 않은 외부 통신**: `network: false`로 선언되어 있으며, 정적 분석 결과에서도 외부 통신에 대한 경고가 없습니다. 따라서 선언되지 않은 외부 통신은 없을 것으로 판단됩니다. 4. **사용자 데이터 무단 수집/전송**: 스킬은 i18n 키 관리라는 명확한 목적을 가지고 있으며, 입력으로 받은 `locales` 및 `source_code` 데이터를 처리합니다. `network: false` 권한으로 인해 사용자 데이터를 외부로 무단 전송할 수 없습니다. 5. **코드 품질 및 목적 일치**: 스킬의 메타데이터, 입력/출력 스키마, 예시가 매우 상세하고 명확하게 정의되어 있습니다. 'zero dependencies'를 명시하여 의존성으로 인한 잠재적 위험도 줄였습니다. 스킬의 목적(i18n/l10n 키 관리)과 기능이 일치하며, 잘 설계된 것으로 보입니다. **주의사항**: 실제 코드 파일이 제공되지 않아 직접적인 코드 검토는 불가능했습니다. 하지만 제공된 정적 분석 결과와 매우 제한적인 권한 선언을 바탕으로 판단했을 때, 이 스킬은 안전하며 위험 수준이 낮다고 평가됩니다.
이 스킬의 대표적인 입출력 예시입니다. 에이전트는 이 예시를 보고 스킬 호출 방법과 결과 형태를 이해할 수 있습니다.
Compare en base locale against ko to find untranslated keys
{
"action": "find_missing_keys",
"base_locale": "en",
"locales": {
"en": {
"error": {
"notFound": "Page not found"
},
"login": {
"button": "Sign In",
"title": "Login"
},
"welcome": "Welcome"
},
"ko": {
"login": {
"title": "\ub85c\uadf8\uc778"
},
"welcome": "\ud658\uc601\ud569\ub2c8\ub2e4"
}
}
}
{
"action": "find_missing_keys",
"ok": true,
"result": {
"base_locale": "en",
"missing_by_locale": {
"ko": [
"login.button",
"error.notFound"
]
},
"missing_count": {
"ko": 2
},
"total_base_keys": 4
}
}
Find translation keys that appear in locale JSON but not in source code
{
"action": "find_orphan_keys",
"locales": {
"en": {
"another_orphan": "Also unused",
"login_title": "Login",
"unused_key": "Never used",
"welcome": "Welcome"
}
},
"source_code": "t(\u0027welcome\u0027) t(\u0027login_title\u0027) // some code"
}
{
"action": "find_orphan_keys",
"ok": true,
"result": {
"orphan_count": 2,
"orphan_keys": [
"unused_key",
"another_orphan"
],
"total_keys": 4,
"used_keys": [
"welcome",
"login_title"
]
}
}
Merge ko-base and ko-override with override_wins strategy
{
"action": "merge_locales",
"locales": {
"base": {
"login": {
"button": "\ub85c\uadf8\uc778 \ud558\uae30",
"title": "\ub85c\uadf8\uc778"
},
"welcome": "\ud658\uc601\ud569\ub2c8\ub2e4"
},
"override": {
"login": {
"button": "\uc2dc\uc791\ud558\uae30"
},
"signup": "\ud68c\uc6d0\uac00\uc785"
}
},
"merge_strategy": "override_wins"
}
{
"action": "merge_locales",
"ok": true,
"result": {
"conflicts_resolved": 1,
"keys_added": 1,
"merged": {
"login": {
"button": "\uc2dc\uc791\ud558\uae30",
"title": "\ub85c\uadf8\uc778"
},
"signup": "\ud68c\uc6d0\uac00\uc785",
"welcome": "\ud658\uc601\ud569\ub2c8\ub2e4"
},
"strategy": "override_wins"
}
}
Sort locale JSON keys alphabetically
{
"action": "sort_keys",
"locales": {
"en": {
"apple": "A",
"banana": "B",
"mango": "M",
"zebra": "Z"
}
}
}
{
"action": "sort_keys",
"ok": true,
"result": {
"locales_processed": 1,
"sorted_locales": {
"en": {
"apple": "A",
"banana": "B",
"mango": "M",
"zebra": "Z"
}
}
}
}
Generate coverage percentage per locale vs base
{
"action": "report_coverage",
"base_locale": "en",
"locales": {
"en": {
"login": "Login",
"logout": "Logout",
"signup": "Sign Up",
"welcome": "Welcome"
},
"ja": {
"login": "\u30ed\u30b0\u30a4\u30f3",
"logout": "\u30ed\u30b0\u30a2\u30a6\u30c8",
"signup": "\u30b5\u30a4\u30f3\u30a2\u30c3\u30d7",
"welcome": "\u3088\u3046\u3053\u305d"
},
"ko": {
"login": "\ub85c\uadf8\uc778",
"welcome": "\ud658\uc601\ud569\ub2c8\ub2e4"
}
}
}
{
"action": "report_coverage",
"ok": true,
"result": {
"base_locale": "en",
"coverage": {
"ja": {
"coverage_percent": 100.0,
"missing": 0,
"missing_keys": [],
"translated": 4
},
"ko": {
"coverage_percent": 50.0,
"missing": 2,
"missing_keys": [
"logout",
"signup"
],
"translated": 2
}
},
"overall_health": "partial",
"total_base_keys": 4
}
}
Handle nested locale JSON with dot notation paths
{
"action": "find_missing_keys",
"base_locale": "en",
"locales": {
"en": {
"footer": {
"contact": "Contact"
},
"nav": {
"about": "About",
"home": "Home"
}
},
"ko": {
"nav": {
"home": "\ud648"
}
}
}
}
{
"action": "find_missing_keys",
"ok": true,
"result": {
"missing_by_locale": {
"ko": [
"nav.about",
"footer.contact"
]
},
"total_base_keys": 3
}
}
Returns error when locales is not a valid object
{
"action": "find_missing_keys",
"locales": "not an object"
}
{
"error": {
"code": "INVALID_PARAM",
"message": "Field \u0027locales\u0027 must be an object mapping locale names to translation JSONs"
},
"ok": false
}
모든 예시는 에이전트 API로도 조회 가능:
/v1/agent/skills/b7f40a38-3147-4626-937e-1f9d4a1ff620/schema
아직 리뷰가 없습니다. 첫 번째 리뷰를 남겨보세요!