Skip to content

Latest commit

 

History

History
318 lines (233 loc) · 21.4 KB

File metadata and controls

318 lines (233 loc) · 21.4 KB

deepx-code

DeepSeek 네이티브, OpenAI 호환 터미널 코딩 에이전트(Xiaomi MiMo 지원) —— 단일 바이너리, 캐시 친화적, 코드 그래프와 로컬 OCR 내장

Go License: MIT Release Stars Platform

简体中文 · English · 日本語 · 한국어

deepx-code demo

Tip

⚡ 긴 세션에서 prompt-cache 적중률 ~99% 실측(실제 세션: 41,591 토큰 중 41,472 적중). DeepSeek은 캐시 적중 입력을 캐시 미스의 수십분의 1로 과금하므로(공식 가격), 긴 실행에서도 반복되는 컨텍스트에 거의 과금되지 않습니다.


✨ 핵심 기능

  • 🦫 단일 Go 바이너리 —— Node / Python 런타임 불필요, curl 한 줄 설치, macOS / Linux / Windows 지원.
  • 💰 캐시 친화적, 긴 세션도 저렴 —— DeepSeek 프리픽스 캐시를 중심으로 설계(실측 ~99% 적중). 로컬 키워드 라우팅은 매 턴 지연 0·토큰 0으로 시작.
  • 🧭 코드 그래프 내장(codegraph) —— 심볼 단위 정의 이동 / 호출자 / 인터페이스 구현 / 영향 범위. Go는 go/types로 정확히 해석하여 저장소 전체 grep을 대체.
  • 👀 로컬 이미지 OCR(PaddleOCR) —— 스크린샷의 텍스트를 오프라인으로 읽고, 멀티모달 API 불필요.
  • 📎 @ 파일/디렉터리 참조 —— 입력창에 @ 입력 시 로컬 퍼지 경로 선택기가 열림. 선택하면 @경로가 메시지에 삽입되고 모델이 필요에 따라 Read(파일)/ List(디렉터리)를 호출. 정확한 컨텍스트 제공, 전부 욱여넣을 필요 없음.
  • 🧠 듀얼 모델 자동 라우팅 —— 가벼운 작업은 flash, 복잡한 작업은 자동으로 pro 승격. /model flash|pro로 모델 고정, /auto /plan /review로 모드 전환도 가능.
  • 🗂️ 순차 Todo + 병렬 Plan DAG —— 다단계 작업은 보이는 체크리스트로 한 단계씩. 독립적인 병렬 작업은 DAG로 분해해 서브 에이전트를 병렬 실행.
  • 💾 무손실 세션 영속화 —— gob가 tool_calls / 도구 결과 / reasoning_content를 완전 보존해 재시작 후에도 매끄럽게 이어감. 윈도가 차면 자동 계층 압축.
  • 🔌 MCP + Skill 생태계 —— MCP 네이티브 지원. Claude의 skill 디렉터리와 호환되어 기존 skill을 그대로 재사용.
  • 🛡️ 검토 모드 —— 파일 쓰기 / Shell 실행은 기본적으로 사람의 확인을 요구.
  • 🧱 네이티브 OS 수준 샌드박스 —— 기본 native는 OS 격리: macOS Seatbelt, Linux bubblewrap — 쓰기를 workspace로 제한 + 프로세스 격리; OS 메커니즘이 없는 플랫폼은 소프트 정책 블랙리스트로 폴백. docker 컨테이너 격리나 off도 지원. 컨테이너 없이도 agent에 안전 경계를 그어준다.
  • 🎛️ 작업 모드(working mode) —— 명령 하나로 방법론을 고정: karpathy(실용주의) / openspec(스펙 주도) / superpowers(전체 워크플로 엄격). 세 모드는 상호 배타적 — 하나를 선택하면 나머지 두 개의 skill을 비활성화해 방법론 혼용을 방지. 세션에 저장되며 매 턴 히스토리를 오염시키지 않고 프롬프트 주입.
  • ⚡ 비대화형 exec 모드 —— deepx exec "작업" 은 한 번 실행하고 결과를 바로 stdout으로 출력. 파이프로 입력하고, 출력을 리다이렉트하고, 스크립트 / CI / cron에 넣을 수 있어 TUI에 들어갈 필요 없음(아래 참조).

📊 Claude Code 비교

deepx-code Claude Code
배포 단일 Go 바이너리, curl 한 줄 Node(npm)
오픈소스 ✅ MIT ❌ 비공개
모델 DeepSeek / Xiaomi MiMo(OpenAI 호환, 설정 시 공급자 선택, flash/pro 자동 라우팅) Anthropic Claude
비용 긴 세션 ~99% 캐시 적중 구독 / Claude API 사용량
코드 그래프 내장 ✅ codegraph(Go는 go/types로 정확) ❌(grep / 검색)
로컬·오프라인 OCR ✅ PaddleOCR ❌(이미지는 클라우드 멀티모달)
MCP
Skill 생태계 ✅(Claude skill 디렉터리 재사용)

Note

이 표는 모델 품질 자체를 비교하지 않습니다. deepx-code의 선택은 비용·오픈소스·단일 바이너리·내장 코드 그래프·오프라인 OCR 입니다.

🚀 빠른 시작

1. 설치

macOS / Linux(끝의 && exec $SHELL이 현재 셸을 새로 시작해 PATH에 deepx를 즉시 반영합니다. rc 소스나 새 터미널을 열 필요가 없습니다):

curl -fsSL https://raw.githubusercontent.com/itmisx/deepx-code/main/scripts/install.sh | bash && exec $SHELL

Windows(PowerShell):

irm https://raw.githubusercontent.com/itmisx/deepx-code/main/scripts/install.ps1 | iex

~/.local/bin/deepx에 설치됩니다. deepx upgrade로 언제든 업데이트.

2. 터미널에서 프로젝트로 이동해 실행

deepx는 터미널 프로그램입니다. 터미널을 열고 프로젝트로 cd 한 뒤 deepx 를 실행하면 대화형 UI로 들어갑니다.

  • 어떤 터미널이든 OK: macOS Terminal / iTerm2, Linux 터미널, Windows Terminal / PowerShell.
  • VS Code 내장 터미널도 추천(Terminal → New Terminal, 또는 Ctrl+`): 열려 있는 프로젝트 디렉터리에 이미 있어서 deepx 가 그 프로젝트를 대상으로 동작하고, 수정 사항이 에디터에 즉시 반영됩니다.
cd <당신의 프로젝트>   # VS Code 내장 터미널이면 보통 이미 프로젝트 루트에 있음
deepx                   # 대화형 TUI 진입

3. 설정

항목 방법
공급자 & Key 첫 실행 마법사에서 ←/→로 공급자(DeepSeek / Xiaomi MiMo)를 선택하고 해당 API Key를 입력~/.deepx/model.yaml에 저장. 각 공급자에 flash/pro 기본 모델과 1M 컨텍스트 제공(DeepSeek deepseek-v4-flash / -pro, MiMo mimo-v2.5 / -pro). /config로 재설정.
수동 재정의 ~/.deepx/model.yaml을 직접 편집해 role(flash/pro)별로 base_url / model / api_key / max_tokens / context_window를 재정의 가능. flash와 pro가 서로 다른 공급자를 가리킬 수도 있음.
Skill <워크스페이스>/.deepx/skills/에 두거나 ~/.claude/skills/ 등 재사용.
MCP TUI에서 /mcp-add로 추가, /mcp-list로 목록 확인.

⚡ 비대화형 실행(deepx exec

전체 TUI에 들어가지 않고 deepx를 스크립트에 넣고 싶을 때는 deepx exec "<작업>" 을 사용하세요. 작업을 실행하고 결과를 그대로 터미널(stdout)에 출력한 뒤 종료합니다. 결과만 나오고 중간 과정은 표시되지 않습니다.

deepx exec "README의 기능 목록을 영어로 번역해 README.en.md에 작성"

파이프 입력도 지원합니다(cat error.log | deepx exec "이 에러를 분석해줘"). 먼저 대화형 deepx로 API 키를 설정해 두세요.

🧠 동작 원리

모델 라우팅(로컬, 지연 0, 토큰 0)

메시지가 도착하면 deepx는 로컬에서 키워드 매칭 + 길이 판정을 수행하여, 추가 LLM 토큰 없이 시작 모델을 즉시 결정합니다:

"리팩터링 / refactor / architecture / 디버깅 …" 포함 → 바로 pro
길이 < 100자                                         → flash
길이 > 500자                                         → pro

중국어(간체 / 번체) / 영어 / 일본어 / 한국어를 지원. 턴 도중에도 모델은 어려운 추론을 위해 SwitchModel로 pro 승격이 가능합니다.

세션 영속화(gob 바이너리, 무손실 복원)
~/.deepx/sessions/<sha1(workspace)[:16]>/
├── meta.json          # 워크스페이스 메타 정보
├── state.json         # 압축 상태 + 사용량 스냅샷
├── YYYY-MM-DD.jsonl   # 텍스트 로그(Memory 검색용)
└── history.gob        # 완전한 바이너리 히스토리
형식 저장 내용 용도
history.gob system + user + assistant(tool_calls·도구 결과·reasoning_content 포함) 재시작 복원, 매끄러운 이어가기
YYYY-MM-DD.jsonl user / assistant 일반 텍스트 Memory 도구 검색

재시작 시 gob를 우선 로드하고 실패하면 JSONL로 폴백. 업그레이드나 skill 변경으로 system prompt가 바뀌면 gob 복원 시 현재 버전으로 투명하게 교체하여 캐시 프리픽스를 안정적으로 유지합니다.

세션 압축(계층 + 요약 병합)

컨텍스트 윈도의 70%를 넘으면 자동 발동: 꼬리 부분에 약 20K 토큰을 계층적으로 남기고, 오래된 내용은 LLM이 일관된 요약으로 압축해 기존 요약과 병합합니다. gob도 갱신되어 재시작 후에도 일관됩니다.

작업 계획: Todo(순차) vs Plan DAG(병렬)
  • Todo —— 다단계·순차·컨텍스트 의존 작업(예: 앱을 처음부터 구축): 모델이 보이는 체크리스트에 단계를 나열하고 하나씩 체크하며 스스로 실행해, 실시간 진행 상황을 보여줍니다.
  • CreatePlan(Plan DAG) —— 진짜로 병렬·독립적인 팬아웃: DAG로 분해해 의존 순서대로 병렬 서브 에이전트를 실행하고, 각 노드가 flash / pro를 선택한 뒤 집계합니다.
CreatePlan
  ├─ plan-1: Read  (flash) ─────┐
  ├─ plan-2: Read  (flash) ─────┤
  ├─ plan-3: Grep  (flash) ─────┤
  └─ plan-4: Write (pro)   ─────┘ depends_on: [1,2,3]
로컬 OCR(이미지 읽기 보완)

이미지를 붙여넣거나 경로를 주면 LLM이 OCR 도구(PaddleOCR PP-OCRv5)로 텍스트를 읽습니다. 첫 호출 시 OCR 모델(~37MB)과 ONNX runtime을 내려받고, 이후에는 오프라인으로 수 초 내 응답. 멀티모달 API 없이도 에러 스크린샷이나 UI 목업을 에이전트가 "읽을" 수 있습니다.

🧭 코드 그래프(codegraph)

심볼 그래프 엔진을 내장하여, 저장소 전체 grep과 파일을 하나씩 여는 대신 모델이 심볼 단위 내비게이션 + 호출 관계 쿼리를 직접 수행합니다.

op 치트시트(12개)
op 용도 필수 설명
def 심볼 정의 위치 name 함수 / 타입 / 메서드 / 변수의 정의 위치
refs 심볼 사용처 name 모든 참조(정의 + 호출 + 읽기)
symbols 이름으로 퍼지 검색 name(선택), kind(선택) kind: func/method/type/var/const/field
outline 파일 내 심볼 목록 path 파일 아웃라인
imports 파일의 import 목록 path 의존성 개요
callers 함수의 호출자 name 변경 시 영향 범위, Go 암시적 인터페이스도 포함
callees 함수가 호출하는 것 name 내부 흐름 이해
implementers 인터페이스 구현자 name Go 암시적 인터페이스를 심볼 정밀도로. grep 불가
subtypes 타입을 상속 / 임베드하는 것 name 서브타입 추적
supertypes 타입의 파생 원본 name 슈퍼타입 / 임베드 인터페이스
impact 변경의 하위 영향 name, depth(기본 3) 전이 폐포, 영향 범위 분석
reindex 인덱스 강제 재구축 캐시 이상 시 수동 트리거

지원 언어: Go(stdlib 정밀 파싱) + TypeScript / JavaScript / Python / Java / Rust / C / C++ / C# / Ruby / PHP / Kotlin / Swift / Scala / Dart / Vue / Svelte.

동작: 시작 시 백그라운드 Prewarm이 인덱스를 구축(loading → ready). Write/Update로 변경된 파일은 stale로 표시되어 다음 쿼리에서 증분 재구축. 결과는 파일:행(시그니처 / 호출자 포함)으로 표시되고 페이지네이션됩니다.

🧰 도구

종류 도구 plan auto review
읽기 전용 Read List Tree Glob Grep
코드 그래프 CodeGraph
파일 쓰기 Write Update
Shell Bash
Search Fetch
메모리 Memory
Skill LoadSkill
이미지 OCR
계획 Todo CreatePlan LLM이 호출
승격 SwitchModel LLM이 호출

⏳ = 자동 실행되지만 사람의 확인이 필요.

⌨️ 슬래시 명령

명령 동작
/plan /auto /review 모드 전환(읽기 전용 / 자동 / 검토)
/model 모델 선택 팝업(auto=작업별 라우팅 / flash / pro 고정); /model flash 직접 지정도 가능
/reasoning role(flash/pro)별로 thinking / reasoning_effort 설정 팝업; 빈 값 = 해당 필드 미전송(MiMo 등 미지원 모델에 영향 없음)
/compact 세션 수동 압축
/new /sessions 새 대화 시작 / 기록 목록(↑↓ 선택, Enter 전환)
/status 오른쪽 상태 패널 표시/숨김(Ctrl+B 도 가능)
/web-config 웹 대시보드 바인드 IP·포트를 팝업으로 설정("IP [포트]"를 공백으로 구분 입력; IP 비움/127.0.0.1=로컬 전용, 0.0.0.0=LAN에서 휴대폰/태블릿 접속 가능, 포트 생략=랜덤). 저장 즉시 재시작 없이 적용되고 새 주소를 표시; 설정은 세션의 meta.json에 저장되며 접근 토큰은 세션별로 고정되어 재시작 후에도 동일. ⚠️ 이 패널은 세션을 제어하고 명령을 실행할 수 있으며 평문 HTTP이므로 신뢰할 수 있는 LAN에서만 노출하세요
/sandbox 샌드박스: off(끄기) / native(기본, OS 격리: macOS Seatbelt, Linux bubblewrap — 쓰기를 workspace로 제한 + 프로세스 격리; OS 메커니즘이 없는 플랫폼은 소프트 정책 블랙리스트로 폴백) / docker(컨테이너 격리, /sandbox docker <image>)
/working-mode 작업 모드(방법론): karpathy(기본, 실용주의) / openspec(스펙 주도) / superpowers(전체 워크플로 엄격); 팝업으로 선택하거나 /working-mode kp|spec|sp로 직접 전환. 세 모드는 상호 배타적 — 하나를 선택하면 나머지 두 개의 skill을 비활성화해 방법론 혼용을 방지. 세션에 저장되며 매 턴 히스토리를 오염시키지 않고 프롬프트 주입
/lang UI 언어 전환(중 / 영)
/mcp-list /mcp-add /mcp-delete MCP 서버 관리
/skills /config /mode skill 목록 / key 재설정 / 모드 표시
/help 도움말

🛡️ 검토 모드

모드 Write / Update / Bash 기타 도구 명령
review(기본) 사람이 YES/NO 확인 자동 실행 /review
auto 자동 실행 자동 실행 /auto
plan 비활성 자동 실행 /plan

📦 Skill

워크스페이스  <wd>/.deepx/skills/
글로벌        ~/.agents/skills/ → ~/.claude/skills/ → ~/.deepx/skills/
  • 워크스페이스 단위는 git add로 팀과 공유 가능
  • 글로벌은 Claude Code 호환 —— 기존 skill을 그대로 재사용

🏗️ 아키텍처

데이터 흐름 펼치기
1 턴:
  사용자 입력
    ↓
  RouteByKeyword (로컬) ─► flash 또는 pro
    ↓
  StartStream (메인 루프)
    ├─ 직접 답변
    ├─ 도구 호출 → review가 쓰기/Shell 게이트 → 실행 → 결과 회신 → 계속
    ├─ Todo → 보이는 체크리스트(메인 에이전트가 단계별 실행)
    ├─ SwitchModel → pro 승격
    └─ CreatePlan → DAG scheduler → 병렬 서브 에이전트 → 집계

영속화:
  HistoryUpdateMsg → SaveGob (history.gob, 완전 충실)
  StreamDoneMsg    → Append JSONL (일반 텍스트, Memory 검색)
  재시작           → LoadGob (우선) / JSONL (폴백)

압축:
  tokens ≥ ctxWindow × 70% → runCompression (비동기)
    → 꼬리에 ~20K 토큰 유지 → LLM이 신·구 요약 병합 → gob + state.json 갱신

디렉터리 구조

deepx/
├── main.go
├── agent/      StartStream 도구 루프 + 라우팅 + DAG 스케줄러 + 서브 에이전트
├── config/     ~/.deepx/model.yaml 읽기/쓰기
├── session/    gob 영속화 + JSONL 로그 + 압축 상태
├── tools/      모든 도구 구현(읽기/쓰기 / 검색 / OCR / Memory / Skill / Plan / CodeGraph)
├── codegraph/  코드 그래프: 정의 / 호출 / 상속 구현 / 영향 범위
├── skill/      다중 경로 skill 탐색 및 로드
├── ocr/        PaddleOCR 래퍼(ONNX Runtime)
├── tui/        bubbletea TUI(입력 / 렌더 / 클립보드 / 선택 / 대시보드)
└── scripts/    설치 스크립트

💰 토큰 경제

  • 라우팅 토큰 0: 순수 로컬 키워드, LLM 호출 없음
  • 도구 사전 주입 없음: Memory / LoadSkill은 호출 시에만 context에 진입
  • system prompt 최소화: 도구 공통 규약 + workspace만, 트리거 조건은 각 도구 description에
  • DeepSeek KV 캐시 친화: tools 배열은 모드 / 역할로 바뀌지 않고, system prompt는 gob 복원 시 버전 인식
  • 맹목적 검색보다 코드 그래프: read / glob / grep 토큰 낭비를 근본부터 절감

🩹 제거

# macOS / Linux
rm -f ~/.local/bin/deepx && rm -rf ~/.deepx

# Windows: %LOCALAPPDATA%\Programs\deepx 와 %USERPROFILE%\.deepx 삭제

⭐ Star 추이

Star History Chart

📄 License

MIT © 2026 itmisx