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)
Compatible Platforms any
Findings: ["메타데이터 경고: 권장 필드 없음: 'requirements' (SKILL.md v2 권장)", "메타데이터 경고: 권장 필드 없음: 'changelog' (SKILL.md v2 권장)", '정보: spec: usk/1.0 미선언 — v2 패키지로 처리됩니다. 자동 변환 및 에이전트 검색 기능을 사용하려면 USK v3로 업그레이드하세요.']
✅ No security risks found.
AI Review Stage
제공된 스킬 메타데이터와 정적 분석 결과를 바탕으로 보안 검수를 진행했습니다. 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 키 관리)과 기능이 일치하며, 잘 설계된 것으로 보입니다. **주의사항**: 실제 코드 파일이 제공되지 않아 직접적인 코드 검토는 불가능했습니다. 하지만 제공된 정적 분석 결과와 매우 제한적인 권한 선언을 바탕으로 판단했을 때, 이 스킬은 안전하며 위험 수준이 낮다고 평가됩니다.
Representative input/output examples for this skill. Agents can use these to understand how to invoke the skill and what output to expect.
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
}
All examples are also available via the agent API:
/v1/agent/skills/b7f40a38-3147-4626-937e-1f9d4a1ff620/schema
No reviews yet. Be the first to leave one!