코딩 에이전트를 로컬 서버로 다시 짓다: anomalyco/opencode v2.0.32의 백그라운드 서비스·권한 규칙·1.x→2.x 전환 심층 해부
“오픈소스 코딩 에이전트”라는 한 줄 설명으로 21만 스타를 모은 anomalyco/opencode가 오늘(2026-10-19) GitHub Trending 전체 일간 3위(오늘 +1,414 stars), TypeScript 일간 1위에 올랐다. 겉보기엔 익숙한 터미널 에이전트지만, 지금 저장소 안에서는 꽤 큰 공사가 진행 중이다. 기본 브랜치 dev의 루트 package.json은 이미 2.0.32이고, 배포 채널도 1.x(opencode-ai)와 2.x(@opencode/cli)로 갈라졌다. 2.x의 핵심은 “에이전트를 TUI 프로그램이 아니라 로컬 서버로 다시 짓는 것”이다. TUI·데스크톱·웹·에디터(ACP)는 모두 같은 HTTP API를 쓰는 손님이 되고, 세션·권한·도구 실행·터미널은 백그라운드 서비스가 소유한다.
이 글은 기능 소개를 넘어 실무자가 도입 전에 알아야 할 세 가지를 따진다. ① 2.x 모노레포가 어떤 층으로 나뉘고 서버·서비스 모델이 실제로 어떻게 뜨는지, ② 권한(permission) 규칙이 어떻게 평가되고 plan 에이전트의 “읽기 전용”이 어디까지인지, ③ 1.x→2.x 전환에서 무엇이 바뀌고 무엇을 조심해야 하는지. 그리고 박스(리눅스 VM)에서 npm 공식 바이너리 v2.0.32를 격리된 HOME으로 띄우고, 로그인·API 키 없이 로컬 모의(mock) LLM 서버를 붙여 서버 기동, 인증, 도구 호출, 권한 거절까지 직접 재 봤다. 모든 수치는 2026-10-19 16:55~17:06 KST 기준 실측이거나 저장소·레지스트리에서 확인한 값이다.
한눈에 보기: 오늘 기준 스냅숏
항목
값
저장소
github.com/anomalyco/opencode (생성 2025-05-01 05:08 KST) · 홈페이지 opencode.ai · 기본 브랜치 dev
라이선스
MIT (루트 LICENSE, GitHub API, npm 메타데이터 모두 MIT)
2.x 최신
v2.0.32 (CHANGELOG 2026-10-16, npm @opencode/cli 게시 10-17 07:14 KST). 2.0.0은 npm 기준 2026-09-12 08:44 KST, 이후 33개 2.x 버전
216,974 stars · 29,028 forks · 열린 이슈+PR 4,682건 · 기여자 약 1,056명(익명 포함) — API 16:57 KST
Trending
전체 일간 #3(+1,414), TypeScript 일간 #1
스택
TypeScript + Bun 1.4.2(단일 실행 파일로 컴파일), Effect 라이브러리 전면 사용, TUI는 OpenTUI + Solid, 데스크톱은 Electron 44.4.5
배포물
npm(@opencode/cli, 플랫폼별 optionalDependencies 12종), curl 설치 스크립트(/v2/install), Homebrew tap, WinGet, AUR, mise, Nix, 데스크톱 dmg/exe/deb/rpm/AppImage
왜 지금 트렌딩인가: 메이저 전환 한가운데
OpenCode는 오래전부터 상위권 저장소였지만, 최근 2주 릴리스 노트를 보면 “2.x를 기본값으로 밀어 올리는” 작업이 몰려 있다. 같은 날 Trending에는 cursor/plugins(#4), ruflo(#5), ai-memory(#6), stablyai/orca(#8)처럼 에이전트 하네스·플러그인·메모리 저장소가 몰려 있어, 그 중심에 있는 “에이전트 본체”에 관심이 다시 쏠린 측면도 있다.
시점
버전
변화
10-11 KST
v1.19.0
opencode upgrade --major로 2.x 업그레이드 경로 공개, 1.x TUI는 자동 업데이트 중단(/update로 명시 설치)
10-16 KST
v1.19.1
세션 공유(share) 기능 종료 — 기존 공유 링크와 공유 URL 가져오기 모두 불가
10-16 KST
v1.19.2
1.x는 1.x 라인에만 머물도록 업데이트 체크 고정, Homebrew Core는 2.x를 추적, 설치 스크립트는 2.x 설치 거부
10-15 (CHANGELOG)
v2.0.30
턴별 변경 파일·도킹 diff(/diff), V1·V2 설정을 모두 받는 설정 스키마, 공유 백엔드 제거
10-16 (CHANGELOG)
v2.0.32
/copy, 헤드리스 환경 auth login 크래시 수정, 실험적 음성 세션 SDK
최근 2.x 하이라이트
2.0.26~2.0.29
원격 기기 페어링(OpenTunnel), Code Mode 안의 워크트리 도구, 프로젝트별 자동 승인, WinGet 패키지, 응답 자동 이어쓰기
1.x와 2.x: 무엇이 달라졌나
항목
1.x
2.x
npm 패키지
opencode-ai (latest 1.19.3)
@opencode/cli (latest 2.0.32), bin은 opencode·opencode2 둘 다
실행 모델
TUI가 서버를 품은 단일 프로세스 중심, serve는 옵트인
기본은 백그라운드 서비스에 붙는 클라이언트. --standalone이면 전용 서버, --server URL이면 원격
서버 인증
SECURITY.md: OPENCODE_SERVER_PASSWORD를 설정하지 않으면 경고와 함께 무인증
항상 비밀번호. 지정하지 않으면 32바이트 난수 생성, 서비스 모드는 service.json(0600)에 저장
HTTP API
1.x 서버 API
/api/* V2 API, OpenAPI 문서 기준 엔드포인트 정리 감사(V2_HTTP_API_AUDIT.md) 완료
설정
opencode.json(c)
V1·V2 형태를 모두 받는 스키마(마이그레이션 기간), TUI 키바인딩 등 자동 변환
세션 공유
있었음(1.19.1에서 종료)
제거됨
업데이트
1.x 라인 고정, 2.x는 명시적 선택
opencode upgrade, 설치 방식별(npm·brew·WinGet 등) 업데이터
업그레이드 전 확인. 1.x에서 2.x로 가는 길은 opencode upgrade --major 또는 TUI /update의 2.0 제안뿐이고, 1.x 설치 스크립트는 2.x를 깔지 않는다. 반대로 Homebrew Core의 opencode 포뮬러는 이미 2.x를 따라가므로, 팀마다 설치 경로가 다르면 같은 이름의 명령이 서로 다른 메이저를 가리킬 수 있다. CI 이미지에서는 패키지 이름(opencode-ai vs @opencode/cli)과 버전을 함께 고정하자.
저장소 구조: 계층이 엄격한 모노레포
루트 packages/ 아래 패키지가 40개가 넘고, TS/TSX 파일만 약 5천 개다. 큰 덩어리는 아래와 같다(파일 수는 *.ts/*.tsx 기준, 얕은 클론에서 직접 셈).
HttpApi 라우트, 인증 미들웨어, CORS, 페어링, OpenAPI(protocol/openapi.json)
packages/cli
194
opencode 명령(Effect CLI), 서비스 관리, ACP 서버, 업데이터, 설정 마이그레이션
packages/tui
471
OpenTUI + Solid 기반 터미널 UI
packages/app · desktop
761 · 172
웹 앱, Electron 데스크톱
packages/ai
408
모델 제공자 계층
packages/codemode
85
도구 호출 전용 JS 유사 언어 인터프리터(네트워크·파일·프로세스 직접 접근 불가)
packages/schema · client · sdk · plugin
120 · 61 · – · 66
공용 스키마, 생성 클라이언트, SDK, 플러그인 API
V2 모노레포의 의존 방향: Schema → Core·Protocol → Server → Client·SDK, 화면들은 같은 API를 쓰는 클라이언트
AGENTS.md가 못 박은 규칙이 구조를 잘 설명한다. 런타임 의존은 Schema → Core·Protocol → Server 방향으로만 흐르고, Client 런타임 코드는 Schema·Protocol에만 기대며 Core·Server를 절대 가져오지 않는다. SDK가 Client·Core·Server를 조합한다. 공개 Protocol이나 Server의 HttpApi를 바꾸면 packages/client에서 bun run generate로 클라이언트를 재생성해야 하고 생성 파일은 직접 고치지 않는다. 즉 API 계약이 먼저, 화면은 나중인 구조이고, TUI도 이 계약을 쓰는 하나의 클라이언트일 뿐이다.
서버·서비스 모델은 어떻게 뜨나
packages/cli/src/server-process.ts를 보면 서버는 세 가지 모드(default·service·stdio)로 뜬다. 공통으로 호스트 기본값은 127.0.0.1이고, 비밀번호는 서비스 모드면 저장된 값 또는 새 난수, 나머지는 OPENCODE_PASSWORD/OPENCODE_SERVER_PASSWORD 환경변수나 새 난수다. stdio 모드에서는 이 비밀번호 환경변수를 지워 도구가 상속하지 못하게 한다. 인증은 사용자명 opencode 고정의 HTTP Basic이다.
진입점
모드
동작
opencode serve
default
전경(foreground) 서버. 포트 미지정 시 임의, 비밀번호를 표준출력에 한 번 출력
opencode serve --service
service
백그라운드 서비스. 홈 디렉터리로 chdir, 기본 포트 0xC0DE(=49374, Windows는 45278), 이미 떠 있는 인스턴스가 있으면 재사용
opencode run --standalone
stdio
CLI가 serve --stdio --port 0 자식 프로세스를 띄워 전용으로 사용, 끝나면 정리
플래그 없는 일반 명령
service에 접속
서비스가 없으면 자동으로 띄운다(아래 스모크에서 확인)
--server URL
원격
다른 머신·컨테이너의 서버에 붙음, 비밀번호는 OPENCODE_PASSWORD
# 서비스 상태·중지 (서비스는 사용자 단위로 하나)
opencode service status # → http://127.0.0.1:49374
opencode service stop
# 전용 서버를 명시 비밀번호로 띄우고 API 직접 호출
OPENCODE_SERVER_PASSWORD='<긴 난수>' opencode serve --port 4096
curl -u opencode:'<긴 난수>' http://127.0.0.1:4096/api/info
OPENCODE_PASSWORD='<긴 난수>' opencode api --server http://127.0.0.1:4096 server.info
이 구조 덕분에 TUI를 닫아도 세션과 PTY가 서비스에 남고, 데스크톱·웹·휴대폰(페어링)이 같은 세션을 이어 볼 수 있다. 서버를 재시작할 때 PTY를 넘기는 OPENCODE_PTY_HANDOFF 경로도 코드에 있다. 반대로 말하면 “에이전트를 끈다”의 의미가 TUI 종료가 아니라 서비스 중지로 바뀐 것이다.
에이전트와 도구: 루프 안에 무엇이 들어가나
기본 에이전트는 build(전체 권한, 기본값)와 plan(읽기 전용 지향) 두 개이고, 서브에이전트로 general과 explore가 있다. 숨은 에이전트 title·summary·compaction은 제목 생성·요약·컨텍스트 압축 전용이다. 모의 LLM으로 받아 본 실제 요청을 보면 build 에이전트는 매 턴 도구 12개를 스키마로 싣는다.
에이전트
모드
기본 권한·역할(packages/core/src/plugin/agent.ts, plan.ts)
build
primary
기본 에이전트. 설정된 권한대로 도구 실행, question 허용
plan
primary
edit 전체 deny, 단 ~/.opencode/plan/*만 allow. 진입·이탈 시 시스템 리마인더 삽입
general
subagent
복잡한 검색·다단계 작업 병렬 실행용. question·subagent deny(재귀 방지)
explore
subagent
전부 deny 후 shell·grep·glob·read·webfetch·websearch만 allow, *.env 읽기는 ask, external_directory allow
title · summary · compaction
hidden
제목·PR 설명식 요약·압축. title·summary는 모든 도구 deny
분류
실측 요청에 실린 도구 12종
비고
파일
read, write, edit (+ patch, file-diff 플러그인 존재)
v2의 write 인자는 path(1.x 스타일 filePath는 검증 실패)
탐색
glob, grep
ripgrep 내장
실행
shell, execute
shell은 백그라운드 실행·완료 알림 지원, execute는 Code Mode
웹
webfetch, websearch
검색 제공자는 플러그인
상호작용
question, skill, subagent
스킬(SKILL.md)·서브에이전트 위임
권한 규칙: ‘마지막 일치’와 ask의 의미
packages/core/src/permission.ts의 evaluate()는 규칙 배열을 합친 뒤 action·resource 와일드카드가 맞는 마지막 규칙을 고른다(findLast). 아무 규칙도 맞지 않으면 기본값은 ask다. 그래서 에이전트 정의가 앞에 깔고, 사용자 설정·프로젝트별 저장 승인(saved, effect allow)이 뒤에서 덮어쓰는 구조가 된다. plan 에이전트가 “edit 전부 deny → plan 디렉터리만 allow” 순서로 규칙을 넣는 이유도 이것이다.
권한 평가는 마지막으로 일치한 규칙이 이기고, 일치가 없으면 ask. 비대화형 run에서 ask는 자동 거절, –auto는 승인
규칙 효과
대화형 TUI
opencode run (플래그 없음)
opencode run --auto
allow
즉시 실행
즉시 실행
즉시 실행
ask
사용자에게 확인 프롬프트
자동 거절 — “This non-interactive run cannot ask the user for permission” (실측)
승인(실측)
deny
차단
차단
차단(--auto는 “명시적으로 deny되지 않은” 것만 승인)
공식 위협 모델이 먼저다. SECURITY.md는 “OpenCode는 에이전트를 샌드박스하지 않는다. 권한 시스템은 사용자가 에이전트 행동을 인지하도록 돕는 UX 기능이지 보안 격리가 아니다. 진짜 격리가 필요하면 Docker 컨테이너나 VM에서 돌려라”라고 명시한다. 서버 모드를 켰을 때의 API 접근, 샌드박스 탈출, LLM 제공자의 데이터 처리, 외부 MCP 서버 동작, 악성 설정 파일은 모두 보안 범위 밖(Out of Scope)이다. AI가 생성한 보안 리포트는 받지 않으며 제출 시 차단한다는 문구도 있다.
박스 스모크 테스트: 로그인 없이 모의 LLM으로
실제 모델을 쓰지 않고도 서버·에이전트 루프·권한 경계를 확인하려고, OpenAI 호환 /v1/chat/completions SSE를 흉내 내는 70줄짜리 파이썬 서버를 127.0.0.1:18080에 띄웠다. 이 서버는 요청을 JSONL로 기록하고, 환경변수로 지정한 도구 호출 하나를 돌려준 뒤 도구 결과가 오면 “MOCK_OK”로 끝낸다. OpenCode에는 문서의 커스텀 제공자 형식(@ai-sdk/openai-compatible + baseURL)으로 연결했다.
# 격리 환경 (실제 실행한 값)
export HOME=$PWD/smoke/home XDG_CONFIG_HOME=$HOME/.config XDG_DATA_HOME=$HOME/.local/share
export OPENCODE_DISABLE_AUTOUPDATE=1 OPENCODE_DISABLE_MODELS_FETCH=1 DO_NOT_TRACK=1
unset OPENAI_API_KEY ANTHROPIC_API_KEY OTEL_EXPORTER_OTLP_ENDPOINT
# 공식 npm 플랫폼 패키지에서 바이너리만 추출 (integrity sha512 일치 확인)
curl -sLO https://registry.npmjs.org/@opencode/cli-linux-x64/-/cli-linux-x64-2.0.32.tgz
tar xzf cli-linux-x64-2.0.32.tgz && ./package/bin/opencode --version # opencode v2.0.32
# ~/.config/opencode/opencode.json
{
"model": "mock/mock-coder",
"provider": {
"mock": {
"npm": "@ai-sdk/openai-compatible",
"options": { "baseURL": "http://127.0.0.1:18080/v1", "apiKey": "dummy" },
"models": { "mock-coder": { "name": "Mock Coder", "tool_call": true } }
}
}
}
# 비대화형 한 턴 (stdin을 반드시 닫을 것)
opencode run --standalone "do the task" < /dev/null
opencode run --standalone --agent plan "do the task" < /dev/null
항목
실측 결과
배포물
@opencode/cli-linux-x64 2.0.32 tarball 98,152,331 B, 압축 해제 바이너리 211,842,528 B(Bun 단일 실행 파일). npm integrity(sha512) 일치
opencode serve 기동
포트 응답까지 228 ms. 127.0.0.1에만 LISTEN, 비밀번호를 표준출력에 출력
인증
비밀번호 없이 /api/info → 401UnauthorizedError, 틀린 비밀번호 401, 올바른 Basic → 200(2.7 ms). 웹 UI 루트 /는 인증 없이 200(정적 셸)
OpenAPI
서버가 내주는 /openapi.json 280,291 B: 경로 119개·작업 143개, /api 하위 그룹 28개(session, permission, pty, worktree, mcp, vcs …)
메모리
유휴 serve 약 154 MB RSS, 여러 번 사용한 백그라운드 서비스 약 222 MB RSS
run 한 턴
rc 0, 1,022 ms. 모델 요청 2건: 제목 생성(도구 0, 시스템 2,119자) + build 본 요청(도구 12, 시스템 8,304자, 요청 본문 22,253 B)
도구 포함 10회 반복
923~1,095 ms (모의 LLM이라 모델 지연 0에 가까움 → 순수 오케스트레이션 오버헤드)
세션 저장
10개 세션이 ~/.local/share/opencode/opencode.db(0600, SQLite+WAL)에 남고 opencode session list로 조회
시나리오
결과
해석
build + write hello.txt
프롬프트 없이 생성
기본 build는 프로젝트 내 쓰기 허용
build + write (1.x식 filePath 인자)
“path: Missing key … call the tool again” 오류를 모델에 되돌림
스키마 검증 실패를 재시도 유도 메시지로 반환
build + shell echo > file
프롬프트 없이 실행
비대화형 run에서도 기본은 실행
build + write 프로젝트 밖 절대경로
프롬프트 없이 생성됨
외부 디렉터리 쓰기를 막고 싶다면 규칙을 직접 넣어야 함
plan + write
차단: “Cannot use write to modify files outside the Plan directory”
edit deny 규칙이 작동
plan + shell echo > plan-shell.txt
실행됨, 파일 생성
plan의 읽기 전용은 edit 계열 도구에만 적용 — shell 리다이렉션은 별개
설정 {"permission":{"bash":"ask"}} + shell
자동 거절(permission.rejected)
1.x 키 bash가 2.x shell에 매핑돼 적용됨
같은 설정 + --auto
실행됨
ask를 승인으로 바꿈
박스 스모크(v2.0.32, 격리 HOME, 로컬 모의 LLM, 로그인·키 없음): serve 228ms, run 한 턴 약 1초, 도구 12개, 비밀번호 없는 API 401
스모크에서 걸린 함정 두 가지. ① 파이프·스크립트에서 stdin을 열어 둔 채 opencode run을 호출하면 입력을 기다리며 멈춘다(첫 시도는 90초 타임아웃). CI에서는 < /dev/null을 붙이자. ② --standalone 없이 opencode debug agents 같은 일반 명령을 한 번 실행했더니 opencode serve --service가 127.0.0.1:49374에 자동으로 떠서 opencode service stop 전까지 계속 남아 있었다. 공용 머신·CI 러너에서는 --standalone을 기본으로 쓰거나 작업 끝에 서비스를 내리자.
이번에 돌리지 않은 것: 대화형 TUI·데스크톱 앱, 실제 LLM 제공자와 OpenCode Zen, MCP·LSP·ACP, 원격 페어링(OpenTunnel), Windows, 소스 빌드·테스트. 모델 목록(opencode models)에는 모델 카탈로그 원격 갱신을 끈 상태에서도 opencode/*-free 계열 Zen 모델 12개가 함께 표시됐다.
신뢰 경계 정리
경계
OpenCode가 하는 일
실무 주의
로컬 서버
127.0.0.1 바인드 + 항상 Basic 인증(사용자명 opencode)
비밀번호가 serve 표준출력과 service.json에 남음 → 로그 수집기·공유 터미널 주의
원격 접근
opencode pair --remote는 첫 실행 시 노출 경고·확인, --yes로 생략 가능
자동화 스크립트에 --yes를 넣으면 경고가 사라짐
에이전트 실행
권한 규칙(UX), plan의 edit deny
샌드박스 아님. shell·외부 경로 쓰기는 기본 허용 → 컨테이너·VM
설정·지시문
프로젝트 설정, AGENTS.md, .claude 스킬까지 탐색
OPENCODE_DISABLE_PROJECT_CONFIG, OPENCODE_DISABLE_CLAUDE_CODE로 끌 수 있음 — 남의 저장소를 열 때 고려
모델·데이터
제공자에 전송되는 내용은 제공자 정책 소관(공식 Out of Scope)
사내 코드면 사내 게이트웨이·로컬 모델을 커스텀 제공자로
관측
OTLP 내보내기는 OTEL_EXPORTER_OTLP_ENDPOINT를 설정할 때만
자동 업데이트는 OPENCODE_DISABLE_AUTOUPDATE=1, 카탈로그 갱신은 OPENCODE_DISABLE_MODELS_FETCH=1
MCP
외부 MCP 서버 동작은 신뢰 경계 밖(공식 명시)
MCP 서버별로 권한 규칙과 네트워크 정책을 따로
CI·헤드리스 운영 레시피
# 1) 버전 고정 설치
npm i -g @opencode/cli@2.0.32
# 2) 보수적 권한: shell·edit는 ask → 비대화형에서는 자동 거절
cat > opencode.json <<'EOF'
{ "permission": { "bash": "ask", "edit": "ask" } }
EOF
# 3) 전용 서버로 한 턴, JSON 이벤트 출력, stdin 닫기
opencode run --standalone --format json --agent plan \
"이 저장소의 테스트 구조를 요약해 줘" < /dev/null > result.jsonl
# 4) 정말 수정이 필요한 잡만 명시적으로 --auto (컨테이너 안에서)
opencode run --standalone --auto "lint 오류를 고쳐 줘" < /dev/null
# 5) 공용 러너 정리
opencode service stop || true
여기서 bash: ask는 이번 스모크에서 shell 거절로 직접 확인한 설정이고, edit: ask는 같은 규칙 체계를 따르지만 이번에는 따로 재지 않았다. 핵심은 “비대화형에서 ask = 거절”이라는 성질을 이용해 기본은 읽기만 하는 잡, 쓰기가 필요한 잡만 컨테이너 안에서 –auto로 나누는 것이다.
비슷한 도구와 비교
도구
라이선스
모델
형태
격리 방식
OpenCode (이 글)
MIT
제공자 무관(AI SDK·models.dev, 커스텀 OpenAI 호환), 무료 Zen 모델
로컬 서버 + TUI·데스크톱·웹·ACP 클라이언트, OpenAPI
권한 규칙(UX), 샌드박스 없음
Claude Code
독점(Anthropic)
Claude 중심
CLI·IDE 확장·SDK
권한 모드, 일부 OS 샌드박스 옵션
Codex CLI
Apache-2.0
OpenAI 중심
CLI·IDE·클라우드
OS 수준 샌드박스 + 승인 정책
Gemini CLI
Apache-2.0
Gemini 중심
CLI
승인 정책, 컨테이너 샌드박스 옵션
Aider
Apache-2.0
제공자 무관
CLI, git 커밋 중심
변경을 git 커밋으로 남겨 되돌림
stablyai/orca
MIT
에이전트 자체는 아님
여러 에이전트(OpenCode 포함)를 워크트리별로 담는 그릇
워크트리 격리, 런타임 분리
OpenCode의 차별점은 모델 중립성과 “에이전트 = 문서화된 API를 가진 로컬 서버”라는 구조다. 143개 작업의 OpenAPI가 있다는 건 사내 대시보드·봇·에디터 플러그인이 TUI를 흉내 내지 않고 같은 세션·권한·PTY를 직접 다룰 수 있다는 뜻이다. 대신 OS 수준 샌드박스를 기본 제공하는 도구들과 달리 격리는 사용자의 몫이다.
도입 평가 체크리스트
지표
측정 방법
판단 기준
오케스트레이션 오버헤드
모의 LLM으로 run 시간 측정(이번 실측 약 0.9~1.1초)
모델 지연 대비 무시 가능한 수준인지
프롬프트 비용
모의 LLM 로그로 시스템 프롬프트·도구 스키마 크기 확인(이번 8,304자 + 도구 12개)
AGENTS.md·스킬·MCP 추가 후 얼마나 커지는지
권한 정책
ask/deny 규칙 + 비대화형 run으로 거절되는지 시나리오 테스트
shell·외부 경로·.env 읽기
서비스 수명
service status로 잔존 프로세스 확인, 재부팅·로그아웃 후 동작
공용 머신에서 남는 서비스가 없는지
업그레이드 경로
1.x/2.x 패키지명·Homebrew 포뮬러 차이, 설정 마이그레이션
팀 전원이 같은 메이저인지
원격·페어링
pair --remote 노출 범위, 터널 사용 정책
보안팀 승인 전에는 끔
트레이드오프와 주의점
이슈
내용
대응
메이저 전환기
1.x와 2.x가 패키지·업데이트 경로·설정이 다르고, 세션 공유는 사라졌다
새로 도입한다면 2.x로 시작, 기존 사용자는 설정 백업 후 upgrade --major
변화 속도
2.x만 한 달여 만에 33개 버전, 열린 이슈+PR 4,600건 이상
버전 고정 + 릴리스 노트 확인 후 주기적 업그레이드
상주 프로세스
백그라운드 서비스가 자동 기동, 150~220 MB대 RSS
CI는 --standalone, 작업 후 service stop
plan의 의미
edit 계열만 막고 shell은 통과
진짜 읽기 전용이 필요하면 shell도 ask/deny로
무게
바이너리 약 212 MB, 데스크톱은 Electron
컨테이너 이미지 크기·콜드 스타트 예산에 반영
생태계 이름 혼동
README가 “opencode-*” 이름의 서드파티 프로젝트는 비공식임을 밝히라고 요구
플러그인·래퍼 도입 시 출처 확인
누가 쓰면 좋은가
대상
얻을 것
우선순위
모델을 자주 바꾸거나 여러 제공자를 섞는 개발자
제공자 중립, 커스텀 OpenAI 호환 엔드포인트, 무료 Zen 모델
높음
에이전트를 사내 도구·봇에 붙이려는 플랫폼 팀
OpenAPI 143개 작업, 생성 클라이언트·SDK, ACP
높음
CI에서 코드 리뷰·요약 잡을 돌리려는 팀
비대화형 ask=거절 성질로 안전한 읽기 전용 잡 구성
중간(정책 설계 필요)
강한 기본 격리가 필요한 조직
샌드박스 없음 — 컨테이너·VM 설계가 선행돼야 함
신중
정리
OpenCode 2.x는 “터미널에서 도는 에이전트”를 인증된 로컬 API 서버 + 여러 클라이언트로 재구성한 버전이다. 계층을 강제하는 모노레포, 143개 작업의 OpenAPI, 사용자 단위 백그라운드 서비스, 마지막 일치 방식의 권한 규칙이 그 뼈대다. 박스에서 돌려 보니 서버는 228 ms 만에 127.0.0.1에만 떠서 비밀번호 없는 요청을 401로 막았고, 모의 LLM 한 턴은 약 1초, 비대화형 run은 ask 규칙을 자동 거절했다. 반면 plan 에이전트가 shell 리다이렉션으로 파일을 쓰고, build가 프로젝트 밖에도 묻지 않고 쓰며, 일반 명령 한 번에 서비스가 상주하는 것도 확인했다. 공식 문서 말대로 권한은 안내판이지 울타리가 아니다. 구조의 이점은 적극적으로 쓰되, 격리는 컨테이너로, 정책은 ask/deny 규칙으로, 버전은 고정해서 도입하는 것이 지금 시점의 현실적인 사용법이다.