Rule-based writing style rewriter — 8 presets (Korean/English), formality detection, consistency analysis, fully offline / 룰 기반 문체 변환기 — 8종 프리셋, 격식도 감지, 일관성 분석, 완전 오프라인
호환 플랫폼: any
✅ 보안 위험 항목이 발견되지 않았습니다.
AI 검수 단계
제출된 스킬 패키지의 메타데이터와 코드 파일을 면밀히 검토했습니다. 1. **권한 일치 여부**: 메타데이터에 'network: false', 'filesystem: false', 'subprocess: false'로 명시되어 있으며, 실제 코드에서도 외부 네트워크 통신, 파일 시스템 접근(경로 조작을 위한 `os.path` 사용은 허용), 서브프로세스 실행과 관련된 어떠한 코드도 발견되지 않았습니다. `sys.path.insert(0, _HERE)`와 `sys.stdout.reconfigure` 등은 시스템 경로 조작 및 인코딩 설정으로, 선언된 권한을 위반하지 않는 안전한 동작입니다. 2. **악의적 코드 여부**: 데이터 탈취, 시스템 파괴, 난독화 등 악의적인 목적을 가진 코드는 발견되지 않았습니다. 모든 로직은 입력 텍스트를 기반으로 한 룰 기반의 문자열 처리 및 분석에 집중되어 있습니다. 3. **외부 통신 여부**: 코드 내에서 `requests`, `socket`, `urllib` 등 외부 통신을 시도하는 모듈이나 함수 호출은 전혀 없습니다. 'fully offline'이라는 설명과 일치합니다. 4. **사용자 데이터 수집/전송**: 스킬은 표준 입력(stdin)으로 데이터를 받아 처리하고, 표준 출력(stdout)으로 결과를 반환하는 `stdin_stdout` 패턴을 따릅니다. 사용자 데이터를 무단으로 수집하거나 외부로 전송하는 기능은 없습니다. 5. **코드 품질**: 코드는 명확하게 작성되어 있으며, 각 모듈은 문체 감지, 변환, 비교, 일관성 분석 등 스킬의 목적에 부합하는 기능을 수행합니다. `MAX_TEXT_BYTES`와 같은 입력 크기 제한은 잠재적인 리소스 고갈 공격을 방지하는 좋은 보안 관행입니다. 또한, 외부 Python 패키지 의존성이 없어(requirements.python_packages: []) 공급망 공격 위험도 없습니다. 정적 분석 결과도 'approved' 상태로, 추가적인 레드 플래그나 난독화 경고가 없음을 확인했습니다. 전반적으로 매우 안전하며 신뢰할 수 있는 스킬로 판단됩니다.
이 스킬의 대표적인 입출력 예시입니다. 에이전트는 이 예시를 보고 스킬 호출 방법과 결과 형태를 이해할 수 있습니다.
입력 텍스트의 격식도, 톤, 한국어 존댓말 등급을 분석합니다. / Analyzes formality, tone, and Korean speech level.
{
"action": "detect_style",
"language": "ko",
"text": "\uc548\ub155\ud558\uc138\uc694. \uc624\ub298 \ud68c\uc758\uc5d0\uc11c \ub17c\uc758\ub41c \uc0ac\ud56d\uc744 \uacf5\uc720\ud574 \ub4dc\ub9bd\ub2c8\ub2e4. \ucd94\uac00 \ubb38\uc758 \uc0ac\ud56d\uc774 \uc788\uc73c\uc2dc\uba74 \uc5b8\uc81c\ub4e0\uc9c0 \uc5f0\ub77d \uc8fc\uc138\uc694."
}
{
"action": "detect_style",
"style_profile": {
"avg_sentence_length": 8.3,
"detected_language": "ko",
"formality_label": "\uc911\uac04 \uaca9\uc2dd\uccb4 (\ud574\uc694\uccb4)",
"formality_score": 72,
"korean_speech_level": "haeyoche",
"signals": [
{
"type": "korean_ending",
"value": "\ud574\uc694\uccb4 \uc5b4\ubbf8 \uac10\uc9c0",
"weight": 40
},
{
"type": "polite_phrase",
"value": "\uacf5\uc720\ud574 \ub4dc\ub9bd\ub2c8\ub2e4",
"weight": 20
}
],
"tone": "neutral",
"voice": "active"
}
}
해요체 텍스트를 비즈니스 공식 문서용 하십시오체로 변환합니다. / Converts haeyoche to formal hasipsio-che for business documents.
{
"action": "rewrite",
"language": "ko",
"preset": "formal_korean",
"text": "\uc548\ub155\ud558\uc138\uc694. \uc774\ubc88 \ubd84\uae30 \uc2e4\uc801\uc774 \uc608\uc0c1\ubcf4\ub2e4 \uc88b\uc558\uc5b4\uc694. \ub2e4\uc74c \ub2e8\uacc4\ub85c \ub118\uc5b4\uac00\ub3c4 \ub420\uae4c\uc694?"
}
{
"action": "rewrite",
"disclaimer": "\ub8f0 \uae30\ubc18 \ubcc0\ud658\uc774\ubbc0\ub85c \ubb38\ub9e5\uc5d0 \ub530\ub77c \uc77c\ubd80 \ud45c\ud604\uc774 \uc790\uc5f0\uc2a4\ub7fd\uc9c0 \uc54a\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc911\uc694 \ubb38\uc11c\ub294 \uc0ac\ub78c\uc774 \ucd5c\uc885 \uac80\ud1a0\ud558\uc138\uc694. / Rule-based conversion; some expressions may not be perfectly natural. Human review recommended for critical documents.",
"rewritten_text": "\uc548\ub155\ud558\uc2ed\ub2c8\uae4c. \uc774\ubc88 \ubd84\uae30 \uc2e4\uc801\uc774 \uc608\uc0c1\ubcf4\ub2e4 \uc6b0\uc218\ud558\uc600\uc2b5\ub2c8\ub2e4. \ub2e4\uc74c \ub2e8\uacc4\ub85c \uc9c4\ud589\ud558\uc5ec\ub3c4 \ub418\uaca0\uc2b5\ub2c8\uae4c?",
"transform_log": [
{
"description": "\ud574\uc694\uccb4\u2192\ud558\uc2ed\uc2dc\uc624\uccb4 \uc5b4\ubbf8 \ubcc0\ud658",
"fix_hint": {
"action": "ending_conversion",
"from": "haeyoche",
"to": "hasipsio"
},
"original_fragment": "\uc548\ub155\ud558\uc138\uc694",
"replacement": "\uc548\ub155\ud558\uc2ed\ub2c8\uae4c",
"rule_id": "KO_F01"
},
{
"description": "\ud615\uc6a9\uc0ac \uc11c\uc220 \uaca9\uc2dd\ud654",
"fix_hint": {
"action": "lexical_formalization"
},
"original_fragment": "\uc88b\uc558\uc5b4\uc694",
"replacement": "\uc6b0\uc218\ud558\uc600\uc2b5\ub2c8\ub2e4",
"rule_id": "KO_F02"
}
]
}
딱딱한 공식 문서체를 고객 대응에 적합한 해요체로 변환합니다. / Converts formal text to friendly haeyoche suitable for customer communication.
{
"action": "rewrite",
"language": "ko",
"preset": "friendly_korean",
"text": "\uadc0\ud558\uc758 \ubb38\uc758 \uc0ac\ud56d\uc744 \uc811\uc218\ud558\uc600\uc2b5\ub2c8\ub2e4. \ub2f4\ub2f9\uc790\uac00 \uc2e0\uc18d\ud788 \ucc98\ub9ac\ud558\uc5ec \ud68c\uc2e0 \ub4dc\ub9ac\uaca0\uc2b5\ub2c8\ub2e4."
}
{
"action": "rewrite",
"disclaimer": "\ub8f0 \uae30\ubc18 \ubcc0\ud658\uc774\ubbc0\ub85c \ubb38\ub9e5\uc5d0 \ub530\ub77c \uc77c\ubd80 \ud45c\ud604\uc774 \uc790\uc5f0\uc2a4\ub7fd\uc9c0 \uc54a\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4. / Rule-based; human review recommended.",
"rewritten_text": "\ubb38\uc758\ud574 \uc8fc\uc154\uc11c \uac10\uc0ac\ud574\uc694. \ub2f4\ub2f9\uc790\uac00 \ube60\ub974\uac8c \ud655\uc778\ud574\uc11c \uc5f0\ub77d \ub4dc\ub9b4\uac8c\uc694.",
"transform_log": [
{
"description": "\ud558\uc2ed\uc2dc\uc624\uccb4\u2192\ud574\uc694\uccb4 \ubcc0\ud658 + \uac10\uc0ac \ud45c\ud604 \ucd94\uac00",
"fix_hint": {
"action": "ending_conversion",
"from": "hasipsio",
"to": "haeyoche"
},
"original_fragment": "\uc811\uc218\ud558\uc600\uc2b5\ub2c8\ub2e4",
"replacement": "\uac10\uc0ac\ud574\uc694",
"rule_id": "KO_FN01"
},
{
"description": "\uaca9\uc2dd \uc5b4\ud718 \uc644\ud654",
"fix_hint": {
"action": "lexical_softening"
},
"original_fragment": "\uc2e0\uc18d\ud788",
"replacement": "\ube60\ub974\uac8c",
"rule_id": "KO_FN02"
}
]
}
마케팅 감성 문구를 정확하고 간결한 기술 문서 스타일로 변환합니다. / Converts marketing copy to precise, concise technical documentation style.
{
"action": "rewrite",
"language": "ko",
"preset": "technical",
"text": "\uc6b0\ub9ac\uc758 \ud601\uc2e0\uc801\uc778 \uc194\ub8e8\uc158\uc740 \ub180\ub77c\uc6b4 \uc131\ub2a5\uc744 \uc790\ub791\ud558\uba70, \ubaa8\ub4e0 \ubb38\uc81c\ub97c \uc644\ubcbd\ud558\uac8c \ud574\uacb0\ud574 \ub4dc\ub9bd\ub2c8\ub2e4!"
}
{
"action": "rewrite",
"disclaimer": "\ub8f0 \uae30\ubc18 \ubcc0\ud658\uc774\ubbc0\ub85c \ubb38\ub9e5\uc5d0 \ub530\ub77c \uc77c\ubd80 \ud45c\ud604\uc774 \uc790\uc5f0\uc2a4\ub7fd\uc9c0 \uc54a\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4. / Rule-based; human review recommended.",
"rewritten_text": "\ubcf8 \uc194\ub8e8\uc158\uc740 \ub192\uc740 \ucc98\ub9ac \uc131\ub2a5\uc744 \uc81c\uacf5\ud558\uba70, \uc8fc\uc694 \ubb38\uc81c\ub97c \uccb4\uacc4\uc801\uc73c\ub85c \ud574\uacb0\ud569\ub2c8\ub2e4.",
"transform_log": [
{
"description": "\uacfc\uc7a5 \ud45c\ud604 \uc81c\uac70",
"fix_hint": {
"action": "remove_hyperbole"
},
"original_fragment": "\ud601\uc2e0\uc801\uc778",
"replacement": "",
"rule_id": "TECH01"
},
{
"description": "\uac10\ud0c4\ubd80\ud638 \uc81c\uac70",
"fix_hint": {
"action": "remove_exclamation"
},
"original_fragment": "!",
"replacement": ".",
"rule_id": "TECH02"
},
{
"description": "\ubaa8\ud638\ud55c \uac15\uc870\uc5b4 \uc81c\uac70",
"fix_hint": {
"action": "replace_vague_intensifier"
},
"original_fragment": "\ub180\ub77c\uc6b4",
"replacement": "\ub192\uc740",
"rule_id": "TECH03"
}
]
}
원본과 변환본의 격식도 변화, 추가/삭제 신호어, 의미 보존도를 분석합니다. / Analyzes formality change, added/removed signals, and meaning preservation between original and rewrite.
{
"action": "compare",
"language": "ko",
"rewritten": "\uc774\ubc88 \ubd84\uae30 \uc2e4\uc801\uc774 \uc6b0\uc218\ud558\uc600\uc2b5\ub2c8\ub2e4. \ud300\uc6d0 \ubaa8\ub450\uc758 \ub178\uace0\uc5d0 \uac10\uc0ac\ub4dc\ub9bd\ub2c8\ub2e4.",
"text": "\uc774\ubc88 \ubd84\uae30 \uc2e4\uc801\uc774 \uc88b\uc558\uc5b4\uc694. \ud300 \ubaa8\ub450 \uace0\uc0dd \ub9ce\uc558\uc5b4\uc694."
}
{
"action": "compare",
"comparison": {
"added_signals": [
"\uc6b0\uc218\ud558\uc600\uc2b5\ub2c8\ub2e4",
"\uac10\uc0ac\ub4dc\ub9bd\ub2c8\ub2e4"
],
"formality_delta": 40,
"original_profile": {
"formality_score": 45,
"korean_speech_level": "haeyoche",
"tone": "warm"
},
"removed_signals": [
"\uc88b\uc558\uc5b4\uc694",
"\uace0\uc0dd \ub9ce\uc558\uc5b4\uc694"
],
"rewritten_profile": {
"formality_score": 85,
"korean_speech_level": "hasipsio",
"tone": "authoritative"
},
"summary": "\uaca9\uc2dd\ub3c4\uac00 40\uc810 \uc0c1\uc2b9\ud558\uc600\uc2b5\ub2c8\ub2e4. \ud1a0\ud070 \uc720\uc0ac\ub3c4 0.52 \u2014 \uc758\ubbf8\uc758 \uc0c1\ub2f9 \ubd80\ubd84\uc774 \ubcf4\uc874\ub41c \uac83\uc73c\ub85c \ucd94\uc815\ub429\ub2c8\ub2e4.",
"token_jaccard": 0.52
}
}
한 문서 내에서 문체가 일관되지 않은 문단을 감지하고 수정 제안을 반환합니다. / Detects paragraphs with inconsistent style and returns suggestions.
{
"action": "analyze_consistency",
"language": "ko",
"text": "\uc548\ub155\ud558\uc2ed\ub2c8\uae4c. \uc624\ub298 \ud68c\uc758 \uacb0\uacfc\ub97c \uacf5\uc720\ub4dc\ub9bd\ub2c8\ub2e4.\n\n\uc624\ub298 \uc9c4\uc9dc \uc88b\uc740 \uacb0\uacfc \ub098\uc654\uc5b4 \u314e\u314e \ub2e4\ub4e4 \uc218\uace0\ud588\uc5b4\uc694.\n\n\ud5a5\ud6c4 \uc77c\uc815\uc740 \ub2e4\uc74c\uacfc \uac19\uc774 \uacb0\uc815\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \ud300\uc6d0 \uc5ec\ub7ec\ubd84\uc758 \ud611\uc870\ub97c \ubd80\ud0c1\ub4dc\ub9bd\ub2c8\ub2e4."
}
{
"action": "analyze_consistency",
"consistency_report": {
"formality_std": 28.5,
"inconsistent_paragraphs": [
{
"deviation_from_mean": -44.0,
"formality_score": 18,
"index": 1,
"suggested_preset": "formal_korean",
"suggestion": "\uc774 \ubb38\ub2e8\uc758 \uaca9\uc2dd\ub3c4(18)\uac00 \ubb38\uc11c \ud3c9\uade0(59)\uacfc \ud06c\uac8c \ub2e4\ub985\ub2c8\ub2e4. formal_korean \ub610\ub294 friendly_korean \ud504\ub9ac\uc14b\uc73c\ub85c \ubcc0\ud658\ud558\ub294 \uac83\uc744 \uad8c\uc7a5\ud569\ub2c8\ub2e4."
}
],
"overall_score": 42,
"paragraph_profiles": [
{
"formality_score": 82,
"index": 0,
"korean_speech_level": "hasipsio",
"tone": "authoritative"
},
{
"formality_score": 18,
"index": 1,
"korean_speech_level": "casual",
"tone": "playful"
},
{
"formality_score": 78,
"index": 2,
"korean_speech_level": "hasipsio",
"tone": "neutral"
}
],
"tone_std": 1.8
}
}
짧고 직접적인 영문 텍스트를 정중한 이메일 문체로 변환합니다. / Converts terse English text to polite email style.
{
"action": "rewrite",
"language": "en",
"preset": "email_polite",
"text": "Fix the bug. Send the report by Friday. Need your approval ASAP."
}
{
"action": "rewrite",
"disclaimer": "Rule-based conversion; some expressions may not be perfectly natural. Human review recommended for critical communications.",
"rewritten_text": "Could you please fix the bug? I would appreciate it if you could send the report by Friday. Your approval at your earliest convenience would be greatly appreciated.",
"transform_log": [
{
"description": "\uba85\ub839\ud615\u2192\uc694\uccad\ud615 \ubcc0\ud658",
"fix_hint": {
"action": "imperative_to_request"
},
"original_fragment": "Fix the bug.",
"replacement": "Could you please fix the bug?",
"rule_id": "EN_EP01"
},
{
"description": "\uae34\ubc15 \ud45c\ud604 \uc644\ud654",
"fix_hint": {
"action": "soften_urgency"
},
"original_fragment": "ASAP",
"replacement": "at your earliest convenience",
"rule_id": "EN_EP02"
}
]
}
text 필드 없이 rewrite를 요청하면 INVALID_INPUT 에러를 반환합니다. / Returns INVALID_INPUT when required field is missing.
{
"action": "rewrite",
"preset": "formal_korean"
}
{
"error": {
"code": "INVALID_INPUT",
"message": "rewrite \uc561\uc158\uc5d0\ub294 text \uac00 \ud544\uc694\ud569\ub2c8\ub2e4. / text is required for rewrite."
}
}
compare 액션에 rewritten 필드가 없으면 INVALID_INPUT 에러를 반환합니다. / Returns INVALID_INPUT when rewritten is missing for compare.
{
"action": "compare",
"text": "\uc6d0\ubcf8 \ud14d\uc2a4\ud2b8\uc785\ub2c8\ub2e4."
}
{
"error": {
"code": "INVALID_INPUT",
"message": "compare \uc561\uc158\uc5d0\ub294 rewritten \uc774 \ud544\uc694\ud569\ub2c8\ub2e4. / rewritten is required for compare."
}
}
모든 예시는 에이전트 API로도 조회 가능:
/v1/agent/skills/2320a7e4-1870-4515-a489-788d03683410/schema
아직 리뷰가 없습니다. 첫 번째 리뷰를 남겨보세요!