Metadata-Version: 2.4
Name: cjagent
Version: 0.100.0
Summary: 창진 에이전트 — 로컬 오픈 웨이트 모델 기반 코딩 에이전트 (Claude Code 유형) · CLI
Author: cjagent
License: MIT
Keywords: llm,coding-agent,local,openai-compatible,cli
Requires-Python: >=3.10
Description-Content-Type: text/markdown
Requires-Dist: requests>=2.31
Requires-Dist: PyYAML>=6.0
Requires-Dist: rich>=13.0
Provides-Extra: tokenizer
Requires-Dist: tiktoken>=0.7; extra == "tokenizer"
Provides-Extra: dev
Requires-Dist: pytest>=8; extra == "dev"

# cjagent

로컬 오픈 웨이트 모델(Qwen3-Coder, Devstral, GLM, DeepSeek, gpt-oss 등)로 동작하는
**Claude Code 유형 코딩 에이전트 CLI**. 설계도(`../로컬-코딩-에이전트-설계도.md`)의 코어를 구현한 MVP입니다.

클라우드로 코드가 나가지 않으며, OpenAI 호환 엔드포인트(llama.cpp / Ollama / LM Studio / vLLM)에
`base_url`만 바꿔 붙습니다.

---

## 설치

```bash
# 프로젝트 디렉토리(mvp/)에서
pipx install .          # 권장: 격리 설치, 어디서든 `cjagent` 실행
# 또는
pip install -e .        # 개발 설치
```

설치 후 `cjagent` 명령이 생깁니다.

## 빠른 시작

### 1) 로컬 모델 서버 켜기 (아무 OpenAI 호환 서버든 OK)

```bash
# Ollama 예시
ollama serve
ollama pull qwen3-coder:30b

# 또는 llama.cpp
llama-server -m qwen3-coder-30b-a3b.Q5_K_M.gguf --jinja --cache-reuse 256 -c 65536
```

### 1.5) 하드웨어에 맞는 모델 추천·다운로드

```bash
cjagent models              # 실행 중 서버(Ollama·LM Studio 등) + GPU/메모리 기반 추천
cjagent models fit          # 이미 '설치된' 모델을 스캔해 GPU 적합도(빠름/느림)·품질 순 추천
cjagent models running      # 지금 GPU에 '로드(가동)'된 모델 보기(설치만 된 것과 구분)
cjagent models servers      # 실행 중인 로컬 서버와 로드된 모델만 보기
cjagent models use lmstudio # LM Studio를 기본 서버로 원클릭 설정(config 자동 작성)
cjagent models list         # 전체 카탈로그(태그·VRAM·SWE-bench·라이선스)
cjagent models pull qwen3-coder-30b   # Ollama/LM Studio로 원클릭 다운로드
```

**Ollama·LM Studio 자동 감지**: 실행 중이면 포트(11434/1234)를 탐지해 로드된 모델과 사용 명령을 보여줍니다.
LM Studio는 OpenAI 호환 엔드포인트라 동일하게 동작하며, 툴콜을 content로 흘리는 약한 모델(qwen2.5-coder:7b 등)도
자동 파싱해 실행합니다.

카탈로그(2026): Qwen3-Coder 30B-A3B/480B/Next · Devstral Small 2 · GLM-4.7-Flash/4.5-Air/4.6 · gpt-oss 20B/120B ·
DeepSeek V3.2 · Kimi K2 · Qwen2.5-Coder 7B/14B. NVIDIA·Apple 통합메모리·AMD·CPU RAM을 감지해 맞는 모델을 고릅니다.

### 2) 설정

```bash
cjagent doctor                 # 환경 진단(설치·서버·모델·PATH) + 바로 쓸 다음 명령 안내
cjagent --init-config          # ~/.config/cjagent/config.yaml 생성 후 편집
# 또는 프로젝트에 ./.cjagent.yaml 을 두거나, 환경변수/플래그로 지정
```

`config.example.yaml` 참고. 주요 항목: `base_url`, `model`, `mode`.

### 3) 실행

```bash
cjagent                                   # 대화형 REPL
cjagent "src의 버그를 찾아 고치고 테스트 돌려줘"   # 1회 실행(one-shot)
cjagent --model devstral --mode default   # 옵션 오버라이드
```

## 서버 없이 점검 (오프라인)

모델 서버가 없어도 설치·툴·파서·권한 파이프라인을 검증할 수 있습니다.

```bash
cjagent --selfcheck
```

## 권한 모드 (설계도 §12)

| 모드 | 동작 |
|---|---|
| `plan` | 읽기 전용. 쓰기/실행은 거부(모드 전환 필요) |
| `default` | 파일 쓰기·셸 실행 시 확인 |
| `acceptEdits` | 파일 편집 자동 승인, 셸은 확인 |
| `auto` | **런치 기본(최대권한).** 대부분 자동(단, 파괴적 명령은 항상 확인) |

REPL에서 `/mode default` 등으로 전환. `/help`로 전체 명령 확인.

## 자가 업그레이드 (0.60)

`cjagent upgrade` — 다른 코딩 에이전트의 기능을 수집·분석해 cjagent의 격차를 파악하고, 스스로 소스를 고치고 테스트하기를 반복한다.

```bash
cjagent upgrade              # 격차 분석 + UPGRADE.md 리포트만 (소스 무수정, 안전)
cjagent upgrade --research   # + 다른 에이전트 문서를 네트워크로 수집해 카탈로그 확장
cjagent upgrade --apply 2    # 실제로 상위 2건을 구현·자가테스트(통과 시 유지, 실패 시 자동 롤백)

cjagent train 6             # 스스로 과제 6개를 만들고·풀고·채점 → 약점 도출(TRAINING.md, 자기소스 무수정)
cjagent upgrade --train --apply   # 훈련으로 찾은 '경험적 약점'을 우선 개선

# 스케줄 실행(수동 외) — Windows schtasks / Unix crontab
cjagent schedule add nightly daily@03:00 upgrade --apply
cjagent schedule list
cjagent schedule remove nightly
```

- **수집** → **현재역량 스냅샷** → **격차분석**(이미 있는 기능은 결정론적으로 제외) → **구현·자가테스트 루프**.
- **자가 훈련**: 다양한 난이도·규모의 과제를 스스로 생성→격리 스크래치에서 시도→객관 채점(verify)→실패 패턴을 개선 대상으로.
- **안전**: cjagent 레포에서만 동작 · 각 변경은 전체 테스트 통과 시에만 유지 · 실패/앵커부재 시 체크포인트 완전 롤백(앵커 없으면 자기수정 시작 안 함) · **push/배포/의존성설치는 권한 엔진으로 강제 차단** · 기본은 분석만(`--apply` 로만 자기수정).

## 터미널 UX — Claude Code 스타일 실시간 표시 (0.5+, 0.8)

모델이 지금 무엇을 하는지 라이브로 보여줍니다:
- **✻ 생각 중…** 스피너(응답 대기) → 스트리밍 답변, **💭 추론 중…**(reasoning 모델은 사고를 접고 최종만 렌더).
- **⏺ 툴(인자)** → **⏳ 실행 중…** 스피너 → **⎿ 결과**(색상 unified-diff / 요약).
- **편집 승인 전 diff 미리보기**, 컨텍스트 토큰 미터.
- **경과시간·토큰속도**: `✻ 생각 중… 3s` · `💭 추론 중… 5s · 42 tok/s` · `⏳ 실행 중: bash… 2s`, 응답 후 타이밍 푸터.
- **자율 모드 라이브 헤더**(라운드/검증 상태) + **세션 활동 요약 패널**(`/summary`: 편집 파일·명령·툴 횟수).
- 비-TTY/파이프에서는 자동으로 플레인 모드(`--plain` 강제, `NO_COLOR` 존중). Windows cp949 콘솔 크래시 방지.
- **Ctrl+C**: 현재 턴만 취소(부분 응답 보존), 앱은 유지.
- **명령**: `/context` `/cost`(토큰) · `/diff` `/undo` `/rewind`(변경/되돌리기) · `/compact` `/retry` `/status` `/tail`
  · `/mode` `/model` `/map` `/save` `/snapshot` `/checkpoints` `/restore`.
- **품질**: 실행 가능한 에러 메시지, 툴 실패 시 구체 제안, 약한 모델용 few-shot, 로컬 서버 자동 탐지 온보딩.

### 터미널 UX gap 개선 — Claude Code CLI 대비 (0.13)
Claude Code 터미널과 비교 분석해 부족했던 대화 UX를 보강했습니다:
- **입력**: `@경로`(파일 내용 자동 첨부·디렉토리 목록, 워크스페이스 밖 차단) · `!명령`(모델 없이 셸 직접 실행) ·
  줄 끝 `\` 또는 `"""` 히어독(여러 줄 입력).
- **명령**: `/rewind [N]`(대화+파일 동시 되감기) · `/test` `/lint` `/review` · `/sessions` `/load`(+`--continue`) ·
  `/export`(Markdown/JSON 전사) · `/copy`(마지막 응답 클립보드) · `/history` · `/debug`(원시 응답).
- **사용자 정의 명령**: `.cjagent/commands/<이름>.md` → `/이름 인자`(`$ARGUMENTS`·`$1..$9` 치환).
- **표시**: `todo_write` → 라이브 체크박스 TODO 패널(`☐ ▶ ☑`).
- **안전/운영 플래그**: `--dry-run`(상태 변경 미실행 미리보기) · `--verbose`/`--debug`(원시 HTTP를 `~/.cjagent/debug.log`) ·
  상태 변경 승인 **감사 로그**(`.cjagent/audit.log`, 값 대신 지문 저장).

### 대규모/복잡 프로젝트 처리 (0.14)
큰 실제 모노레포(수만 파일, 폴리글랏)에서 "분석 + 문서 작성" 같은 복잡 작업이 멈추던 문제를 근본 수정:
- **시작 즉시 반응**: repo map이 `os.walk` + 무시 디렉토리 프루닝 + 대용량 파일 스킵으로, 14k 파일 리포도 0.37초.
- **크래시 없음**: 셸/그repl/git 출력 인코딩(cp949↔UTF-8)으로 죽지 않음(UTF-8 우선→로케일 폴백 디코드).
- **완주 유도**: 파일 산출물을 요구했는데 안 만들고 끝내려 하면 1회 유도(직접 write, 되묻기/위임 금지).
- **데이터 보호**: `write_file` 대량삭제 가드(기존 큰 파일을 작은 내용으로 덮어쓰기 차단, `overwrite=true`로만),
  바이너리 파일은 `[binary file]`로 알림(환각 방지), 편집 전 git-shadow 체크포인트로 `/undo`·`/rewind` 복구.
- **약한 모델(7B)로도 완주 — 하네스 분해(0.15)**: GPU가 부족해 큰 모델을 못 쓸 때, 큰 작업을 하네스가 잘게
  쪼개 7B에게는 작은 요약만 시킵니다. `cjagent --docgen [파일]` (또는 대규모 리포에서 "…기능정의서를 작성해줘"
  자동 라우팅)이 **map-reduce**로 동작: repo map(PageRank)으로 상위 파일 선별 → 심볼 추출(오프라인) →
  모듈별 작은 단일 요약(모델) → 고정 템플릿 조립 → 새 .md 1회 기록. 모델 호출 수가 유계라 CPU 7B에서도 빠릅니다.
  **실측: 14,569파일 Bonzaworld를 `qwen2.5-coder:7b`로 21초 만에 기능정의서 생성.**
  ```bash
  cjagent --docgen 기능정의서.md   # 현재 폴더 프로젝트 분석 → 문서 생성(7B로도 완주)
  ```
  qwen2.5-coder는 basic 티어(32k 창)로 프로파일링되어 컨텍스트 오버플로를 막고, basic 티어에서는 통짜-위임을
  유발하던 `task` 서브에이전트가 꺼집니다(`subagents_for_basic: true`로 복원 가능).
- **7B 에이전트 신뢰성(0.16)**: 무거운 작업(버그수정·리팩터·기능추가·테스트작성)을 실측해 근본버그를 고침.
  약한 모델이 툴콜을 `write_file {json}`처럼 **이름을 JSON 밖에** 두는 형식으로 내도 파싱(이전엔 폐기됨);
  **`rename_symbol`** 툴로 다중파일 이름변경을 단어경계로 한 번에 완전 처리; `edit_file`은 들여쓰기가 어긋난
  old_string도 공백정규화로 회복. 이 덕분에 배터리가 1/4→3/4 클린 통과로 개선됐습니다.
- **의도 파악 & 범위 규율(0.17)**: "시키지 않은 일을 한다"를 개선. 시스템 프롬프트에 **범위 규율**(요청한 것만·
  안 시킨 파일 생성/무관한 리팩터·삭제 금지·"추가=기존 코드 보존"·의도 재진술), 불명확하면 **대화형은 되묻고
  자율은 가정 명시**, 완료 넛지는 밀어붙이지 않도록 완화(질문으로 끝내면 넛지 안 함). 코드 차원의 **스코프
  백스톱**: 이번 요청에서 언급·read 안 한 기존 파일을 write_file로 덮어쓰면 차단(무관한 파일 오염 방지).
- **파괴적 편집 차단(0.18)**: `edit_file`이 (1)유효했던 파일을 **구문 오류**로 만들거나 (2)파이썬 **기존 def/class를
  없애면** 적용하지 않고 되돌립니다(무엇이 유실되는지 안내). 약한 모델이 새 함수를 삽입하려다 기존 함수를 통째로
  덮어써 코드를 잃던 문제를 근본 차단. 의도적 삭제·이름변경은 `allow_delete=true`/`rename_symbol` 사용.
- **창진 에이전트 · 감정 인지·대응(0.28)**: 에이전트 이름은 **'창진 에이전트'**. `emotion.py`가 사용자 메시지의
  정서를 규칙 기반으로 감지(frustrated/urgent/positive/neutral — 한국어 구어+영어 단서, 무거운 모델 불필요)하고
  **두 겹으로 대응**한다: ① 감지 라벨의 **톤 힌트를 이번 턴 한정 system 프롬프트에 주입→응답 후 원복**해 모델이
  "짧게 공감 → 곧바로 해결"로 답하도록 유도, ② 좌절/조급 감지 시 **결정론적 공감 한 줄**을 즉시 노출. 과업 흐름·
  범위 규율은 그대로. 실측: 30B에 "왜 자꾸 안 돼 짜증나" → frustrated 감지, 공감 후 즉시 진단으로 전환.
- **노력 제어 · 울트라코드 · 자동노력(0.29)**: `effort.py`가 노력을 티어(minimal/low/medium/high/max/**ultra**)로
  묶어 **최대 턴·검증 라운드·reasoning_effort·컨텍스트(메모리) 예산·repo map·자기검토**를 한 번에 조절한다.
  `--effort <tier>`/REPL `/effort`, **`--ultra`**(=effort ultra). **medium은 기존 기본과 동일**(하위호환).
  **울트라코드**: 자연 완료 후 파일 변경이 있으면 모델이 자기 **diff를 적대적으로 자기검토→실제 문제만 최소 수정**
  (self_review_rounds 회, 새 변경이 없으면 수렴 정지; 범위 규율·편집 가드 유지). **자동노력**(`effort: auto`, 기본):
  요청 난이도 추정(범위/동작 키워드·파일 수·다단계·트레이스백, 부정문·점표기 오탐 방지)→티어 자동 선택 + **VRAM에
  맞춘 메모리 클램프**(16GB에서 컨텍스트를 절대 키우지 않아 OOM 불가). reasoning_effort/max_tokens는 지원 서버만
  반영하고 400이면 벗겨 재시도(이식성). 실측: 30B가 오타→minimal·리팩터+테스트→high·마이그레이션→max로 분류,
  `--ultra`가 multiply 추가 후 자기검토→수렴(add 보존).
- **백그라운드/서버 프로세스 관리(0.30)**: 에이전트가 **서버를 스스로 가동·제어**. `bash(background=true, wait_port=PORT)`가
  서버를 백그라운드로 분리 실행하고(포트 리슨까지 대기), **`process`**(list/logs/stop/stop_all)로 상태·로그·종료를 제어한다
  (`procman.py`). 포그라운드 bash는 타임아웃까지 블로킹돼 서버를 못 띄우던 한계 해결. 세션 종료·크래시 시 **트리째 자동
  정리**(atexit + close 언레지스터; one-shot/REPL/autonomous/데몬/eval 전 경로). 백그라운드도 포그라운드와 **동일한 OS
  샌드박스 감금**(bwrap/seatbelt) 적용. 실측: 30B가 채팅 웹사이트(server.py+index.html+/messages API) 생성→서버 기동→
  curl 테스트→process(stop)으로 종료, 고아 0. 적대적 리뷰(23-agent)로 확정 12건 수정.
- **감정 인지 v2 + 벽시계 강화(0.31)**: `emotion.py`가 오탐을 적극 방어한다 — `_defuse`가 인용/코드/주석/에러 스팬을
  국소 제거하고(진짜 감정 보존) 부정문을 중화("안 답답"·"급하지 않"·"걱정 마"·영어 `won't`/`don't`), 식별자·기술약어도
  오탐 안 함. 신규 라벨 **confused/anxious**, 강/약 조급 구분(단독 '빨리'=중립). **다중 턴 좌절이 지속되면**(연속 2턴+)
  어조가 아니라 **전략 전환을 유도**(멈춤→재진단→다른 접근)하고 공감 한 줄은 반복하지 않는다. `config.emotion`·REPL
  `/emotion`·세션 요약 정서 아크·rewind/clear/load 리셋. 또 `--max-seconds`를 **run() 턴 내부에서도 존중**(churn 폭주 방지).
  적대적 리뷰(15-agent)로 확정 10건 수정(자율 검증로그 오분류·축약형 아포스트로피·안심표현 오탐 등). 실측: 30B 3턴 대화에서
  좌절 2턴째 에스컬레이션→모델이 파일 재확인·재진단으로 전략 전환.
- **출력 자동 줄바꿈 + 컨텍스트 128K(0.32)**: plain 터미널(`ui/repl.py`)이 스트리밍 응답·안내를 **터미널 폭에 맞춰
  단어 단위로 접는다** — **CJK 2칸 폭** 반영(한글이 화면 밖으로 안 흐름), 긴 토큰 강제 분할, 스트리밍 중 열 추적,
  비 TTY(파이프/eval)는 원문 보존(`CJAGENT_NOWRAP=1`로 끔). **컨텍스트 128K 확장**: effort 메모리 클램프를
  **VRAM+RAM 인지**로 바꿔(`safe_context_cap(vram, ram)` — RAM 오프로드 여유 반영) 가용 메모리 내 최대 컨텍스트를
  쓴다. `hardware.detect_hardware()`가 `ram_total_gb`도 보고, 사용자 설정 `context_window: 131072` +
  Ollama `num_ctx 131072` → 유효 예산 ~14.7K→~59K(4×). ⚠128K KV(~12GB)는 16GB GPU 초과분을 RAM 오프로드(느림)
  → 느리면 num_ctx 낮추거나 `OLLAMA_KV_CACHE_TYPE=q8_0`(KV 양자화) 권장.

## 자율(YOLO) 모드 — 전권 자동 승인 + 끝까지 자동 구현 (0.6)

```bash
cjagent --yolo "결제 모듈 버그 고치고 테스트 통과시켜줘"     # 또는 --auto
cjagent --yolo --verify-cmd "npm test" "다크 모드 추가해줘"   # 검증 명령 지정
# REPL 안에서:  /auto 리팩터링하고 테스트 돌려줘
```

- **모든 권한을 자동 승인**하고 작업이 끝날 때까지 스스로 구현·검증·수정합니다.
- 자연 완료 시 **자동 검증**(pytest/npm test/make test/cargo test/go test 자동 발견), 실패하면 결과를
  되먹여 자동 수정 → 최대 `auto_max_rounds`(기본 8)까지 반복. `--no-verify` 로 검증 끄기.
- **예산 상한**: `--max-tokens N` · `--max-seconds N` 로 토큰·시간 제한. 매 라운드 진행률(경과·토큰) 표시.
- **정체 감지**: 같은 검증 실패가 반복되면 서브에이전트로 원인 분석을 위임하고, 그래도 진전이 없으면 조기 종료.
- **치명적 명령은 자율 모드에서도 차단**(`rm -rf /`·`~`, `mkfs`, `dd of=/dev/*`, fork bomb, `format C:`).
- 매 편집 전 git-shadow 체크포인트로 복구 가능. **신뢰할 수 없는 작업은 컨테이너/VM에서 실행하세요.**

## 내장 툴 (설계도 §8)

`read_file` · `list_dir` · `glob` · `grep` · `edit_file`(search_replace) · `write_file` · `bash` · `todo_write` · `web_fetch`

## v1 기능 (0.2)

- **OS 샌드박스 + 비밀 스크러빙** (§12.3): `bash`는 Linux/WSL2=bubblewrap, macOS=Seatbelt로 격리.
  자식 프로세스에서 `*TOKEN*/*KEY*/*SECRET*` 등 비밀 env 제거. `sandbox.require: true`면 백엔드
  부재 시 fail-closed. (Windows 네이티브는 미지원 → WSL2/devcontainer 권장.)
- **git-shadow 체크포인트** (§12.5): 편집 전 워크스페이스를 별도 shadow repo에 스냅샷.
  프로젝트 실제 `.git`은 절대 건드리지 않음. REPL: `/snapshot` `/checkpoints` `/restore <ref>`.
- **git 자동 소스관리(0.19)**: 워크스페이스에 `.git`이 없고 git이 설치돼 있으면 세션 시작 시 로컬 git을
  초기화하고 베이스라인을 커밋(`cjagent baseline`) → 에이전트 실수 시 `git checkout -- .`로 통째 복구.
  이미 git이 있으면 절대 건드리지 않음. `auto_git: false` 또는 `--no-git`으로 비활성.
- **repo map** (§11.4): `ast`(파이썬)+정규식으로 심볼을 추출하고 PageRank로 랭킹해 코드 구조
  요약을 시스템 프롬프트에 주입(토큰 예산 `map_tokens`). REPL: `/map`.
- **MCP 클라이언트** (§8.3): stdio JSON-RPC로 외부 MCP 서버 툴을 편입. 내장 툴과 **동일한 권한
  게이트**를 태움. `config`의 `mcp_servers`에 등록.
- **문법 제약 툴콜(strict)** (§10): `strict_tools: true`면 지원 백엔드(vLLM 등)에서 스키마 강제
  디코딩. 미지원 서버는 무시(무해).
- **평가/회귀 하네스** (§15): `cjagent --eval` 로 골든 태스크(파일 생성/버그 수정/함수 추가)를
  격리 워크스페이스에서 실행하고 편집 적용 성공률·턴수·툴콜수·지연을 측정.
- **web_fetch + taint tracking** (§12.6): 외부 URL 조회(network 티어). 신뢰불가 콘텐츠를 읽으면
  세션을 오염 표시하고 이후 네트워크 송신을 확인으로 격상(lethal trifecta 방어).
- **서브에이전트 `task` 툴** (§7.5): 격리 컨텍스트에서 조사/작업을 위임하고 요약만 회수
  (`explore`=읽기 전용 기본 / `general`=편집 포함). 재위임 불가·taint 공유.
- **편집 후 구문 진단** (§15): 파이썬(구문)·JSON·순수 JS(node 있으면) 편집 직후 검사 → 오류를 되먹여 자가수정 유도.
- **다중 모델 라우팅** (§14.3): `sub_model` 설정 시 서브에이전트를 더 싸고 빠른 보조 모델로 라우팅. REPL `/model`.
- **세션 저장/재개** (§7.2): `--session <이름>` 으로 대화를 저장하고 재시작 후 이어감(자동 저장 + `/save`).
- **클라이언트/서버 데몬** (§13.3): `cjagent --serve` 로 세션을 메모리에 보관하는 HTTP 서버 실행,
  `cjagent --connect URL "작업"` 으로 접속. 세션은 클라이언트 접속과 무관하게 유지(IDE 확장의 토대).
  **인증**: Bearer 토큰 필수(무작위 생성 또는 `CJAGENT_DAEMON_TOKEN`), `--token`으로 전달. 클라이언트는
  `model`/`mode`만 변경 가능(base_url·workspace 고정 — SSRF·경로 탈출 방지).

## 점검 & 평가

```bash
cjagent --selfcheck    # 서버 없이 65개 항목 점검(오프라인)
cjagent --eval         # 골든 태스크 회귀 평가(모델 서버 필요)
```

## 안전 주의 (MVP 한계)

- `bash` 툴은 명령을 **워크스페이스에서 직접 실행**합니다. 진짜 OS 샌드박스(Seatbelt/bubblewrap/WSL2,
  설계도 §12.3)는 아직 미구현이며 **v1 항목**입니다.
- 현재 보호막은 (1) 권한 확인 (2) 파괴적 명령 가드 (3) 워크스페이스 경로 경계뿐입니다.
- **신뢰할 수 없는 저장소/입력에서는 컨테이너·VM·devcontainer 안에서 실행하세요.**

## 아키텍처 (파일 → 설계도 절)

```
cjagent/
  config.py        설정 로더            §14
  profiles.py      모델 프로파일 레지스트리 §6
  model_client.py  OpenAI 호환 클라이언트  §5
  toolcall.py      정규화·JSON 수리·검증   §10
  tokenizer.py     토큰 카운트           §11.2
  loop.py          에이전트 루프          §7
  permissions.py   권한 엔진             §12
  tools/           내장 툴               §8, §9, §11.3
  ui/repl.py       스트리밍 REPL          §13.2
  cli.py           `cjagent` 엔트리포인트 §13,14
```

## 로드맵 (설계도 §17)

- **MVP**: REPL · 내장 툴 · 툴콜 수리 · 권한 · 프로파일. ✅
- **v1(0.2)**: OS 샌드박스 ✅, git-shadow 체크포인트 ✅, repo map ✅, 문법 제약 디코딩 플러밍 ✅,
  MCP 클라이언트 ✅, eval 하네스 ✅, web_fetch+taint ✅.
- **v2(0.4)**: 서브에이전트 `task` ✅, 편집 후 진단(py/json/js) ✅, 다중 모델 라우팅 ✅,
  세션 저장/재개 ✅, 클라이언트/서버 데몬 ✅.
- **터미널 UX 고도화(현재, 0.5)**: rich 렌더링(diff/미리보기/미터) ✅, Ctrl+C 취소 ✅,
  토큰 미터 ✅, /diff·/undo·/context 등 명령 ✅, 에러 메시지·툴 제안·few-shot·온보딩 ✅.

MIT License.
