mirror of
https://github.com/epoko77-ai/im-not-ai.git
synced 2026-06-21 13:18:09 +00:00
Compare commits
19 commits
docs/v2.0-
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
14aeb52d13 |
||
|
|
01e226fc84 | ||
|
|
d83ecf2255 | ||
|
|
9cfb5f2f2d |
||
|
|
4f0d7012c2 | ||
|
|
5c011530ab | ||
|
|
499b0452d7 | ||
|
|
0f981e7a4c | ||
|
|
b7366a4fb3 | ||
|
|
5bab459294 | ||
|
|
ec6390db2c | ||
|
|
df4ca4abd3 | ||
|
|
6ae5fe6a9e | ||
|
|
8ee6bb03ad | ||
|
|
807172694d |
||
|
|
1cf0d0aa80 | ||
|
|
52beb370c8 |
||
|
|
be4377ba58 | ||
|
|
6bab7a52a3 |
34 changed files with 857 additions and 125 deletions
20
.claude-plugin/marketplace.json
Normal file
20
.claude-plugin/marketplace.json
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
{
|
||||
"name": "im-not-ai",
|
||||
"owner": {
|
||||
"name": "epoko77-ai"
|
||||
},
|
||||
"metadata": {
|
||||
"description": "AI가 쓴 한글 텍스트를 사람이 쓴 글처럼 윤문하는 humanize-korean 스킬 마켓플레이스",
|
||||
"version": "1.5.0",
|
||||
"pluginRoot": "."
|
||||
},
|
||||
"plugins": [
|
||||
{
|
||||
"name": "humanize-korean",
|
||||
"source": "./",
|
||||
"description": "AI가 쓴 한글 텍스트를 사람이 쓴 글처럼 윤문하는 오케스트레이터 스킬 + 서브에이전트 묶음 (Fast + strict).",
|
||||
"version": "1.5.0",
|
||||
"keywords": ["korean", "humanize", "ai-detector", "윤문", "번역투"]
|
||||
}
|
||||
]
|
||||
}
|
||||
13
.claude-plugin/plugin.json
Normal file
13
.claude-plugin/plugin.json
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
{
|
||||
"name": "humanize-korean",
|
||||
"version": "1.5.0",
|
||||
"description": "AI가 쓴 한글 텍스트를 사람이 쓴 글처럼 윤문 — Fast(monolith) + strict 5인 파이프라인. 10대 카테고리 40+ AI 티 패턴 탐지·재작성.",
|
||||
"author": {
|
||||
"name": "epoko77-ai"
|
||||
},
|
||||
"homepage": "https://github.com/epoko77-ai/im-not-ai",
|
||||
"repository": "https://github.com/epoko77-ai/im-not-ai",
|
||||
"license": "MIT",
|
||||
"keywords": ["korean", "humanize", "ai-detector", "translationese", "윤문", "번역투"],
|
||||
"skills": ["./.claude/skills/"]
|
||||
}
|
||||
|
|
@ -1,36 +0,0 @@
|
|||
---
|
||||
description: 가장 최근 윤문 결과를 2차로 다시 다듬기 — 특정 카테고리·문단·강도 조정도 가능
|
||||
argument-hint: [조정 지시 — 예 "번역투만 다시" "이 문단만" "강도 낮춰" "강도 높여"]
|
||||
---
|
||||
|
||||
# /humanize-redo — 2차 윤문 / 부분 재실행
|
||||
|
||||
가장 최근 cwd 기준 `_workspace/{run_id}/`를 찾아 `humanize-korean` 스킬 Phase 3(윤문) 또는 Phase 4(검증)부터 재호출한다.
|
||||
|
||||
## 사용자 지시
|
||||
$ARGUMENTS
|
||||
|
||||
## 동작
|
||||
|
||||
1. cwd 기준 `_workspace/`에서 가장 최신 `run_id` 디렉토리 식별 (없으면 "이전 실행이 없습니다. `/humanize`로 시작하세요" 안내).
|
||||
2. 사용자 지시 파싱:
|
||||
- **카테고리 지정** ("번역투만", "관용구만", "이모지만" 등) → 해당 카테고리 finding만 다시 윤문
|
||||
- **문단 지정** ("이 문단만", "두 번째 문단만") → 해당 범위 finding만 처리
|
||||
- **강도 조정** ("강도 낮춰" / "보수적으로") → S1만 처리, "강도 높여" → S1+S2+S3 모두
|
||||
- **롤백 요청** ("이 변경 되돌려줘") → 해당 edit을 `content-fidelity-auditor` 롤백 명령으로 처리
|
||||
- 지시가 없거나 "2차 윤문해줘" → 잔존 finding 전체 대상으로 round 2
|
||||
3. `korean-style-rewriter`를 재호출하되 입력에:
|
||||
- 기존 `02_detection.json` 또는 `05_naturalness_review.json`의 잔존 finding
|
||||
- 사용자 지시를 `target_filter`로 전달
|
||||
- 직전 run의 `author-context.yaml`이 있으면 그대로 재주입(voice profile 일관성)
|
||||
4. 산출물은 `03_rewrite_v2.md` (또는 v3)로 버전 분리 저장.
|
||||
5. Phase 4 병렬 검증 → Phase 6 최종 출력 (변경 비교 표, 신규 등급).
|
||||
|
||||
## 루프 한도
|
||||
|
||||
최대 round 3까지. 그 이상은 `hold_and_report`로 사람 검토 권고.
|
||||
|
||||
## 참고
|
||||
|
||||
- 풀 파이프라인 신규 실행은 [`/humanize`](./humanize.md) 사용.
|
||||
- 잔존 패턴이 voice profile로 무력화된 ID라면 `naturalness-reviewer`가 다시 잡더라도 오케스트레이터가 `accepted_by_voice_profile` 플래그로 처리한다(권한 위계 §5).
|
||||
|
|
@ -1,46 +0,0 @@
|
|||
---
|
||||
description: AI가 쓴 한글 텍스트를 자연스럽게 윤문 (탐지→윤문→감사→리뷰 5단계 풀 파이프라인)
|
||||
argument-hint: [윤문할 텍스트 또는 파일 경로]
|
||||
---
|
||||
|
||||
# /humanize — 한글 AI 티 제거 풀 파이프라인
|
||||
|
||||
`humanize-korean` 스킬(v1.2)을 발동해 인자로 전달된 한글 텍스트(또는 파일)에 5인 파이프라인을 끝까지 실행한다.
|
||||
|
||||
## 입력
|
||||
$ARGUMENTS
|
||||
|
||||
## 동작
|
||||
|
||||
1. 인자가 비었으면: "윤문할 텍스트를 붙여넣어 주세요" 안내 후 종료.
|
||||
2. 인자가 파일 경로(.txt/.md)로 보이면 Read로 본문을 불러온다.
|
||||
3. 인자가 텍스트면 그대로 입력으로 사용한다.
|
||||
4. `humanize-korean` 스킬 SKILL.md 절차에 따라 Phase 0 → Phase 6까지 실행:
|
||||
- 첫 응답 한 줄로 버전·voice profile 상태 출력 (`humanize-korean v1.2 — voice profile 미주입 모드 / run_id: ...`)
|
||||
- cwd 기준 `_workspace/{YYYY-MM-DD-NNN}/`에 새 run_id 생성
|
||||
- voice profile 탐색: `<cwd>/_workspace/{run_id}/author-context.yaml` → `<cwd>/author-context.yaml` (없으면 미주입 모드)
|
||||
- `ai-tell-detector` → `korean-style-rewriter` → 병렬(`content-fidelity-auditor` + `naturalness-reviewer`) → 최종 종합
|
||||
5. 최종 결과를 사용자에게 전달:
|
||||
- 윤문본 본문 (마크다운 블록)
|
||||
- 카테고리별 탐지 건수 before/after 표
|
||||
- 점수 변화 + 품질 등급 (A/B/C/D)
|
||||
- 주요 변경 하이라이트 3~5건 (before/after)
|
||||
- 등급 B 이하면 "`/humanize-redo`로 2차 윤문 가능" 안내
|
||||
|
||||
## 옵션 (인자 끝에 자연어로 적기)
|
||||
|
||||
- `장르: 칼럼|리포트|블로그|공적` — 장르 명시 (생략 시 첫 300자로 자동 추정)
|
||||
- `강도: 보수|기본|적극` — 윤문 강도 (기본값: 기본)
|
||||
- `최소심각도: S1|S2|S3` — 탐지 임계값 (기본값: S2)
|
||||
|
||||
## 작가 voice profile (v1.2~)
|
||||
|
||||
작가/책 고유 voice가 일반 분류 패턴과 충돌하는 경우, `author-context.yaml`을 cwd 또는 `_workspace/{run_id}/`에 두면 자동 적용된다. 패턴 ID 단위 on/off + 임계 완화(multiplier 캡: 일반 ≤2.0, D-1~D-6 ≤1.5) + Do-NOT 키워드 화이트리스트만 허용. 자유 텍스트 mandate는 schema validator가 거부한다.
|
||||
|
||||
스키마: [`references/author-context-schema.md`](../skills/humanize-korean/references/author-context-schema.md)
|
||||
|
||||
## 참고
|
||||
|
||||
- 분류 체계: [`ai-tell-taxonomy.md`](../skills/humanize-korean/references/ai-tell-taxonomy.md)
|
||||
- 윤문 처방: [`rewriting-playbook.md`](../skills/humanize-korean/references/rewriting-playbook.md)
|
||||
- 권한 위계 §1~§6 (객관 분류 vs 작가 voice 권한 경계): taxonomy "권한 위계" 절
|
||||
|
|
@ -49,7 +49,7 @@ humanize-korean v1.5 — {fast|strict} 모드 / run_id: {YYYY-MM-DD-NNN}
|
|||
입력:
|
||||
```
|
||||
input_path: <abs path>/_workspace/{run_id}/01_input.txt
|
||||
quick_rules_path: <abs path>/.claude/skills/humanize-korean/references/quick-rules.md
|
||||
quick_rules_path: ${CLAUDE_SKILL_DIR}/references/quick-rules.md
|
||||
genre_hint: 칼럼 | 리포트 | 블로그 | 공적 | null
|
||||
```
|
||||
|
||||
|
|
@ -150,9 +150,9 @@ v1.1 5인 파이프라인 그대로. 검증 분리·재윤문 루프가 의미
|
|||
|
||||
**모델:** 모두 `model: opus` 통일 (v1.1 베이스라인). 모델 다운그레이드는 v1.4에서 시도했으나 도구 호출 chain이 진짜 병목이라 효과 미미했음.
|
||||
|
||||
**에이전트 정의 위치:** Claude Code가 다음 우선순위로 자동 탐색.
|
||||
1. `<cwd>/.claude/agents/` (프로젝트 로컬)
|
||||
2. `~/.claude/agents/` (글로벌, 본 프로젝트는 프로젝트→글로벌 심볼릭 링크)
|
||||
**에이전트 정의 위치:** 저장소 루트 `agents/`에 12종 정의(플러그인 컨벤션). Claude Code 탐색 경로:
|
||||
1. 플러그인 설치 시 — `humanize-korean` 플러그인이 `agents/`를 번들로 제공(전역).
|
||||
2. 스크립트 설치 시 — `install.sh`가 `agents/*.md`를 `~/.claude/agents/`에 심링크(전역).
|
||||
|
||||
필요 에이전트 6종:
|
||||
- `humanize-monolith` (v1.5 신규, fast 전용)
|
||||
|
|
|
|||
32
.claude/skills/humanize-redo/SKILL.md
Normal file
32
.claude/skills/humanize-redo/SKILL.md
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
---
|
||||
name: humanize-redo
|
||||
description: 가장 최근 윤문 결과를 2차로 다시 다듬는다 — 특정 카테고리·문단·강도 조정도 가능. humanize-korean strict 윤문(Phase B)을 기존 run_id에 재실행해 잔존 finding을 처리한다. 트리거 — "/humanize-redo".
|
||||
argument-hint: "[조정 지시 — 예: \"번역투만 다시\" \"이 문단만\" \"강도 낮춰\"]"
|
||||
disable-model-invocation: true
|
||||
---
|
||||
|
||||
# /humanize-redo — 2차 윤문 / 부분 재실행
|
||||
|
||||
cwd 기준 가장 최근 `_workspace/{run_id}/`를 찾아 `humanize-korean` 스킬의 strict 윤문(Phase B)부터 재호출한다.
|
||||
|
||||
## 사용자 지시
|
||||
$ARGUMENTS
|
||||
|
||||
## 동작
|
||||
1. `Glob`으로 `_workspace/YYYY-MM-DD-*/final.md`(또는 `01_input.txt`)를 매칭해 최신 `run_id` 식별. 없으면 "이전 실행이 없습니다. `/humanize`로 시작하세요" 안내 후 종료.
|
||||
2. 사용자 지시 파싱:
|
||||
- **카테고리 지정**("번역투만", "관용구만", "이모지만") → 해당 카테고리 finding만 재윤문
|
||||
- **문단 지정**("이 문단만", "두 번째 문단만") → 해당 범위 finding만
|
||||
- **강도 조정**("강도 낮춰"·"보수적으로" → S1만, "강도 높여" → S1+S2+S3)
|
||||
- **롤백 요청**("이 변경 되돌려줘") → 해당 edit을 `content-fidelity-auditor` 롤백으로 처리
|
||||
- 지시 없음·"2차 윤문해줘" → 잔존 finding 전체 대상 round 2
|
||||
3. `korean-style-rewriter` 재호출 입력: 기존 `02_detection.json` 또는 `05_naturalness_review.json`의 잔존 finding + 사용자 지시를 `target_filter`로 전달.
|
||||
4. 산출물은 `03_rewrite_v2.md`(또는 v3)로 버전 분리. 이전 `final.md`는 `final_prev.md`로 백업.
|
||||
5. strict Phase C 병렬 검증 → Phase D 최종 출력(변경 비교 표 + 신규 등급).
|
||||
|
||||
## 루프 한도
|
||||
최대 round 3. 그 이상 미해결이면 `hold_and_report`로 사람 검토 권고.
|
||||
|
||||
## 참고
|
||||
- 풀 파이프라인 신규 실행은 `/humanize`.
|
||||
- 분류 체계: `humanize-korean/references/ai-tell-taxonomy.md`
|
||||
35
.claude/skills/humanize/SKILL.md
Normal file
35
.claude/skills/humanize/SKILL.md
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
---
|
||||
name: humanize
|
||||
description: AI가 쓴 한글 텍스트를 자연스럽게 윤문하는 진입 명령. humanize-korean 파이프라인을 Fast 모드(기본)로 실행하고 `--strict`면 5인 파이프라인. 트리거 — "/humanize".
|
||||
argument-hint: "[윤문할 텍스트 또는 파일 경로]"
|
||||
disable-model-invocation: true
|
||||
---
|
||||
|
||||
# /humanize — 한글 AI 티 제거
|
||||
|
||||
`humanize-korean` 스킬을 발동해 인자로 전달된 한글 텍스트(또는 파일)에 윤문을 실행한다.
|
||||
|
||||
## 입력
|
||||
$ARGUMENTS
|
||||
|
||||
## 동작
|
||||
1. 인자가 비면: "윤문할 텍스트를 붙여넣어 주세요" 안내 후 종료.
|
||||
2. 인자가 파일 경로(.txt/.md)면 `Read`로 본문 로드.
|
||||
3. 인자가 텍스트면 그대로 입력으로 사용.
|
||||
4. `humanize-korean` 스킬 SKILL.md 절차(Phase 0 → 결과 전달)를 따른다 — 기본 **Fast 모드**, `--strict` 시 strict 5인 파이프라인.
|
||||
5. 결과 전달:
|
||||
- 한 줄 상태(변경률 / 등급 / 자체검증 통과)
|
||||
- 윤문본 본문(마크다운 블록)
|
||||
- 카테고리별 탐지 건수 before/after
|
||||
- 주요 변경 하이라이트 3~5건
|
||||
- 등급 B 이하면 "`/humanize-redo`로 2차 윤문 가능" 안내
|
||||
|
||||
## 옵션 (인자 끝에 자연어로)
|
||||
- `장르: 칼럼|리포트|블로그|공적` — 장르 명시 (생략 시 첫 300자로 자동 추정)
|
||||
- `강도: 보수|기본|적극` — 윤문 강도 (기본값: 기본)
|
||||
- `최소심각도: S1|S2|S3` — 탐지 임계값 (기본값: S2)
|
||||
- `--strict` — 5인 파이프라인 강제
|
||||
|
||||
## 참고
|
||||
- 분류 체계: `humanize-korean/references/ai-tell-taxonomy.md`
|
||||
- 윤문 처방: `humanize-korean/references/rewriting-playbook.md`
|
||||
48
CLAUDE.md
48
CLAUDE.md
|
|
@ -14,32 +14,30 @@ AI(ChatGPT·Claude·Gemini 등)가 쓴 한글 텍스트를 "사람이 쓴 글처
|
|||
## 디렉토리 구조
|
||||
|
||||
```
|
||||
humanize-ko/
|
||||
im-not-ai/
|
||||
├── CLAUDE.md # 본 파일 — 프로젝트 가이드
|
||||
├── .claude/
|
||||
│ ├── agents/ # 6인 에이전트 정의
|
||||
│ │ ├── korean-ai-tell-taxonomist.md
|
||||
│ │ ├── ai-tell-detector.md
|
||||
│ │ ├── korean-style-rewriter.md
|
||||
│ │ ├── content-fidelity-auditor.md
|
||||
│ │ ├── naturalness-reviewer.md
|
||||
│ │ └── humanize-web-architect.md
|
||||
│ └── skills/humanize-korean/
|
||||
│ ├── SKILL.md # 오케스트레이터
|
||||
│ └── references/
|
||||
│ ├── ai-tell-taxonomy.md # SSOT — 10대분류 × 40+ 패턴
|
||||
│ ├── rewriting-playbook.md # 카테고리별 치환 레시피
|
||||
│ └── web-service-spec.md # Phase 5 웹 확장용
|
||||
└── _workspace/ # 런타임 산출물 (run_id별)
|
||||
└── {YYYY-MM-DD-NNN}/
|
||||
├── 01_input.txt
|
||||
├── 02_detection.json
|
||||
├── 03_rewrite.md
|
||||
├── 03_rewrite_diff.json
|
||||
├── 04_fidelity_audit.json
|
||||
├── 05_naturalness_review.json
|
||||
├── final.md
|
||||
└── summary.md
|
||||
├── README.md / INSTALL.md # 사용·설치 안내
|
||||
├── .claude-plugin/ # Claude 플러그인 + 마켓플레이스 매니페스트
|
||||
│ ├── plugin.json # skills: ./.claude/skills/ · 에이전트는 루트 agents/ 자동탐색
|
||||
│ └── marketplace.json # /plugin marketplace add epoko77-ai/im-not-ai
|
||||
├── gemini-extension.json # Gemini CLI Extension 매니페스트
|
||||
├── GEMINI.md # Gemini 에이전트 컨텍스트 (monolith 룰 인라인)
|
||||
├── commands/ # Gemini CLI 커스텀 명령 (/humanize-korean, /humanize, /humanize-redo)
|
||||
├── install.sh / uninstall.sh # Claude·Codex·Gemini 전역 설치/제거 (심링크 기본)
|
||||
├── agents/ # 서브에이전트 12종 (플러그인 컨벤션 — 루트 agents/에 둬야 로드됨)
|
||||
│ ├── humanize-monolith.md # Fast 단일 호출
|
||||
│ ├── ai-tell-detector.md · korean-style-rewriter.md
|
||||
│ ├── content-fidelity-auditor.md · naturalness-reviewer.md
|
||||
│ └── … taxonomist·scholar·distiller 등 지원 7종
|
||||
├── .claude/skills/ # 스킬 3종 (humanize-korean·humanize·humanize-redo)
|
||||
│ └── humanize-korean/
|
||||
│ ├── SKILL.md # 오케스트레이터 (quick_rules_path: ${CLAUDE_SKILL_DIR}/...)
|
||||
│ └── references/ # SSOT — ai-tell-taxonomy·rewriting-playbook·quick-rules 등
|
||||
├── codex/skills/humanize-korean/ # Codex Fast Path 스킬
|
||||
│ ├── SKILL.md # monolith 기반 자가완결
|
||||
│ └── references → ../../../.claude/skills/humanize-korean/references # SSOT 공유 심링크
|
||||
└── _workspace/ # 런타임 산출물 (run_id별, gitignored)
|
||||
└── {YYYY-MM-DD-NNN}/ # 01_input.txt … final.md · summary.md
|
||||
```
|
||||
|
||||
## 파이프라인
|
||||
|
|
|
|||
179
GEMINI.md
Normal file
179
GEMINI.md
Normal file
|
|
@ -0,0 +1,179 @@
|
|||
# Humanize KR — AI 한글 티 제거 (Gemini CLI Extension)
|
||||
|
||||
**v1.5 · Fast(monolith) 모드 전용** — Gemini CLI에서 한 번의 대화로 탐지·윤문·자체검증을 일괄 처리합니다.
|
||||
정밀 strict 5인 파이프라인은 Claude Code 전용입니다.
|
||||
|
||||
## 개요
|
||||
|
||||
AI(ChatGPT·Claude·Gemini 등)가 쓴 한글 텍스트를 "사람이 쓴 글처럼" 윤문합니다.
|
||||
번역투·영어 인용 과다·기계적 병렬·관용구·피동태 남용·접속사 남발·리듬 균일성·이모지/불릿 과다 등
|
||||
**10대 카테고리 40+ AI 티 패턴**을 탐지·분류해 **내용은 한 글자도 건드리지 않고** 문체·리듬·표현만 재작성합니다.
|
||||
|
||||
## 커스텀 명령
|
||||
|
||||
- `/humanize-korean [텍스트]` — 메인 윤문 명령
|
||||
- `/humanize [텍스트]` — `/humanize-korean`과 동일
|
||||
- `/humanize-redo [조정 지시]` — 2차 윤문 / 부분 재실행
|
||||
|
||||
자연어 트리거도 동작합니다: "이 글 AI 티 없애줘", "AI 윤문", "ChatGPT 티 제거", "번역투 고쳐", "사람이 쓴 것처럼".
|
||||
|
||||
## 철칙 (위반 시 즉시 롤백)
|
||||
|
||||
1. **의미 불변 (Fidelity First)** — 사실·주장·수치·고유명사·인용은 100% 원문 보존.
|
||||
2. **근거 기반 (Span-Grounded)** — 아래 패턴 목록에 매핑되지 않는 구간은 건드리지 않음.
|
||||
3. **장르 유지 (Tone Match)** — 칼럼을 문학으로, 리포트를 에세이로 옮기지 않음.
|
||||
4. **register 보존** — 원문 격식체면 결과도 격식체. AI 티는 문법·수사이지 격식 자체가 아님.
|
||||
5. **과윤문 금지** — 변경률 30% 초과 시 경고, 50% 초과 시 강제 중단.
|
||||
|
||||
## Do-NOT (탐지·윤문 모두 제외)
|
||||
|
||||
고유명사·제품명·모델명·기관명, 수치·날짜·단위, 큰따옴표 안 직접 인용, 법률 조문,
|
||||
수학·화학·통계 표기, 영어 약어(LLM·GPU·MCP·API 등 업계 표준).
|
||||
|
||||
## 절차
|
||||
|
||||
1. **입력 확보**: 사용자가 붙여넣은 텍스트를 원문으로 한다. 파일 경로(.txt/.md)면 그 파일을 읽는다.
|
||||
2. **장르 추정**: 첫 300자로 장르 추정(사용자 명시 시 우선). 칼럼 | 리포트 | 블로그 | 공적.
|
||||
3. **탐지**: 아래 A~J 카테고리 패턴을 스캔해 (ID, span, severity, fix) 수집. Do-NOT span은 제외.
|
||||
4. **윤문**: D(관용구 삭제) → A → I → G → H → F → B → C·J → E 순서로 문단 단위 처리.
|
||||
5. **자체검증**: 아래 체크리스트 6항 점검. 위반 시 해당 edit 롤백 → 부분 재실행(최대 1회).
|
||||
6. **출력**: 윤문본 + 메트릭 요약 반환.
|
||||
|
||||
## 응답 형식
|
||||
|
||||
사용자에게 4가지 반환:
|
||||
1. 한 줄 상태: `완료. 변경률 X% / 등급 Y / 자체검증 N/6 통과`
|
||||
2. 윤문본 본문 (마크다운 블록)
|
||||
3. 카테고리별 탐지 건수 before/after + 주요 변경 하이라이트 3~5건
|
||||
4. 등급 B 이하면 "정밀 검증이 필요하면 Claude Code의 strict 5인 파이프라인 권장" 안내
|
||||
|
||||
## 옵션 (인자 끝에 자연어로)
|
||||
|
||||
- `장르: 칼럼|리포트|블로그|공적` — 장르 명시 (생략 시 자동 추정)
|
||||
- `강도: 보수|기본|적극` — 윤문 강도 (기본값: 기본)
|
||||
- `최소심각도: S1|S2|S3` — 탐지 임계값 (기본값: S2)
|
||||
|
||||
---
|
||||
|
||||
## AI 티 패턴 목록 (Quick Rules)
|
||||
|
||||
### A. 번역투 (Translation-ese)
|
||||
|
||||
| ID | 패턴 | 심각도 | 처방 |
|
||||
|---|---|---|---|
|
||||
| A-1 | "~에 대해(서)" | S1 | 목적격 조사로 직결("X에 대해 논의" → "X를 논의") |
|
||||
| A-2 | "~를 통해/통하여" 남발 | S1 | "~로", "~해서", "~함으로써"로 분산 |
|
||||
| A-3 | "~에 있어(서)" | S1 | "~에서", "~을 볼 때" |
|
||||
| A-4 | "~라는 점에서" 3회+ | S2 | "~서", "~라는 이유로" |
|
||||
| A-5 | "~와 관련하여/관련된" | S2 | "~에", "~의" |
|
||||
| A-6 | "~에 기반하여/바탕으로" 남발 | S2 | "~로", "~을 보고" |
|
||||
| A-7 | "가지고 있다" / have·make·take·give + N 직역 | S1 | 형용사·동사 환원 |
|
||||
| A-8 | 이중 피동 "~되어진다" | S1 | 능동 또는 단일 피동 |
|
||||
| A-9 | "~에 의해" 피동 | S2 | 행위자를 주어로 |
|
||||
| A-10 | "~할 수 있다" 남발 | S2 | 단언으로 |
|
||||
| A-11 | "~을 위해" 목적절 남발 | S2 | "~려고", "~위한" |
|
||||
| A-15 | 추상 주어 + 만능 동사 | S2 | 구체 주어로 환원 |
|
||||
| A-16 | "그/그녀/그것/그들" 단락 ≥3회 | S1 | 영형(생략) 또는 호칭·명사구 |
|
||||
| A-18 | 명사 앞 ≥3어절 관형구 | S2 | 문장 분리 또는 후치 동격절 |
|
||||
| A-19 | 이중 조사 "~에서의/~에로의" | S2 | 절·구로 풀어쓰기 |
|
||||
|
||||
### B. 영어 인용·용어 과다
|
||||
|
||||
| ID | 패턴 | 심각도 | 처방 |
|
||||
|---|---|---|---|
|
||||
| B-1 | 한글 + 괄호 영어 매번 | S2 | 첫 등장만 병기, 이후 한글만 |
|
||||
| B-2 | 영어 어휘 직역 가능한데 그대로 | S2 | 한국어로 옮기되 업계 표준은 유지 |
|
||||
|
||||
### C. 구조적 AI 패턴
|
||||
|
||||
| ID | 패턴 | 심각도 | 처방 |
|
||||
|---|---|---|---|
|
||||
| C-5 | 이모지 남발 | S1 | 장르 칼럼·리포트면 전부 삭제 |
|
||||
| C-7 | "먼저·반면·결국" 3단 공식 | S2 | 접속사 1~2개로 줄이거나 제거 |
|
||||
| C-8 | "A인가·B인가" 대구 반복 | S2 | 한 번만 살리고 나머지 평서문 |
|
||||
| C-9 | 숫자 괄호 인덱싱 "(1)·(2)·(3)" | S2 | 본문에 녹이거나 단순 줄바꿈 |
|
||||
| C-10 | 콜론 부제 헤딩 "X: Y" 반복 | S1 | 헤딩 짧게 또는 평서 헤딩 |
|
||||
| C-11 | 연결어미 뒤 쉼표 | S1 | 쉼표 제거 |
|
||||
|
||||
### D. AI 특유 관용구 (Signature Phrases)
|
||||
|
||||
| ID | 패턴 | 심각도 | 처방 |
|
||||
|---|---|---|---|
|
||||
| D-1 | 결산 피벗 lexicon "결론적으로/따라서/이를 통해" | S1 | 3회 초과 시 1~2건 치환, 나머지 삭제 |
|
||||
| D-2 | "시사하는 바가 크다/주목할 만하다" | S1 | 삭제 또는 구체 결론 |
|
||||
| D-3 | "본질적으로/핵심적으로" | S1 | 삭제 |
|
||||
| D-4 | hype 어휘(파격적·압도적·강력한·획기적) 3회+ | S1 | 구체 수치·사실로 환원 |
|
||||
| D-5 | 의인화 추상 주어 | S1 | 사람·기관 주어로 |
|
||||
| D-6 | 결말 공식 "~할 때다/~해야 한다/~지금이야말로" | S1 | 평서로 닫거나 삭제 |
|
||||
| D-7 | 변환 공식 "X에서 Y로" 반복 | S2 | 한 번만, 나머지 일반 서술 |
|
||||
|
||||
### E. 리듬·종결어미
|
||||
|
||||
| ID | 패턴 | 심각도 | 처방 |
|
||||
|---|---|---|---|
|
||||
| E-1 | 문장 길이 균일(stdev 8 미만) | S2 | 단문·장문 의도적 삽입 |
|
||||
| E-2 | 동일 종결어미 "~다" 4문장 연속 | S2 | 다양화 |
|
||||
|
||||
### F. 과도한 수식·중복
|
||||
|
||||
| ID | 패턴 | 심각도 | 처방 |
|
||||
|---|---|---|---|
|
||||
| F-4 | 한자어 명사화 -성/-적/-화 누적 12회+ | S2 | 동사·형용사 어근 환원 |
|
||||
| F-5 | "~적 N" 추상 체인 | S2 | 풀어쓰기 |
|
||||
|
||||
### G. Hedging
|
||||
|
||||
| ID | 패턴 | 심각도 | 처방 |
|
||||
|---|---|---|---|
|
||||
| G-1 | "~것이다/~할 것이다" 남발 | S2 | 현재형·확정형 |
|
||||
| G-2 | "~로 보인다/~인 듯하다" 남발 | S2 | 단언 가능한 곳은 단언 |
|
||||
| G-3 | 안전 균형 lexicon 4회 초과 | S2 | 1~2건 화자 입장으로 치환 |
|
||||
|
||||
### H. 접속사 남발
|
||||
|
||||
| ID | 패턴 | 심각도 | 처방 |
|
||||
|---|---|---|---|
|
||||
| H-1 | 문두 접속사 "또한·따라서·즉·나아가" 5회+ | S1 | 대량 제거 |
|
||||
| H-3 | 메타 진입 "이는·이 점에서" 3회+ | S1 | 본문에 녹이거나 삭제 |
|
||||
| H-4 | "즉" 남발 | S2 | 1회로 제한 |
|
||||
|
||||
### I. 형식명사·의존명사
|
||||
|
||||
| ID | 패턴 | 심각도 | 처방 |
|
||||
|---|---|---|---|
|
||||
| I-1 | "~인 것이다/~한 것이다" 결말 | S1 | 평서형 |
|
||||
| I-2 | "X은 ~라는 점에 있다" | S2 | 직설 |
|
||||
| I-3 | "~다는 뜻이다/~다는 의미다" 결말 | S2 | 풀어 쓰기 |
|
||||
| I-4 | 권고형 결말 "~해야 한다" 반복 | S2 | 평서·단언 |
|
||||
|
||||
### J. 시각 장식
|
||||
|
||||
| ID | 패턴 | 심각도 | 처방 |
|
||||
|---|---|---|---|
|
||||
| J-1 | 헤딩 마크다운 ** 강조 남발 | S2 | 거의 다 제거 |
|
||||
| J-2 | 따옴표 강조 5회+ | S1 | 핵심 한두 개만 |
|
||||
| J-3 | 불릿 리스트 (칼럼·리포트 장르) | S2 | 문단 산문으로 통합 |
|
||||
|
||||
---
|
||||
|
||||
## 자체검증 체크리스트 (윤문 후 자가 점검)
|
||||
|
||||
1. **고유명사·수치·날짜·인용 100% 보존**: 원문 대비 한 글자도 다르지 않은가
|
||||
2. **변경률**: 30% 이하인가 (50% 초과는 작업 중단)
|
||||
3. **장르 이탈 없음**: 칼럼이 에세이·문학으로 변하지 않았는가
|
||||
4. **register 보존**: 원문 격식체면 결과도 격식체
|
||||
5. **잔존 S1 패턴 0건**: D-1~D-7, A-7, A-8, A-16, C-5, C-10, C-11, H-1, I-1, J-2 핵심 S1이 남아있지 않은가
|
||||
6. **인공 표현 자제**: 원문에 없던 비유·수사·문학적 표현을 임의로 추가하지 않았는가
|
||||
|
||||
## 등급 기준
|
||||
|
||||
- **A**: S1 잔존 0, S2 잔존 2 이하, 변경률 10~25%, 자체검증 6항 모두 통과
|
||||
- **B**: S1 잔존 0, S2 잔존 4 이하, 자체검증 5항 이상 통과
|
||||
- **C**: S1 잔존 1~2 또는 자체검증 4항 이하 통과 — strict 모드 권고
|
||||
- **D**: S1 잔존 3+ 또는 변경률 50% 초과 — 작업 중단 권고
|
||||
|
||||
## 참고 자료
|
||||
|
||||
- 분류 체계 본진: `.claude/skills/humanize-korean/references/ai-tell-taxonomy.md`
|
||||
- 윤문 처방: `.claude/skills/humanize-korean/references/rewriting-playbook.md`
|
||||
- 슬림 룰북: `.claude/skills/humanize-korean/references/quick-rules.md`
|
||||
142
INSTALL.md
Normal file
142
INSTALL.md
Normal file
|
|
@ -0,0 +1,142 @@
|
|||
# 설치 가이드 (Install)
|
||||
|
||||
Humanize KR은 **Claude Code**와 **OpenAI Codex CLI**, **Gemini CLI(Antigravity)** 에서 전역으로 쓸 수 있습니다.
|
||||
|
||||
| 도구 | 모드 | 설치 방법 |
|
||||
|---|---|---|
|
||||
| Claude Code | Fast + strict(5인 파이프라인) | ① 플러그인 마켓플레이스(권장) / ② 클론 + `install.sh` |
|
||||
| Codex CLI | Fast(단일 호출)만 | 클론 + `install.sh` |
|
||||
| Gemini CLI | Fast(단일 호출)만 | ① `gemini extensions install`(권장) / ② 클론 + `install.sh` |
|
||||
|
||||
> Codex와 Gemini는 Claude식 다중 서브에이전트 파이프라인을 결정적으로 실행하지 못해, 단일 호출 Fast Path만 제공합니다. 정밀 검증이 필요하면 Claude Code의 `--strict`를 사용하세요.
|
||||
|
||||
---
|
||||
|
||||
## Claude Code
|
||||
|
||||
### 방법 ① 플러그인 마켓플레이스 — 클론 불필요 (권장)
|
||||
|
||||
Claude Code 세션에서:
|
||||
|
||||
```
|
||||
/plugin marketplace add epoko77-ai/im-not-ai
|
||||
/plugin install humanize-korean@im-not-ai
|
||||
```
|
||||
|
||||
- 설치 후 새 세션에서 `/humanize-korean`(또는 `/humanize`, `/humanize-redo`), 혹은 자연어 트리거("이 글 AI 티 없애줘")로 발동.
|
||||
- 업데이트: `/plugin marketplace update im-not-ai` 후 `/plugin update humanize-korean`.
|
||||
- 제거: `/plugin uninstall humanize-korean`.
|
||||
- 구성요소: 스킬 3개(humanize-korean·humanize·humanize-redo) + 서브에이전트 12개가 함께 설치됩니다.
|
||||
|
||||
### 방법 ② 클론 + 스크립트
|
||||
|
||||
```bash
|
||||
git clone https://github.com/epoko77-ai/im-not-ai.git
|
||||
cd im-not-ai
|
||||
./install.sh --claude-only
|
||||
```
|
||||
|
||||
`~/.claude/skills/`에 스킬 3개, `~/.claude/agents/`에 에이전트 12개를 **심링크**합니다(저장소를 수정하면 즉시 반영). 새 세션에서 `/humanize-korean`.
|
||||
|
||||
---
|
||||
|
||||
## Codex CLI
|
||||
|
||||
Codex 0.121.0 이상(1급 Skills 지원)이 필요합니다.
|
||||
|
||||
```bash
|
||||
git clone https://github.com/epoko77-ai/im-not-ai.git
|
||||
cd im-not-ai
|
||||
./install.sh --codex-only
|
||||
```
|
||||
|
||||
`~/.codex/skills/humanize-korean`에 Fast Path 스킬을 심링크합니다. Codex에서 `$humanize-korean`으로 발동하거나, `/skills` 메뉴에서 선택하세요.
|
||||
|
||||
---
|
||||
|
||||
## 한 번에 양쪽 모두 (Claude + Codex + Gemini)
|
||||
|
||||
```bash
|
||||
git clone https://github.com/epoko77-ai/im-not-ai.git
|
||||
cd im-not-ai
|
||||
./install.sh # 설치된 claude/codex/gemini를 자동 감지해 각각 연결
|
||||
```
|
||||
|
||||
### `install.sh` 옵션
|
||||
|
||||
| 옵션 | 설명 |
|
||||
|---|---|
|
||||
| (없음) | `claude`·`codex`·`gemini` 자동 감지 후 각각 설치 (심링크) |
|
||||
| `--copy` | 심링크 대신 복사. 저장소를 지워도 유지(references 심링크는 실체화). ⚠ 복사본은 `uninstall.sh`가 자동 삭제하지 않음 |
|
||||
| `--claude-only` / `--codex-only` / `--gemini-only` | 한쪽만 |
|
||||
| `--no-gemini` | Gemini 건너뜀 (Claude/Codex만) |
|
||||
| `--force` | 대상에 일반 파일/디렉토리가 있어도 `.bak.<ts>`로 백업 후 덮어씀 |
|
||||
| `--dry-run` | 실제 변경 없이 수행할 작업만 출력 |
|
||||
| `-h`, `--help` | 도움말 |
|
||||
|
||||
환경변수 `CLAUDE_HOME`(기본 `~/.claude`), `CODEX_HOME`(기본 `~/.codex`)로 설치 위치를 바꿀 수 있습니다.
|
||||
|
||||
---
|
||||
|
||||
## 업데이트
|
||||
|
||||
- **자동 감지 + 적용 (스크립트 설치, 권장)** — `./update.sh`
|
||||
- upstream(git)에 새 버전이 있으면 자동으로 `git pull` + `install.sh` 재적용(신규 스킬/에이전트/구조 변경까지 연결).
|
||||
- `./update.sh --check` — 감지만(적용 안 함). 최신이면 종료코드 `0`, 업데이트 있으면 `10`.
|
||||
- `--copy`로 설치했다면 `./update.sh --copy --force`.
|
||||
- **수동** — `git pull`만 해도 심링크라 내용은 반영됩니다(신규 파일 연결은 `./install.sh` 한 번 더).
|
||||
- **마켓플레이스 설치** — Claude Code가 갱신을 관리합니다: `/plugin marketplace update im-not-ai` → `/plugin update humanize-korean`.
|
||||
- **주기적 무인 업데이트 (opt-in)** — 완전 자동 갱신을 원하면 cron/launchd로 `update.sh`를 거세요. 예(매주 월 09:00, 감지 시 적용):
|
||||
```cron
|
||||
0 9 * * 1 cd /path/to/im-not-ai && ./update.sh >> ~/.humanize-update.log 2>&1
|
||||
```
|
||||
알림만 원하면 `./update.sh --check`를 사용하세요. ⚠️ 자동 적용은 upstream 코드를 자동으로 받아 연결하므로 **신뢰하는 저장소에만** 거세요.
|
||||
|
||||
## 제거
|
||||
|
||||
- **스크립트 설치** — `./uninstall.sh`: 이 저장소를 가리키는 심링크만 제거(직접 둔 파일·`.bak.*`·`--copy` 설치본은 보존).
|
||||
- **마켓플레이스** — `/plugin uninstall humanize-korean`.
|
||||
|
||||
---
|
||||
|
||||
## 트러블슈팅
|
||||
|
||||
- **"refuse: … 가 이미 있음"** — 해당 경로에 이미 다른 파일/링크가 있습니다. `--force`(백업 후 덮어쓰기) 또는 직접 정리 후 재실행하세요.
|
||||
- **스킬이 안 보임** — Claude는 **새 세션**에서 로드됩니다. `claude plugin list`(마켓플레이스 설치) 또는 `ls -l ~/.claude/skills`(스크립트 설치)로 확인하세요. Codex는 `/skills` 메뉴로 확인.
|
||||
- **저장소 위치 이동/삭제** — 심링크 설치는 클론한 저장소 경로에 의존합니다. 저장소를 옮기면 `./uninstall.sh`(옛 경로) 후 새 경로에서 `./install.sh`를 다시 실행하거나, 위치 비의존이 필요하면 `--copy`로 설치하세요.
|
||||
- **레포 기여 개발** — 이 저장소는 에이전트를 플러그인 컨벤션(`agents/`)에, 스킬을 `.claude/skills/`에 둡니다. 저장소 안에서 직접 테스트하려면 `./install.sh`로 한 번 전역 연결한 뒤(에이전트가 `~/.claude/agents`에서 탐색됨) 사용하세요.
|
||||
|
||||
## 요구 사항
|
||||
|
||||
- Claude Code: 마켓플레이스/플러그인 지원 버전(`claude plugin` 명령 사용 가능).
|
||||
- Codex CLI: 0.121.0 이상(`~/.codex/skills` Skills 지원).
|
||||
- Gemini CLI: 0.14.0 이상(`gemini extensions` 명령 사용 가능).
|
||||
- macOS·Linux의 `bash`. (Windows는 WSL 권장 — 심링크 때문에.)
|
||||
|
||||
---
|
||||
|
||||
## Gemini CLI (Antigravity)
|
||||
|
||||
Gemini CLI 0.14.0 이상이 필요합니다.
|
||||
|
||||
### 방법 ① 원격 설치 — 클론 불필요 (권장)
|
||||
|
||||
```bash
|
||||
gemini extensions install https://github.com/epoko77-ai/im-not-ai.git
|
||||
```
|
||||
|
||||
- 설치 후 새 세션에서 `/humanize-korean`(또는 `/humanize`), 혹은 자연어 트리거("이 글 AI 티 없애줘")로 발동.
|
||||
- 업데이트: `gemini extensions update im-not-ai`.
|
||||
- 제거: `gemini extensions uninstall im-not-ai`.
|
||||
|
||||
### 방법 ② 클론 + 스크립트
|
||||
|
||||
```bash
|
||||
git clone https://github.com/epoko77-ai/im-not-ai.git
|
||||
cd im-not-ai
|
||||
./install.sh --gemini-only
|
||||
```
|
||||
|
||||
`gemini extensions link`로 저장소를 직접 링크합니다(저장소 수정 시 즉시 반영). 새 세션에서 `/humanize-korean`.
|
||||
|
||||
> Gemini는 **Fast(단일 호출) 모드만** 제공합니다. 정밀 strict 5인 파이프라인은 Claude Code 전용.
|
||||
55
README.md
55
README.md
|
|
@ -8,6 +8,32 @@ AI(ChatGPT · Claude · Gemini 등)가 쓴 한글 글을 **내용은 한 글자
|
|||
|
||||
번역투, 과도한 영어 인용, 기계적 병렬 ("첫째 · 둘째 · 셋째"), "결론적으로 / 시사하는 바가 크다" 같은 AI 특유 관용구, 피동태 남용, 문두 접속사 남발, 이모지·불릿 남용 등 **10대 카테고리 × 40+ 서브 패턴**을 심각도(S1/S2/S3)로 분류해 스팬 단위로 탐지한 뒤, 윤문합니다.
|
||||
|
||||
## 설치 (Install)
|
||||
|
||||
> **Claude Code**와 **OpenAI Codex CLI** 양쪽을 지원합니다. 전체 가이드: [`INSTALL.md`](INSTALL.md)
|
||||
|
||||
**Claude Code — 플러그인 마켓플레이스 (클론 불필요, 권장)**
|
||||
|
||||
```
|
||||
/plugin marketplace add epoko77-ai/im-not-ai
|
||||
/plugin install humanize-korean@im-not-ai
|
||||
```
|
||||
|
||||
새 세션에서 `/humanize-korean` (또는 자연어로 "이 글 AI 티 없애줘").
|
||||
|
||||
**Claude Code · Codex CLI — 클론 + 스크립트**
|
||||
|
||||
```bash
|
||||
git clone https://github.com/epoko77-ai/im-not-ai.git
|
||||
cd im-not-ai
|
||||
./install.sh # 설치된 claude/codex 자동 감지 → 전역 심링크
|
||||
```
|
||||
|
||||
- Claude: `/humanize-korean` · Codex: `$humanize-korean`
|
||||
- 한쪽만: `./install.sh --claude-only` / `--codex-only` · 제거: `./uninstall.sh`
|
||||
- **업데이트**: `./update.sh` — 새 버전 자동 감지 후 `git pull` + 재설치(`--check`는 감지만). 마켓플레이스 설치는 `/plugin update`.
|
||||
- Codex는 **Fast(단일 호출) 모드만** 제공합니다. 정밀 strict 5인 파이프라인은 Claude Code 전용.
|
||||
|
||||
## 왜 한글 특화인가
|
||||
|
||||
영어권 humanizer(QuillBot · Hix · Undetectable AI)는 한국어에 약합니다. 한글 AI 글의 티는 대부분 **영어 번역투**에서 나옵니다.
|
||||
|
|
@ -102,6 +128,8 @@ final.md + summary.md
|
|||
|
||||
## 사용법 — 5분이면 따라합니다
|
||||
|
||||
> **전역 설치([설치](#설치-install))를 마쳤다면** 1~2단계(클론·폴더 진입)는 건너뛰고, 아무 폴더에서나 바로 **3단계**로 가세요. 아래는 설치 없이 리포에서 곧바로 체험하는 흐름입니다.
|
||||
|
||||
### 0. 전제
|
||||
|
||||
[Claude Code](https://claude.com/claude-code)가 설치돼 있어야 합니다. Mac · Windows · Linux 모두 지원합니다.
|
||||
|
|
@ -120,13 +148,14 @@ git clone https://github.com/epoko77-ai/im-not-ai.git
|
|||
cd im-not-ai
|
||||
```
|
||||
|
||||
### 2. 이 폴더 안에서 Claude Code 켜기
|
||||
### 2. Claude Code 켜기
|
||||
|
||||
```bash
|
||||
claude
|
||||
```
|
||||
|
||||
> **중요:** 꼭 `im-not-ai` 폴더 **안에서** 실행하세요. 다른 위치에서 켜면 이 리포의 스킬이 로드되지 않아 일반 Claude Code처럼 동작합니다.
|
||||
> **전역 설치를 했다면** 아무 폴더에서나 켜도 `/humanize-korean`이 동작합니다([설치](#설치-install) 참고).
|
||||
> **설치 없이 체험만 하려면** 방금 클론한 `im-not-ai` 폴더 **안에서** 실행하세요(프로젝트 로컬 스킬이 로드됩니다). 다른 위치에서 켜면 일반 Claude Code처럼 동작합니다.
|
||||
|
||||
### 3. AI가 쓴 한글 글 붙여넣고 부탁하기
|
||||
|
||||
|
|
@ -155,22 +184,30 @@ Claude Code에서는 세 가지 방법 중 편한 쪽으로 사용합니다. Cod
|
|||
/humanize [윤문할 텍스트 또는 파일 경로]
|
||||
```
|
||||
|
||||
옵션을 인자 끝에 자연어로 적을 수 있습니다: `장르: 칼럼`, `강도: 적극`, `최소심각도: S1`. 결과가 마음에 안 들면 `/humanize-redo "번역투만 다시"` 같은 식으로 재실행. 두 커맨드 정의: [`commands/`](.claude/commands/)
|
||||
옵션을 인자 끝에 자연어로 적을 수 있습니다: `장르: 칼럼`, `강도: 적극`, `최소심각도: S1`. 결과가 마음에 안 들면 `/humanize-redo "번역투만 다시"` 같은 식으로 재실행. 두 진입점은 이제 스킬입니다: [`humanize`](.claude/skills/humanize/SKILL.md) · [`humanize-redo`](.claude/skills/humanize-redo/SKILL.md)
|
||||
|
||||
**방법 C — Plugin / 자동 설치기** *(@gaebalai 포크)*
|
||||
**방법 C — Plugin / 마켓플레이스 (공식)**
|
||||
|
||||
[`gaebalai/im-not-ai`](https://github.com/gaebalai/im-not-ai) 포크가 Claude Code Plugin/Marketplace 규격으로 패키징되어 있습니다. `/plugin install humanize-korean@epoko77-ai-plugins` 또는 `./scripts/install.sh --target ~/my-project` 한 줄로 설치 가능합니다. 본체 정식 Plugin 지원은 v1.6 검토 중입니다 ([Issue 추적 예정](https://github.com/epoko77-ai/im-not-ai/issues)).
|
||||
본체가 이제 Claude Code Plugin/Marketplace를 **공식 지원**합니다. 클론 없이 마켓플레이스로 설치하세요:
|
||||
|
||||
**방법 D — Codex Plugin (community)**
|
||||
```
|
||||
/plugin marketplace add epoko77-ai/im-not-ai
|
||||
/plugin install humanize-korean@im-not-ai
|
||||
```
|
||||
|
||||
[`Squirbie/im-not-ai-codex`](https://github.com/Squirbie/im-not-ai-codex)에서 Codex Desktop/CLI용 community plugin 포트를 제공합니다. 원본 taxonomy/playbook을 유지하고 Codex plugin/skill 구조에 맞게 어댑터화한 별도 배포판이며, 공식 Claude Code 버전과 분리되어 관리됩니다.
|
||||
스킬 3개 + 서브에이전트 12개가 함께 설치됩니다. 자세한 옵션·스크립트 설치는 [설치](#설치-install) 섹션과 [`INSTALL.md`](INSTALL.md) 참고. (초기 패키징을 탐색한 [`gaebalai/im-not-ai`](https://github.com/gaebalai/im-not-ai) 포크도 있습니다.)
|
||||
|
||||
설치:
|
||||
**방법 D — Codex CLI (공식, Fast 모드)**
|
||||
|
||||
본체가 이제 Codex CLI Skills를 **공식 지원**합니다. 리포 클론 후 한 줄이면 `~/.codex/skills/`에 연결됩니다:
|
||||
|
||||
```bash
|
||||
codex plugin marketplace add Squirbie/im-not-ai-codex
|
||||
git clone https://github.com/epoko77-ai/im-not-ai.git && cd im-not-ai
|
||||
./install.sh --codex-only
|
||||
```
|
||||
|
||||
Codex에서 `$humanize-korean`으로 발동합니다(또는 `/skills` 메뉴). Codex는 단일 호출 **Fast 모드**만 제공하며, 정밀 strict 5인 파이프라인은 Claude Code 전용입니다. (Codex Desktop용 별도 어댑터로는 community 포트 [`Squirbie/im-not-ai-codex`](https://github.com/Squirbie/im-not-ai-codex)도 있습니다.)
|
||||
|
||||
**방법 E — Web UI (비공식)**
|
||||
|
||||
opencode 로 윤문하는 커뮤니티 제작 포트입니다.
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ model: opus
|
|||
|
||||
### 입력
|
||||
- `input_path`: `_workspace/{run_id}/01_input.txt` (절대 경로)
|
||||
- `quick_rules_path`: `.../skills/humanize-korean/references/quick-rules.md` (절대 경로)
|
||||
- `quick_rules_path`: 오케스트레이터가 전달하는 절대 경로(`${CLAUDE_SKILL_DIR}/references/quick-rules.md` 치환값). 에이전트는 이 인자를 그대로 Read 한다.
|
||||
- `genre_hint`: 칼럼 | 리포트 | 블로그 | 공적 | null (null이면 첫 300자로 자체 추정)
|
||||
|
||||
### 출력
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 75 KiB After Width: | Height: | Size: 71 KiB |
44
codex/skills/humanize-korean/SKILL.md
Normal file
44
codex/skills/humanize-korean/SKILL.md
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
---
|
||||
name: humanize-korean
|
||||
description: AI(ChatGPT·Claude·Gemini)가 쓴 한글 텍스트를 사람이 쓴 글처럼 윤문한다. 번역투·영어 인용 과다·기계적 병렬·관용구·피동 남용·접속사 남발·리듬 균일·이모지/불릿 과다 등 10대 카테고리 40+ AI 티 패턴을 탐지·분류해 내용은 한 글자도 건드리지 않고 문체·리듬·표현만 자연스럽게 재작성한다. 트리거 — "AI 티 없애줘", "AI 윤문", "ChatGPT 티 제거", "번역투 고쳐", "사람이 쓴 것처럼", "humanize Korean". 단순 맞춤법 교정·번역·내용 추가는 대상 아님.
|
||||
---
|
||||
|
||||
# Humanize Korean — Fast Path (Codex)
|
||||
|
||||
5,000자 이하 한글 텍스트의 "AI 티"를 한 번에 탐지·윤문·자체검증한다. Codex는 Fast(monolith) 모드만 제공한다 — 정밀 5인 파이프라인(strict)은 Claude Code 전용이다.
|
||||
|
||||
## 철칙 (위반 시 즉시 롤백)
|
||||
1. **의미 불변**: 사실·주장·수치·날짜·고유명사·인용문은 원문과 100% 일치.
|
||||
2. **근거 기반**: `references/quick-rules.md`에 매핑되지 않는 구간은 건드리지 않는다.
|
||||
3. **장르 유지**: 입력 장르(칼럼·리포트·블로그·공적)에서 이탈 금지.
|
||||
4. **register 보존**: 원문 격식체면 결과도 격식체. AI 티는 문법·수사이지 격식 자체가 아니다.
|
||||
5. **과윤문 금지**: 변경률 30% 초과 = 경고, 50% 초과 = 작업 중단·롤백.
|
||||
6. **Do-NOT**: 고유명사·수치·인용·법조문·영어 약어(LLM·GPU·API 등) 원형 보존.
|
||||
|
||||
## 절차 (단일 호출 안에서)
|
||||
1. **룰북 로드**: `references/quick-rules.md`(이 SKILL.md 디렉토리 기준 상대 경로)를 읽어 S1·S2 패턴과 자체검증 체크리스트를 내재화한다.
|
||||
2. **입력 확보**: 사용자가 붙여넣은 텍스트를 원문으로 한다. 인자가 파일 경로(.txt/.md)면 그 파일을 읽는다. 한국어가 아니면 "한국어 텍스트만 처리 가능" 안내 후 종료.
|
||||
3. **장르 추정**: 첫 300자로 장르 추정(사용자 명시 시 우선).
|
||||
4. **탐지**: A~J 카테고리 패턴을 메모리에서 스캔해 (ID, span, severity, fix) 수집. Do-NOT span은 제외.
|
||||
5. **윤문**: D(관용구 삭제) → A → I → G → H → F → B → C·J → E 순서로 문단 단위 처리. 변경률을 모니터링하며 50% 임박 시 후속 edit 보류.
|
||||
6. **자체검증**: quick-rules "자체검증 체크리스트" 6항 점검. 위반 항목 발견 시 해당 edit 롤백 → 윤문 부분 재실행(최대 1회).
|
||||
7. **출력**: cwd 기준 `_workspace/{run_id}/final.md` 작성(run_id = `YYYY-MM-DD-NNN`, 당일 기존 폴더 있으면 NNN+1). 본문 끝에 빈 줄 하나 두고 `<!-- HUMANIZE-SUMMARY ... -->` HTML 주석 블록 1개 추가:
|
||||
- 원본/윤문본 글자수·변경률
|
||||
- 카테고리별 탐지 건수(before → after, quick-rules ID 기준)
|
||||
- 자체검증 6항 통과 여부
|
||||
- 등급(A/B/C/D) + 사유 1줄
|
||||
- 주요 변경 하이라이트 3~5건(before → after, 각 100자 이내)
|
||||
8. **응답**: 사용자에게 짧게 4가지 반환 — ① 한 줄 상태(`완료. 변경률 X% / 등급 Y / 자체검증 N/6 통과`) ② 핵심 카테고리 탐지 4~6건(before → after) ③ 변경 하이라이트 1건 ④ 등급 B 이하면 "정밀 검증은 Claude Code의 strict 5인 파이프라인 권장" 안내. 윤문본 본문은 응답에 인라인하지 말고 `final.md`에만 저장.
|
||||
|
||||
## 등급
|
||||
- **A**: S1 0건, S2 2건 이하, 변경률 10~25%, 자체검증 6/6.
|
||||
- **B**: S1 0건, S2 4건 이하, 자체검증 5/6 이상.
|
||||
- **C/D**: S1 잔존 또는 과윤문 시그널 — Claude Code strict 모드 권고.
|
||||
|
||||
## 옵션 (인자 끝에 자연어로)
|
||||
- `장르: 칼럼|리포트|블로그|공적` · `강도: 보수|기본|적극` · `최소심각도: S1|S2|S3`
|
||||
|
||||
## 참고
|
||||
- 슬림 룰북: `references/quick-rules.md` — S1·S2 핵심 패턴 + 자체검증 체크리스트
|
||||
- 분류 체계 본진: `references/ai-tell-taxonomy.md` — 10대분류 × 40+ 패턴 전수
|
||||
- 윤문 처방: `references/rewriting-playbook.md` — 카테고리별 치환 레시피
|
||||
1
codex/skills/humanize-korean/references
Symbolic link
1
codex/skills/humanize-korean/references
Symbolic link
|
|
@ -0,0 +1 @@
|
|||
../../../.claude/skills/humanize-korean/references
|
||||
17
commands/humanize-korean.toml
Normal file
17
commands/humanize-korean.toml
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
prompt = """
|
||||
아래 한글 텍스트를 GEMINI.md에 정의된 Humanize Korean 룰에 따라 윤문하세요.
|
||||
|
||||
절차:
|
||||
1. 첫 300자로 장르를 추정합니다 (칼럼 | 리포트 | 블로그 | 공적).
|
||||
2. A~J 카테고리 패턴(S1·S2)을 스캔해 탐지합니다. Do-NOT 대상은 제외합니다.
|
||||
3. D(관용구) → A(번역투) → I(형식명사) → G(hedging) → H(접속사) → F(수식) → B(영어 인용) → C·J(구조·시각) → E(리듬) 순으로 윤문합니다.
|
||||
4. 자체검증 6항을 점검합니다. 위반 시 해당 edit을 롤백하고 부분 재실행합니다(최대 1회).
|
||||
5. 결과를 반환합니다:
|
||||
- 한 줄 상태: `완료. 변경률 X% / 등급 Y / 자체검증 N/6 통과`
|
||||
- 윤문본 본문 (마크다운 블록)
|
||||
- 카테고리별 탐지 건수 before/after + 주요 변경 하이라이트 3~5건
|
||||
- 등급 B 이하면 "정밀 검증이 필요하면 Claude Code의 strict 5인 파이프라인 권장" 안내
|
||||
|
||||
입력 텍스트:
|
||||
{{args}}
|
||||
"""
|
||||
19
commands/humanize-redo.toml
Normal file
19
commands/humanize-redo.toml
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
prompt = """
|
||||
가장 최근 윤문 결과를 2차로 다시 다듬어 주세요.
|
||||
|
||||
사용자 조정 지시:
|
||||
{{args}}
|
||||
|
||||
동작:
|
||||
1. 현재 디렉토리(cwd) 기준 `_workspace/` 아래에서 가장 최신 `final.md`(또는 `01_input.txt`)를 찾아 최근 run_id를 식별합니다. 없으면 "이전 실행이 없습니다. /humanize-korean으로 시작하세요" 안내 후 종료.
|
||||
2. 사용자 지시를 파싱합니다:
|
||||
- 카테고리 지정("번역투만", "관용구만") → 해당 카테고리 finding만 재윤문
|
||||
- 문단 지정("이 문단만") → 해당 범위 finding만
|
||||
- 강도 조정("강도 낮춰" → S1만, "강도 높여" → S1+S2+S3)
|
||||
- 지시 없음 → 잔존 finding 전체 대상 round 2
|
||||
3. GEMINI.md의 Humanize Korean 룰에 따라 해당 부분만 재윤문합니다.
|
||||
4. 자체검증 6항을 재점검합니다.
|
||||
5. 결과를 반환합니다 (변경 비교 표 + 신규 등급).
|
||||
|
||||
최대 round 3까지. 그 이상 미해결이면 사람 검토를 권고합니다.
|
||||
"""
|
||||
18
commands/humanize.toml
Normal file
18
commands/humanize.toml
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
prompt = """
|
||||
아래 한글 텍스트를 GEMINI.md에 정의된 Humanize Korean 룰에 따라 윤문하세요.
|
||||
/humanize-korean과 동일한 절차를 따릅니다.
|
||||
|
||||
절차:
|
||||
1. 첫 300자로 장르를 추정합니다 (칼럼 | 리포트 | 블로그 | 공적).
|
||||
2. A~J 카테고리 패턴(S1·S2)을 스캔해 탐지합니다. Do-NOT 대상은 제외합니다.
|
||||
3. D(관용구) → A(번역투) → I(형식명사) → G(hedging) → H(접속사) → F(수식) → B(영어 인용) → C·J(구조·시각) → E(리듬) 순으로 윤문합니다.
|
||||
4. 자체검증 6항을 점검합니다. 위반 시 해당 edit을 롤백하고 부분 재실행합니다(최대 1회).
|
||||
5. 결과를 반환합니다:
|
||||
- 한 줄 상태: `완료. 변경률 X% / 등급 Y / 자체검증 N/6 통과`
|
||||
- 윤문본 본문 (마크다운 블록)
|
||||
- 카테고리별 탐지 건수 before/after + 주요 변경 하이라이트 3~5건
|
||||
- 등급 B 이하면 "정밀 검증이 필요하면 Claude Code의 strict 5인 파이프라인 권장" 안내
|
||||
|
||||
입력 텍스트:
|
||||
{{args}}
|
||||
"""
|
||||
5
gemini-extension.json
Normal file
5
gemini-extension.json
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"name": "im-not-ai",
|
||||
"version": "1.5.0",
|
||||
"description": "AI가 쓴 한글 텍스트를 사람이 쓴 글처럼 윤문 — Fast(monolith) 모드. 10대 카테고리 40+ AI 티 패턴 탐지·재작성. Gemini CLI Extension."
|
||||
}
|
||||
134
install.sh
Executable file
134
install.sh
Executable file
|
|
@ -0,0 +1,134 @@
|
|||
#!/usr/bin/env bash
|
||||
# Humanize KR — Claude Code + Codex CLI + Gemini CLI 전역 설치 스크립트
|
||||
# 저장소를 클론한 뒤 `./install.sh` 한 번이면 설치된 CLI(claude/codex/gemini)를 자동 감지해
|
||||
# humanize-korean 스킬(+ 에이전트)을 전역으로 연결한다. 기본은 심링크(저장소 수정 즉시 반영).
|
||||
set -euo pipefail
|
||||
|
||||
REPO="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
CLAUDE_HOME="${CLAUDE_HOME:-$HOME/.claude}"
|
||||
CODEX_HOME="${CODEX_HOME:-$HOME/.codex}"
|
||||
|
||||
MODE=symlink # symlink | copy
|
||||
DO_CLAUDE=auto # auto | yes | no
|
||||
DO_CODEX=auto
|
||||
DO_GEMINI=auto
|
||||
FORCE=0
|
||||
DRYRUN=0
|
||||
TS="$(date +%Y%m%d-%H%M%S)"
|
||||
|
||||
print_help() {
|
||||
cat <<'H'
|
||||
Usage: ./install.sh [options]
|
||||
|
||||
설치된 CLI를 자동 감지해 humanize-korean 스킬을 전역 설치한다.
|
||||
Claude: ~/.claude/skills/{humanize-korean,humanize,humanize-redo} + ~/.claude/agents/*.md
|
||||
Codex : ~/.codex/skills/humanize-korean
|
||||
Gemini: gemini extensions link (gemini-extension.json + GEMINI.md + commands/)
|
||||
|
||||
Options:
|
||||
--copy 심링크 대신 복사(저장소를 지워도 유지, references 심링크는 실체화).
|
||||
※ 복사본은 uninstall.sh가 자동 삭제하지 않음(수동 삭제).
|
||||
--claude-only Claude만 설치
|
||||
--codex-only Codex만 설치
|
||||
--gemini-only Gemini만 설치
|
||||
--no-gemini Gemini 건너뜀 (claude/codex만)
|
||||
--force 대상에 일반 파일/디렉토리가 있어도 .bak.<ts> 백업 후 덮어씀
|
||||
--dry-run 실제 변경 없이 수행할 작업만 출력
|
||||
-h, --help 이 도움말
|
||||
|
||||
Env overrides: CLAUDE_HOME(기본 ~/.claude), CODEX_HOME(기본 ~/.codex)
|
||||
H
|
||||
}
|
||||
|
||||
while [ $# -gt 0 ]; do
|
||||
case "$1" in
|
||||
--copy) MODE=copy ;;
|
||||
--claude-only) DO_CODEX=no; DO_GEMINI=no ;;
|
||||
--codex-only) DO_CLAUDE=no; DO_GEMINI=no ;;
|
||||
--gemini-only) DO_CLAUDE=no; DO_CODEX=no; DO_GEMINI=yes ;;
|
||||
--no-gemini) DO_GEMINI=no ;;
|
||||
--force) FORCE=1 ;;
|
||||
--dry-run) DRYRUN=1 ;;
|
||||
-h|--help) print_help; exit 0 ;;
|
||||
*) echo "unknown arg: $1" >&2; print_help; exit 2 ;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
run() { echo "+ $*"; [ "$DRYRUN" = 1 ] || "$@"; }
|
||||
|
||||
# rc: 0=대상 비었음(설치 진행) / 1=이미 우리 심링크(스킵) / 2=충돌(거부)
|
||||
prepare_target() {
|
||||
local dest="$1" src="$2"
|
||||
if [ -L "$dest" ]; then
|
||||
if [ "$(readlink "$dest")" = "$src" ]; then
|
||||
echo "ok (already linked): $dest"; return 1
|
||||
fi
|
||||
run mv "$dest" "$dest.bak.$TS"
|
||||
elif [ -e "$dest" ]; then
|
||||
if [ "$FORCE" != 1 ]; then
|
||||
echo "refuse: $dest 가 이미 있음 (--force 로 백업 후 덮어쓰기 또는 --copy)"; return 2
|
||||
fi
|
||||
run mv "$dest" "$dest.bak.$TS"
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
|
||||
install_one() {
|
||||
local src="$1" dest="$2"
|
||||
run mkdir -p "$(dirname "$dest")"
|
||||
local rc=0
|
||||
prepare_target "$dest" "$src" || rc=$?
|
||||
[ "$rc" = 1 ] && return 0
|
||||
[ "$rc" = 2 ] && return 1
|
||||
case "$MODE" in
|
||||
symlink) run ln -s "$src" "$dest" ;;
|
||||
copy) run cp -RL "$src" "$dest" ;; # -L: references 심링크를 실체로 복사
|
||||
esac
|
||||
echo "installed: $dest"
|
||||
}
|
||||
|
||||
# ---- Claude ----
|
||||
if [ "$DO_CLAUDE" != no ] && { [ "$DO_CLAUDE" = yes ] || command -v claude >/dev/null 2>&1; }; then
|
||||
echo "== Claude Code =="
|
||||
run mkdir -p "$CLAUDE_HOME/skills" "$CLAUDE_HOME/agents"
|
||||
for s in humanize-korean humanize humanize-redo; do
|
||||
install_one "$REPO/.claude/skills/$s" "$CLAUDE_HOME/skills/$s"
|
||||
done
|
||||
for a in "$REPO/agents"/*.md; do
|
||||
install_one "$a" "$CLAUDE_HOME/agents/$(basename "$a")"
|
||||
done
|
||||
else
|
||||
echo "== Claude Code: 건너뜀 (claude 미감지 — 강제하려면 --claude-only) =="
|
||||
fi
|
||||
|
||||
# ---- Codex ----
|
||||
if [ "$DO_CODEX" != no ] && { [ "$DO_CODEX" = yes ] || command -v codex >/dev/null 2>&1; }; then
|
||||
echo "== Codex CLI =="
|
||||
run mkdir -p "$CODEX_HOME/skills"
|
||||
install_one "$REPO/codex/skills/humanize-korean" "$CODEX_HOME/skills/humanize-korean"
|
||||
else
|
||||
echo "== Codex CLI: 건너뜀 (codex 미감지 — 강제하려면 --codex-only) =="
|
||||
fi
|
||||
|
||||
# ---- Gemini CLI ----
|
||||
if [ "$DO_GEMINI" != no ] && { [ "$DO_GEMINI" = yes ] || command -v gemini >/dev/null 2>&1; }; then
|
||||
echo "== Gemini CLI =="
|
||||
if [ "$DRYRUN" = 1 ]; then
|
||||
echo "+ gemini extensions link $REPO (dry-run)"
|
||||
else
|
||||
echo "gemini extensions link \"$REPO\" 실행 (확장 등록)..."
|
||||
echo "Y" | gemini extensions link "$REPO" 2>/dev/null && echo "installed: Gemini extension (im-not-ai)" \
|
||||
|| echo " (이미 등록됨 또는 수동 등록 필요: gemini extensions link $REPO)"
|
||||
fi
|
||||
else
|
||||
echo "== Gemini CLI: 건너뜀 (gemini 미감지 — 강제하려면 --gemini-only) =="
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "완료 (mode=$MODE)."
|
||||
echo " Claude: 새 세션에서 /humanize-korean (또는 /humanize)"
|
||||
echo " Codex : \$humanize-korean"
|
||||
echo " Gemini: 새 세션에서 /humanize-korean (또는 /humanize)"
|
||||
echo " 업데이트: ./update.sh (새 버전 자동 감지 + 적용) · 제거: ./uninstall.sh"
|
||||
exit 0
|
||||
|
|
@ -120,11 +120,11 @@ def build():
|
|||
"→ 절·구로 풀어쓰기",
|
||||
),
|
||||
(
|
||||
"사고를 일으킨 회사에서 일했던 남자를 만났다.",
|
||||
[], # 관계절 좌향 수식은 통째로 어색 — 강조 없이
|
||||
"남자를 만났는데, 사고를 일으킨 회사에서 일했다.",
|
||||
"AI가 학습한 데이터가 보여주는 언어 패턴",
|
||||
[], # 좌향 2중 — 핵 어휘 "패턴"까지 관형구 누적
|
||||
"AI 학습 데이터의 언어 패턴",
|
||||
"A-18 관계절 좌향 수식",
|
||||
"→ 후치 동격절",
|
||||
"→ 관형구 압축",
|
||||
),
|
||||
]
|
||||
|
||||
|
|
|
|||
47
uninstall.sh
Executable file
47
uninstall.sh
Executable file
|
|
@ -0,0 +1,47 @@
|
|||
#!/usr/bin/env bash
|
||||
# Humanize KR — 전역 설치 제거 스크립트
|
||||
# install.sh가 만든 "이 저장소를 가리키는 심링크"만 제거한다. 사용자가 직접 둔 파일이나
|
||||
# 다른 곳을 가리키는 링크, .bak.* 백업은 건드리지 않는다. (--copy 설치본은 자동 삭제 대상 아님)
|
||||
set -euo pipefail
|
||||
|
||||
REPO="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
CLAUDE_HOME="${CLAUDE_HOME:-$HOME/.claude}"
|
||||
CODEX_HOME="${CODEX_HOME:-$HOME/.codex}"
|
||||
DRYRUN=0
|
||||
|
||||
case "${1:-}" in
|
||||
--dry-run) DRYRUN=1 ;;
|
||||
-h|--help) echo "Usage: ./uninstall.sh [--dry-run]"; exit 0 ;;
|
||||
"") ;;
|
||||
*) echo "unknown arg: $1" >&2; exit 2 ;;
|
||||
esac
|
||||
|
||||
remove_if_ours() {
|
||||
local dest="$1" src="$2"
|
||||
if [ -L "$dest" ] && [ "$(readlink "$dest")" = "$src" ]; then
|
||||
echo "+ rm $dest"; [ "$DRYRUN" = 1 ] || rm "$dest"
|
||||
elif [ -e "$dest" ]; then
|
||||
echo "skip (우리 것 아님): $dest"
|
||||
fi
|
||||
}
|
||||
|
||||
for s in humanize-korean humanize humanize-redo; do
|
||||
remove_if_ours "$CLAUDE_HOME/skills/$s" "$REPO/.claude/skills/$s"
|
||||
done
|
||||
remove_if_ours "$CODEX_HOME/skills/humanize-korean" "$REPO/codex/skills/humanize-korean"
|
||||
for a in "$REPO/agents"/*.md; do
|
||||
remove_if_ours "$CLAUDE_HOME/agents/$(basename "$a")" "$a"
|
||||
done
|
||||
|
||||
# ---- Gemini CLI ----
|
||||
if command -v gemini >/dev/null 2>&1; then
|
||||
echo "Gemini extension 제거 시도..."
|
||||
if [ "$DRYRUN" = 1 ]; then
|
||||
echo "+ gemini extensions uninstall im-not-ai (dry-run)"
|
||||
else
|
||||
gemini extensions uninstall im-not-ai 2>/dev/null && echo "removed: Gemini extension (im-not-ai)" \
|
||||
|| echo " (Gemini extension 미설치 또는 이미 제거됨)"
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "제거 완료. (.bak.* 백업·--copy 설치본은 보존)"
|
||||
73
update.sh
Executable file
73
update.sh
Executable file
|
|
@ -0,0 +1,73 @@
|
|||
#!/usr/bin/env bash
|
||||
# Humanize KR — 업데이트 감지 + 자동 적용
|
||||
# upstream(git)을 확인해 새 커밋이 있으면 fast-forward pull 후 install.sh를 재적용한다.
|
||||
# 심링크 설치는 pull만으로도 내용이 반영되지만, 신규 스킬/에이전트/구조 변경까지 확실히
|
||||
# 연결하려고 install.sh를 다시 실행한다(멱등).
|
||||
#
|
||||
# 사용:
|
||||
# ./update.sh 업데이트 감지 → 있으면 자동 적용
|
||||
# ./update.sh --check 감지만(적용 안 함). 최신=exit 0, 업데이트 있음=exit 10
|
||||
# 그 외 인자는 install.sh로 전달 (예: ./update.sh --copy --force, ./update.sh --codex-only)
|
||||
set -euo pipefail
|
||||
|
||||
REPO="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
g() { git -C "$REPO" "$@"; }
|
||||
|
||||
usage() { sed -n '2,11p' "$0"; }
|
||||
|
||||
CHECK_ONLY=0
|
||||
ARGS=()
|
||||
for a in "$@"; do
|
||||
case "$a" in
|
||||
--check) CHECK_ONLY=1 ;;
|
||||
-h|--help) usage; exit 0 ;;
|
||||
*) ARGS+=("$a") ;;
|
||||
esac
|
||||
done
|
||||
|
||||
g rev-parse --is-inside-work-tree >/dev/null 2>&1 || { echo "git 저장소가 아닙니다: $REPO"; exit 2; }
|
||||
|
||||
ver() { grep -o '"version"[[:space:]]*:[[:space:]]*"[^"]*"' "$REPO/.claude-plugin/plugin.json" 2>/dev/null \
|
||||
| head -1 | grep -o '[0-9][0-9.]*' \
|
||||
|| grep -o '"version"[[:space:]]*:[[:space:]]*"[^"]*"' "$REPO/gemini-extension.json" 2>/dev/null \
|
||||
| head -1 | grep -o '[0-9][0-9.]*' \
|
||||
|| echo "?"; }
|
||||
|
||||
UPSTREAM="$(g rev-parse --abbrev-ref --symbolic-full-name '@{u}' 2>/dev/null || echo origin/main)"
|
||||
UP_REMOTE="${UPSTREAM%%/*}"
|
||||
echo "업데이트 확인 중… (upstream: $UPSTREAM)"
|
||||
g fetch --quiet "$UP_REMOTE" || { echo "fetch 실패 — 네트워크/원격을 확인하세요."; exit 2; }
|
||||
|
||||
LOCAL="$(g rev-parse HEAD)"
|
||||
REMOTE="$(g rev-parse "$UPSTREAM" 2>/dev/null || true)"
|
||||
[ -z "$REMOTE" ] && { echo "upstream($UPSTREAM)을 찾을 수 없습니다."; exit 2; }
|
||||
BASE="$(g merge-base HEAD "$UPSTREAM" 2>/dev/null || echo "")"
|
||||
|
||||
if [ "$LOCAL" = "$REMOTE" ]; then
|
||||
echo "이미 최신입니다 — v$(ver) ($(g rev-parse --short HEAD))."
|
||||
exit 0
|
||||
elif [ "$BASE" = "$REMOTE" ]; then
|
||||
echo "로컬이 upstream보다 앞서 있습니다 — 적용할 업데이트 없음."
|
||||
exit 0
|
||||
elif [ "$BASE" != "$LOCAL" ]; then
|
||||
echo "로컬이 upstream과 갈라져 있어 자동 업데이트를 멈춥니다(수동 병합 필요)."
|
||||
echo " local=$(g rev-parse --short HEAD) upstream=$(g rev-parse --short "$UPSTREAM")"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 여기 도달 = behind, fast-forward 가능
|
||||
BEHIND="$(g rev-list --count "HEAD..$UPSTREAM")"
|
||||
echo "🔔 업데이트 있음: $BEHIND개 커밋 ($UPSTREAM)"
|
||||
g --no-pager log --oneline "HEAD..$UPSTREAM" 2>/dev/null | head -10 | sed 's/^/ /'
|
||||
|
||||
if [ "$CHECK_ONLY" = 1 ]; then
|
||||
echo "(--check: 적용하지 않음. 적용하려면 ./update.sh)"
|
||||
exit 10
|
||||
fi
|
||||
|
||||
OLD="$(ver)"
|
||||
echo "fast-forward pull…"
|
||||
g pull --ff-only
|
||||
echo "설치 재적용(install.sh, 멱등)…"
|
||||
"$REPO/install.sh" ${ARGS[@]+"${ARGS[@]}"}
|
||||
echo "✅ 자동 업데이트 완료: v$OLD → v$(ver)."
|
||||
Loading…
Add table
Add a link
Reference in a new issue