코딩 에이전트라고 하면 복잡한 시스템을 떠올리기 쉽습니다. uncut(★566, 11월 1일 공개, MIT)은 그 뼈대를 Go 837줄로 보여 줍니다. 저장소의 Go 코드를 내려받아 직접 줄을 세고 읽어 봤습니다(실행은 하지 않았습니다).
파일 8개, 837줄
| 파일 | 줄 수 | 하는 일 |
|---|---|---|
cmd/uncut/main.go | 193 | 명령줄 옵션, 실행 시작 |
internal/harness/tools.go | 208 | 도구 4개 정의와 실행 |
internal/harness/run.go | 140 | 에이전트 반복문 |
session.go 외 4개 | 296 | 세션 저장, 모델 호출, 셸 |
wc -l로 센 값이고 테스트 파일은 뺐습니다. README에 적힌 “837 lines”와 같습니다.
도구는 네 개
tools.go에 정의된 도구는 이것뿐입니다.
read_file: 파일 읽기write_file: 파일 쓰기replace: 파일 안의 글자 바꾸기run_command: 셸 명령 실행
중심은 반복문 하나
run.go를 줄여 옮기면 이렇습니다.
for step := 1; step <= maxSteps; step++ {
msg := ask(model, history) // 모델에게 지금까지의 대화를 보낸다
if len(msg.ToolCalls) == 0 {
return msg // 도구를 안 부르면 그게 최종 답
}
for _, call := range msg.ToolCalls {
history += run(call) // 도구를 실행하고 결과를 대화에 붙인다
}
}
모델에게 묻고, 모델이 도구를 쓰라고 하면 실행해서 결과를 돌려주고, 더 부를 도구가 없으면 끝납니다. 최대 단계 수를 넘기면 오류로 멈춥니다.
큰 에이전트와 무엇이 다른가
uncut은 일부러 기능을 뺐습니다. README 기준으로 화면(TUI), 원격 기록, 플러그인, 백그라운드 에이전트, 자동 재시도, 대화 요약이 없습니다. 대화 전체를 매번 그대로 보내고, 파일 내용이나 명령 출력을 잘라 내지 않습니다. 모델 응답이 출력 한도에서 잘리면 일부만 받아들이지 않고 오류로 끝냅니다.
Claude Code 같은 도구는 이 고리 위에 권한 확인, 맥락 요약, 서브에이전트, 훅 같은 기능을 얹은 구조입니다. 에이전트가 왜 “읽고, 고치고, 실행하고, 다시 읽는” 순서로 움직이는지 이 반복문을 보면 이해가 쉽습니다.
오늘 할 일
internal/harness/run.go 한 파일만 열어 보세요. 140줄이라 10분이면 다 읽습니다. 직접 돌려 보려면 OpenAI 호환 API 주소와 키가 필요합니다.