{
  "markdown": "<p align=\"center\">\n  <img src=\"https://em-content.zobj.net/source/apple/391/rock_1faa8.png\" width=\"120\" />\n</p>\n\n<h1 align=\"center\">caveman</h1>\n\n<p align=\"center\">\n  <strong>말 적게. 핵심만. 정확도 그대로.</strong>\n</p>\n\n<p align=\"center\">\n  <a href=\"https://github.com/JuliusBrussee/caveman/stargazers\"><img src=\"https://img.shields.io/github/stars/JuliusBrussee/caveman?style=flat&color=yellow\" alt=\"Stars\"></a>\n  <a href=\"https://github.com/JuliusBrussee/caveman/commits/main\"><img src=\"https://img.shields.io/github/last-commit/JuliusBrussee/caveman?style=flat\" alt=\"Last Commit\"></a>\n  <a href=\"LICENSE\"><img src=\"https://img.shields.io/github/license/JuliusBrussee/caveman?style=flat\" alt=\"License\"></a>\n</p>\n\n<p align=\"center\">\n  <a href=\"#before--after\">Before/After</a> ·\n  <a href=\"#install\">설치</a> ·\n  <a href=\"#intensity-levels\">강도</a> ·\n  <a href=\"#caveman-skills\">스킬</a> ·\n  <a href=\"#benchmarks\">벤치마크</a> ·\n  <a href=\"#evals\">평가</a>\n</p>\n\n---\n\n`caveman`은 Claude Code, Codex, Gemini CLI 같은 AI 코딩 에이전트가 더 짧고 압축적으로 말하게 만드는 스킬/플러그인입니다. 보통 **출력 토큰을 약 65~75% 줄이면서도 기술 정확도는 유지**합니다.\n\n> 이 저장소는 [JuliusBrussee/caveman](https://github.com/JuliusBrussee/caveman)을 포크한 저장소이며, 한국어 로컬라이징과 한글 호환성 개선 작업을 포함합니다. `README.md` 역시 원본 내용을 유지한 채 한국어로 옮긴 버전입니다.\n\n지금은 기본 caveman 모드뿐 아니라:\n\n- `lite`, `full`, `ultra` 강도 조절\n- `文言文` 기반 `wenyan` 모드\n- 짧은 커밋 메시지 생성\n- 한 줄 코드 리뷰\n- 세션마다 읽는 문서를 줄여주는 `caveman-compress`\n- 한국어 입력을 한국어로 유지하는 압축 규칙\n\n까지 들어 있습니다.\n\n핵심은 간단합니다.\n\n**같은 내용. 덜 장황하게. 더 빨리 읽힘.**\n\n## Before / After\n\n<table>\n<tr>\n<td width=\"50%\">\n\n### 일반 응답 (69 tokens)\n\n> \"The reason your React component is re-rendering is likely because you're creating a new object reference on each render cycle. When you pass an inline object as a prop, React's shallow comparison sees it as a different object every time, which triggers a re-render. I'd recommend using useMemo to memoize the object.\"\n\n</td>\n<td width=\"50%\">\n\n### Caveman 응답 (19 tokens)\n\n> \"New object ref each render. Inline object prop = new ref = re-render. Wrap in `useMemo`.\"\n\n</td>\n</tr>\n<tr>\n<td>\n\n### 일반 응답\n\n> \"Sure! I'd be happy to help you with that. The issue you're experiencing is most likely caused by your authentication middleware not properly validating the token expiry. Let me take a look and suggest a fix.\"\n\n</td>\n<td>\n\n### Caveman 응답\n\n> \"Bug in auth middleware. Token expiry check use `<` not `<=`. Fix:\"\n\n</td>\n</tr>\n</table>\n\n**같은 해결. 말 수만 줄음. Brain still big.**\n\n## 강도 비교\n\n<table>\n<tr>\n<td width=\"25%\">\n\n#### Lite\n\n> \"Your component re-renders because you create a new object reference each render. Inline object props fail shallow comparison every time. Wrap it in `useMemo`.\"\n\n</td>\n<td width=\"25%\">\n\n#### Full\n\n> \"New object ref each render. Inline object prop = new ref = re-render. Wrap in `useMemo`.\"\n\n</td>\n<td width=\"25%\">\n\n#### Ultra\n\n> \"Inline obj prop → new ref → re-render. `useMemo`.\"\n\n</td>\n<td width=\"25%\">\n\n#### Wenyan\n\n> \"物出新參照，致重繪。useMemo Wrap。\"\n\n</td>\n</tr>\n</table>\n\n한국어도 비슷하게 동작합니다.\n\n- 일반: `리액트 컴포넌트가 계속 리렌더링되는 이유는 부모가 새 객체 참조를 매번 만들기 때문입니다.`\n- Full: `부모가 매 렌더 새 객체 참조 생성. 자식 리렌더.`\n- Ultra: `새 참조 매 렌더 생성 → 리렌더.`\n\n## 왜 쓰나\n\n- **응답이 짧아짐**: 장황한 도입부, 완곡 표현, 반복 설명을 줄입니다.\n- **읽기 쉬움**: 스크롤 덜 함. 핵심 먼저 보임.\n- **속도 체감이 좋아짐**: 생성할 출력이 줄어들면 체감 응답도 빨라집니다.\n- **비용 절약 가능**: 출력 토큰이 줄면 비용도 줄어듭니다.\n- **정확도 유지 목표**: 코드는 안 바꾸고, 기술 용어는 그대로 둡니다.\n- **한국어 지원**: 한국어 질문은 한국어로 유지하면서 군더더기만 줄입니다.\n\n## Install\n\n한 번 설치하면 됩니다.\n\n| Agent | Install |\n|-------|---------|\n| **Claude Code** | `claude plugin marketplace add JuliusBrussee/caveman && claude plugin install caveman@caveman` |\n| **Codex** | 이 저장소를 clone한 뒤 로컬 플러그인에서 `Caveman` 설치 |\n| **Gemini CLI** | `gemini extensions install https://github.com/JuliusBrussee/caveman` |\n| **Cursor** | `npx skills add JuliusBrussee/caveman -a cursor` |\n| **Windsurf** | `npx skills add JuliusBrussee/caveman -a windsurf` |\n| **Copilot** | `npx skills add JuliusBrussee/caveman -a github-copilot` |\n| **Cline** | `npx skills add JuliusBrussee/caveman -a cline` |\n| **기타 에이전트** | `npx skills add JuliusBrussee/caveman` |\n\n설치 끝. 돌 하나. 끝.\n\n### What You Get\n\n| Feature | Claude Code | Codex | Gemini CLI | Cursor | Windsurf | Cline | Copilot |\n|---------|:-----------:|:-----:|:----------:|:------:|:--------:|:-----:|:-------:|\n| Caveman mode | Y | Y | Y | Y | Y | Y | Y |\n| 자동 활성화 | Y | Y (이 repo에서) | Y | 규칙 파일 추가 시 | 규칙 파일 추가 시 | 규칙 파일 추가 시 | 규칙 파일 추가 시 |\n| 강도 전환 | Y | Y | Y | Y | Y | 제한적 | 제한적 |\n| Commit 스킬 | Y | 플러그인 번들엔 없음 | Y | Y | Y | Y | Y |\n| Review 스킬 | Y | 플러그인 번들엔 없음 | Y | Y | Y | Y | Y |\n| Compress 스킬 | Y | Y | Y | Y | Y | Y | Y |\n| Help 스킬 | Y | 제한적 | Y | Y | Y | Y | Y |\n\n> [!NOTE]\n> Codex는 보통 `/caveman` 대신 `$caveman` 흐름이 핵심입니다. 이 저장소에는 `.codex/hooks.json`이 들어 있어서 **이 repo 안에서 Codex를 실행하면 자동 활성화**됩니다.\n>\n> `npx skills add`는 Cursor, Windsurf, Cline, Copilot에 스킬 파일은 넣어주지만, always-on 규칙 파일까지 항상 자동으로 넣는 건 아닙니다. 그래서 항상 켜고 싶다면 아래 설명처럼 규칙 파일이나 시스템 프롬프트도 같이 설정해야 합니다.\n\n<details>\n<summary><strong>Claude Code 상세</strong></summary>\n\n플러그인 설치만 하면 스킬과 훅이 같이 들어갑니다.\n\n```bash\nclaude plugin marketplace add JuliusBrussee/caveman\nclaude plugin install caveman@caveman\n```\n\n플러그인 시스템 없이 훅만 설치하려면:\n\n```bash\n# macOS / Linux / WSL\nbash <(curl -s https://raw.githubusercontent.com/JuliusBrussee/caveman/main/hooks/install.sh)\n\n# Windows (PowerShell)\nirm https://raw.githubusercontent.com/JuliusBrussee/caveman/main/hooks/install.ps1 | iex\n```\n\n또는 로컬 clone에서:\n\n```bash\nbash hooks/install.sh\npowershell -File hooks\\install.ps1\n```\n\n제거:\n\n```bash\nbash hooks/uninstall.sh\npowershell -File hooks\\uninstall.ps1\n```\n\n상태줄 배지도 지원합니다. `[CAVEMAN]`, `[CAVEMAN:ULTRA]` 같이 보입니다.\n\n</details>\n\n<details>\n<summary><strong>Codex 상세</strong></summary>\n\n**macOS / Linux**\n\n1. 저장소 clone\n2. Codex를 이 repo에서 실행\n3. `/plugins` 또는 플러그인 설정에서 `Caveman` 설치\n\n**Windows**\n\n1. 필요하면 symlink 허용: `git config --global core.symlinks true`\n2. 저장소 clone\n3. VS Code에서 Codex 설정 열기\n4. 로컬 플러그인 목록에서 `Caveman` 설치\n\n이 저장소에는 `.codex/hooks.json`이 포함되어 있어서 repo-local 자동 활성화가 됩니다. 플러그인 자체는 `$caveman` 기반 사용 흐름을 제공합니다.\n\n</details>\n\n<details>\n<summary><strong>Gemini CLI 상세</strong></summary>\n\n```bash\ngemini extensions install https://github.com/JuliusBrussee/caveman\n```\n\n업데이트:\n\n```bash\ngemini extensions update caveman\n```\n\n제거:\n\n```bash\ngemini extensions uninstall caveman\n```\n\n`GEMINI.md`를 통해 자동 활성화됩니다.\n\n</details>\n\n<details>\n<summary><strong>Cursor / Windsurf / Cline / Copilot 상세</strong></summary>\n\n```bash\nnpx skills add JuliusBrussee/caveman -a cursor\nnpx skills add JuliusBrussee/caveman -a windsurf\nnpx skills add JuliusBrussee/caveman -a cline\nnpx skills add JuliusBrussee/caveman -a github-copilot\n```\n\n기본 설치는 스킬 파일 위주입니다. 항상 켜고 싶으면 규칙 파일이나 시스템 프롬프트에 아래 같은 문장을 넣으면 됩니다.\n\n```text\nTerse like caveman. Technical substance exact. Only fluff die.\nKeep user's language. Korean stays Korean unless user asks otherwise.\nDrop filler, pleasantries, hedging. Fragments OK. Code unchanged.\nACTIVE EVERY RESPONSE. Off: stop caveman / normal mode / 일반 말투로.\n```\n\n</details>\n\n<details>\n<summary><strong>기타 에이전트</strong></summary>\n\n`npx skills`는 40개 이상의 에이전트를 지원합니다.\n\n```bash\nnpx skills add JuliusBrussee/caveman\nnpx skills add JuliusBrussee/caveman -a amp\nnpx skills add JuliusBrussee/caveman -a goose\nnpx skills add JuliusBrussee/caveman -a roo\n```\n\n제거:\n\n```bash\nnpx skills remove caveman\n```\n\n> Windows에서 symlink가 막히면 `--copy`를 붙이세요.\n\n</details>\n\n## Usage\n\n켜는 방법:\n\n- `/caveman`\n- Codex에서는 보통 `$caveman`\n- `talk like caveman`\n- `caveman mode`\n- `less tokens please`\n- `원시인 모드`\n- `짧게 말해`\n- `토큰 아껴서 말해`\n\n끄는 방법:\n\n- `stop caveman`\n- `normal mode`\n- `일반 말투로`\n- `원래 말투로`\n\n## Intensity Levels\n\n| Level | Trigger | 설명 |\n|-------|---------|------|\n| **Lite** | `/caveman lite` | 문장 구조는 유지하고 군더더기만 제거 |\n| **Full** | `/caveman` | 기본 모드. 짧은 문장, 문장 조각 허용 |\n| **Ultra** | `/caveman ultra` | 더 공격적 압축. 명사구/단문 위주, 조사와 연결 표현도 의미 안 흐릴 때만 줄임 |\n\n한국어에서는 대체로 이런 느낌입니다.\n\n- `lite`: 자연스러운 존댓말 유지\n- `full`: 짧은 평서 중심으로 압축\n- `ultra`: 명사구/단문 위주. `그래서/하지만/또한/그리고/따라서`는 `.`, `:`, `→`로 치환 가능\n\n### 文言文 (Wenyan) Mode\n\n고전 중국어식 압축 모드입니다. 토큰 효율을 극단으로 밀고 싶은 사람용입니다.\n\n| Level | Trigger | 설명 |\n|-------|---------|------|\n| **Wenyan-Lite** | `/caveman wenyan-lite` | 고전 문체 느낌만 살짝 |\n| **Wenyan-Full** | `/caveman wenyan` | 완전 문언문 압축 |\n| **Wenyan-Ultra** | `/caveman wenyan-ultra` | 가장 과격한 압축 |\n\n## Caveman Skills\n\n| Skill | Trigger | 설명 |\n|-------|---------|------|\n| **caveman-commit** | `/caveman-commit` | 짧은 Conventional Commit 메시지 생성 |\n| **caveman-review** | `/caveman-review` | 한 줄 코드 리뷰 코멘트 생성 |\n| **caveman-help** | `/caveman-help` | 모드/명령어 요약 카드 |\n\n### caveman-compress\n\n`caveman`이 **말하는 출력**을 줄인다면, `compress`는 **세션마다 읽는 입력 문서**를 줄입니다.\n\n예:\n\n```bash\n/caveman:compress CLAUDE.md\n```\n\n결과:\n\n```text\nCLAUDE.md          -> 압축본\nCLAUDE.original.md -> 사람이 읽고 수정할 원본 백업\n```\n\n즉, Claude가 세션 시작 때 읽는 문서를 더 짧게 만들어 **매 세션 입력 토큰을 줄이는 방식**입니다.\n\n| File | Original | Compressed | Saved |\n|------|----------:|----------:|------:|\n| `claude-md-preferences.md` | 706 | 285 | **59.6%** |\n| `project-notes.md` | 1145 | 535 | **53.3%** |\n| `claude-md-project.md` | 1122 | 636 | **43.3%** |\n| `todo-list.md` | 627 | 388 | **38.1%** |\n| `mixed-with-code.md` | 888 | 560 | **36.9%** |\n| **Average** | **898** | **481** | **46%** |\n\n보존 대상:\n\n- 코드 블록\n- 인라인 코드\n- URL\n- 파일 경로\n- 명령어\n- 제목\n- 숫자, 날짜, 버전\n\n## Benchmarks\n\n실제 Claude API 기준 토큰 측정값입니다.\n\n<!-- BENCHMARK-TABLE-START -->\n| Task | Normal (tokens) | Caveman (tokens) | Saved |\n|------|---------------:|----------------:|------:|\n| Explain React re-render bug | 1180 | 159 | 87% |\n| Fix auth middleware token expiry | 704 | 121 | 83% |\n| Set up PostgreSQL connection pool | 2347 | 380 | 84% |\n| Explain git rebase vs merge | 702 | 292 | 58% |\n| Refactor callback to async/await | 387 | 301 | 22% |\n| Architecture: microservices vs monolith | 446 | 310 | 30% |\n| Review PR for security issues | 678 | 398 | 41% |\n| Docker multi-stage build | 1042 | 290 | 72% |\n| Debug PostgreSQL race condition | 1200 | 232 | 81% |\n| Implement React error boundary | 3454 | 456 | 87% |\n| **Average** | **1214** | **294** | **65%** |\n\n*범위: 22%~87% 절감*\n<!-- BENCHMARK-TABLE-END -->\n\n> [!IMPORTANT]\n> Caveman은 **출력 토큰**을 줄입니다. 모델의 숨은 추론 토큰까지 줄이는 건 아닙니다. Brain not smaller. Mouth smaller.\n\n2026년 3월 논문 [\"Brevity Constraints Reverse Performance Hierarchies in Language Models\"](https://arxiv.org/abs/2604.00025)은, 짧게 답하도록 제약했을 때 특정 벤치마크에서 정확도가 오히려 올라가는 경우도 보여줬습니다. 말 많다고 늘 더 똑똑한 건 아닙니다.\n\n## Evals\n\n`evals/`에는 세 가지 조건을 비교하는 harness가 있습니다.\n\n- `__baseline__`: 시스템 프롬프트 없음\n- `__terse__`: `Answer concisely.`\n- `<skill>`: `Answer concisely.` + `SKILL.md`\n\n중요한 포인트:\n\n**공정한 비교는 `verbose vs caveman`이 아니라 `terse vs caveman`입니다.**\n\n그렇지 않으면 단순히 \"짧게 말하라\" 효과와 skill 자체 효과가 섞여버립니다.\n\n실행:\n\n```bash\nuv run python evals/llm_run.py\nuv run --with tiktoken python evals/measure.py\n```\n\n한국어 프롬프트도 이제 `evals/prompts/ko.txt`에 포함됩니다.\n\n## Star This Repo\n\n토큰 많이 아꼈으면 star도 많이 주기.\n\n[![Star History Chart](https://api.star-history.com/svg?repos=JuliusBrussee/caveman&type=Date)](https://star-history.com/#JuliusBrussee/caveman&Date)\n\n## Also by Julius Brussee\n\n- **[Cavekit](https://github.com/JuliusBrussee/cavekit)**: Claude Code용 specification-driven development\n- **[Revu](https://github.com/JuliusBrussee/revu-swift)**: FSRS 기반 로컬 macOS 학습 앱, [revu.cards](https://revu.cards)\n\n## License\n\nMIT.\n열린 평원 위 매머드처럼 자유.\n",
  "bytes": 11187,
  "sha": "f18c339ac7b5f6912a813749fc047c44a3bbcaa2a75dfe97c86075f03d8d7956",
  "repo_slug": "blacknabis/cavemankorean",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/plg_blacknabis_cavemankorean_21bafc38/readme"
}