s01_agent_loop(137줄, 도구 하나 + 루프 하나)에서 시작해 s20_comprehensive(2,123줄, 모든 메커니즘 통합)까지 한 단계에 메커니즘 하나씩 쌓아 올립니다. 의존성은 단 3개(anthropic·python-dotenv·pyyaml). (shareAI-lab/learn-claude-code · Python · 교육 코드 ~1.2만 줄 + Next.js 강의 사이트)"Claude Code 같은 코딩 에이전트가 내부에서 어떻게 동작하는지를, 파이썬 코드 20단계로 한 메커니즘씩 직접 만들어보며 배우는 교과서"입니다. 완성된 도구를 쓰는 법이 아니라 그 도구를 어떻게 짜는가를 가르칩니다. 각 단계는 독립 실행되는 code.py 하나 + 3개 언어(영/중/일) README + 다이어그램으로 이뤄져 있습니다.
이 레포의 정체성은 코드보다 관점에 있습니다. "에이전트를 만든다"는 말은 사실 둘 중 하나라는 것 — ①모델을 학습시키거나(앤트로픽·딥마인드가 하는 일), ②하니스를 짠다(우리 대부분이 하는 일). 이 레포는 ②, 즉 "모델에게 손·눈·작업공간을 쥐여주는 골격 코드"를 만드는 법을 가르칩니다.
아무리 좋은 차를 만들어도 운전 실력 자체가 생기진 않습니다. 반대로 뛰어난 운전자도 차가 없으면 도로를 못 달립니다. 지능은 모델이 학습으로 갖춘 것이고, 하니스는 그 지능이 특정 환경(코딩·터미널)에서 실제로 일하게 해주는 탈것입니다.
그래서 이 코스의 모든 단계에서 중심의 '루프'는 절대 바뀌지 않습니다. 루프는 운전자(모델)의 몫이기 때문입니다. 우리가 매 단계 덧붙이는 건 도구·권한·기억·협업 같은 차의 부품(하니스)뿐입니다. "루프는 상수, 메커니즘은 변수"가 이 레포를 관통하는 한 문장입니다.
tool_use로 도구 호출을 요청 → 코드가 실제로 실행해 결과를 되돌려줌 → 모델이 '그만'(stop_reason ≠ tool_use)이라 할 때까지 반복"하는 while 루프. 코딩 에이전트의 전부가 이 한 패턴에 들어 있습니다.요즘 "AI 에이전트"라는 말은 노코드 워크플로우 빌더·프롬프트 체인 같은 것에 남발됩니다. 이 레포는 그걸 정면으로 "if-else와 노드 그래프로 LLM 호출을 엮은 건 에이전트가 아니라 루브 골드버그 장치"라고 비판하며, "지능은 학습되는 것이지 코딩되는 게 아니다"라는 선명한 테제를 세웁니다. 이 관점 정리만으로도 많은 개발자가 "아하"를 얻습니다.
137줄짜리 s01에서 시작해 단계마다 정확히 하나의 메커니즘(권한→훅→할일목록→서브에이전트→압축→기억→…)을 더합니다. 매 단계 표어(motto)가 붙어 있어 "이번 장에서 뭘 배우는지"가 한 줄로 잡힙니다. 난이도가 계단처럼 완만하게 올라가 중도 포기가 적습니다.
상용 에이전트 소스는 너무 커서 입문자가 길을 잃습니다. 이 레포는 의존성 3개, 단계당 수백 줄로 실제로 실행되는 가장 작은 버전을 보여줍니다. "프로덕션 디테일(완전한 훅 버스·OAuth·MCP 트랜스포트)은 일부러 단순화했다"고 범위를 명시해, 핵심에만 집중하게 합니다.
Anthropic뿐 아니라 MiniMax·GLM·Kimi·DeepSeek 등 Anthropic 호환 API를 ANTHROPIC_BASE_URL 한 줄로 갈아끼울 수 있습니다. README는 영·중·일 3개 언어, 별도 Next.js 강의 사이트까지 갖춰 접근성이 높습니다.
| learn-claude-code | 공식 SDK 튜토리얼 | 상용 에이전트 소스 | 블로그 글 | |
|---|---|---|---|---|
| 학습 방식 | 직접 빌드(0→1) | API 사용법 | 리버스 엔지니어링 | 읽기 |
| 범위 | 하니스 전체 20개 | 기본 호출 | 전부(과함) | 단편적 |
| 실행 가능성 | 단계마다 실행 | 가능 | 무겁다 | 대개 불가 |
| 난이도 곡선 | 계단식 완만 | 평탄 | 절벽 | 들쭉날쭉 |
| 관점/철학 | 강함(테제 있음) | 없음 | 없음 | 다양 |
이 레포는 교육용 재현(teaching implementation)입니다. 예컨대 JSONL 메일박스 팀 협업 프로토콜은 "특정 상용 내부 구현을 주장하는 게 아니라 가르치기 위한 버전"이라고 레포가 못박습니다. 권한 거버넌스·세션 resume/fork·MCP 트랜스포트/OAuth 등은 의도적으로 단순화돼 있습니다. "원리를 배우는 지도"이지 "그대로 베껴 쓰는 프로덕션 코드"가 아닙니다.
이 레포는 두 부분으로 나뉩니다. ① 핵심 교육 코드는 의존성 단 3개의 순수 파이썬이고, ② 웹 강의 사이트는 별도의 Next.js 앱입니다. 학습의 본체는 ①이고, ②는 그걸 브라우저로 보기 좋게 만든 포장입니다.
| 구성요소 | 역할 |
|---|---|
| Python 3 | 전체 교육 코드. 표준 라이브러리(subprocess·threading·pathlib·ast·json) 위주 |
| anthropic (≥0.25) | LLM 호출 SDK. client.messages.create(model, system, messages, tools) 하나가 루프의 심장 |
| python-dotenv | .env에서 ANTHROPIC_API_KEY·MODEL_ID·ANTHROPIC_BASE_URL 로드 |
| pyyaml | 스킬·태스크 메타데이터(YAML 프론트매터) 파싱 — 후반 단계에서 사용 |
| readline (표준, 선택) | REPL 입력 편의. 중국어 입력 백스페이스 문제까지 패치 |
| 프로바이더 | MODEL_ID 예시 | 전환 방법 |
|---|---|---|
| Anthropic | claude-sonnet-4-6 | 기본값 |
| MiniMax | MiniMax-M2.5 | ANTHROPIC_BASE_URL만 교체 |
| GLM (Zhipu) | glm-5 | BASE_URL 교체 |
| Kimi (Moonshot) | kimi-k2.5 | BASE_URL 교체 |
| DeepSeek | deepseek-chat | BASE_URL 교체 |
| 구성요소 | 역할 |
|---|---|
| Next.js + React 19 + TypeScript | 강의 사이트 프레임워크. Vercel 배포(vercel.json) |
| Tailwind CSS (v4 postcss) | 유틸리티 기반 스타일 |
| framer-motion / lucide-react | 애니메이션 / 아이콘 |
| unified · remark · rehype | 마크다운 → HTML 렌더 파이프라인(remark-gfm·rehype-highlight·rehype-raw) |
| diff | 단계 간 코드 변화를 diff로 시각화 |
요리 교실의 '레시피 카드'(파이썬 코드)와 '온라인 강의 영상'(Next.js 사이트)의 관계. 레시피 카드만 있어도 요리는 다 배울 수 있습니다. 웹사이트는 그 카드를 보기 좋게 넘겨주고 단계별 차이를 하이라이트해주는 편의일 뿐, 본질은 카드(code.py 20장)에 있습니다.
20단계 내내 절대 바뀌지 않는 단 하나의 코드입니다. 이걸 손에 익히면 나머지는 전부 이 루프 바깥에 붙는 장식입니다.
# s01 — 코딩 에이전트의 전부
def agent_loop(messages):
while True:
response = client.messages.create(
model=MODEL, system=SYSTEM,
messages=messages, tools=TOOLS)
messages.append({"role":"assistant","content":response.content})
# 모델이 도구를 안 부르면 끝
if response.stop_reason != "tool_use":
return
# 도구 호출을 실제로 실행해 결과를 모음
results = []
for block in response.content:
if block.type == "tool_use":
output = TOOL_HANDLERS[block.name](**block.input)
results.append({"type":"tool_result",
"tool_use_id":block.id, "content":output})
# 결과를 되돌려주고 루프 계속
messages.append({"role":"user","content":results})
s02의 표어가 "도구를 추가한다 = 핸들러 하나를 추가한다"입니다. 도구가 1개에서 여러 개로 늘어도 루프 코드는 그대로고, TOOL_HANDLERS라는 이름→함수 딕셔너리(디스패치 맵)에 항목만 등록합니다. read·write·edit·bash·glob·grep이 전부 이렇게 붙습니다. "개방-폐쇄 원칙"의 교과서적 사례입니다.
s04의 표어 "Hook around the loop, never rewrite the loop". 도구 실행 전/후에 끼어드는 확장점(훅)을 두어, 권한 검사·로깅·정책 적용 같은 걸 핵심 루프를 수정하지 않고 덧붙입니다. 권한(s03)·훅(s04)이 바로 이 "둘레에 거는" 계층입니다.
s03 권한의 표어 "Set boundaries first, then grant freedom". 도구를 실행하기 전에 "이건 그냥 실행 / 이건 차단 / 이건 사용자 승인 필요"를 분류합니다. s01의 가장 단순한 버전조차 rm -rf /·sudo·shutdown 같은 위험 명령을 블랙리스트로 막는 것에서 출발합니다.
대화가 길어지면 토큰 한도에 부딪힙니다. s08(컨텍스트 압축)·s09(기억)은 오래된 히스토리를 요약·선별·통합해 자리를 비웁니다. 이 덕분에 "사실상 무한 세션"이 가능해집니다. 서브에이전트(s06)도 곁가지 작업을 격리된 컨텍스트에서 돌려 결과만 가져오므로, 메인 대화가 잡음으로 오염되지 않습니다.
| 그룹 | 단계 | 한 줄 표어 |
|---|---|---|
| 행동하게 | s01 루프 | 루프 하나 + bash 하나 = 에이전트 하나 |
| s02 도구 사용 | 도구 추가 = 핸들러 추가 | |
| s03 권한 | 경계 먼저, 자유는 그다음 | |
| s04 훅 | 루프를 다시 쓰지 말고 둘레에 걸어라 | |
| 복잡한 일 | s05 TodoWrite | 계획 없는 에이전트는 표류한다 |
| s06 서브에이전트 | 큰 일은 쪼개고, 결과만 가져온다 | |
| s08 컨텍스트 압축 | 가득 차기 전에 비울 방법을 둬라 | |
| 기억·복구 | s09 메모리 | 중요한 건 기억, 나머지는 망각 |
| s10 시스템 프롬프트 | 하드코딩 말고 런타임에 조립 | |
| s11 에러 복구 | 에러는 끝이 아니라 재시도의 시작 | |
| 긴 작업 | s12 태스크 시스템 | 목표를 쪼개 디스크에 영속 |
| s13 백그라운드 | 느린 일은 뒤로, 에이전트는 계속 생각 | |
| s14 크론 스케줄러 | 사람 없이 시간 맞춰 발화 | |
| 협업 | s15 에이전트 팀 | 혼자 벅차면 동료에게 위임 |
| s16 팀 프로토콜 | 고정된 요청-응답 형식으로 소통 | |
| s17 자율 에이전트 | 리더 없이 게시판에서 일을 직접 집는다 | |
| s18 워크트리 격리 | 각자 자기 디렉터리에서, 간섭 없이 | |
| 확장·통합 | s07 스킬 로딩 | 지식은 미리 말고 필요할 때 펼친다 |
| s19 MCP 플러그인 | 능력이 부족하면 외부 도구를 꽂는다 | |
| s20 종합 | 많은 메커니즘, 하나의 루프 |
1) README.md — "에이전트=모델+하니스" 테제와 전체 커리큘럼이 다 있어 최고의 입문서. 2) s01_agent_loop/code.py — 137줄, 모든 것의 씨앗인 루프. 3) s02~s04 — 도구·권한·훅으로 "루프 둘레에 붙이기"를 체득. 4) 관심 메커니즘(예: 컨텍스트 압축 s08, 서브에이전트 s06)으로 점프. 5) s20_comprehensive — 전부가 한 루프로 합쳐진 모습.
s01~s20이 새 정본(20강)이고, docs/·agents/·web/는 옛 12강 트랙입니다. 둘은 장 번호가 다르므로 섞어 읽으면 안 됩니다. 지금 시작한다면 루트 s01~s20을 따르세요. (README에 12강→20강 매핑 표가 있습니다.)배울 것: 코딩 에이전트의 본질이 tool_use 루프 하나라는 깨달음. 그리고 그 위에 권한·훅·기억·협업을 루프를 수정하지 않고 얹는 법. 이 분리 감각은 어떤 도메인의 에이전트를 짜든 그대로 적용됩니다.
배울 것: 도구는 작고(atomic), 조합 가능하고(composable), 설명(description)이 명확해야 모델이 잘 씁니다. input_schema를 어떻게 쓰느냐가 모델의 도구 사용 정확도를 좌우한다는 감각을 s02에서 얻습니다.
배울 것: LLM의 진짜 병목은 컨텍스트 윈도우입니다. s08(압축)·s09(선별/추출/통합 3단 기억)·s06(서브에이전트 격리)은 "긴 작업에서 어떻게 깨끗한 기억을 유지하는가"라는, 실무에서 가장 중요한 기술을 다룹니다.
배울 것: 위험 명령 차단(블랙리스트)에서 시작해, "허용/차단/승인필요" 3분류, 도구 실행 전 검사(훅)까지. 자율 에이전트에게 손을 쥐여줄 때 어디까지 자유를 주고 어디서 멈출지를 코드로 표현하는 법을 배웁니다.
배울 것: s15~s18의 비동기 메일박스(JSONL), 고정 요청-응답 프로토콜, "게시판에서 일을 직접 집는" 자율 분업, 워크트리로 디렉터리를 격리한 병렬 실행. 여러 에이전트를 충돌 없이 굴리는 패턴의 최소 구현입니다.
배울 것: s07(스킬을 미리 다 싣지 않고 필요할 때 펼치기)과 s19(MCP로 외부 도구를 같은 도구 풀에 꽂기)는 "에이전트의 능력을 어떻게 무한 확장하는가"를 보여줍니다. 토큰을 아끼는 on-demand 로딩이 핵심.
| 항목 | 요구사항 |
|---|---|
| 런타임 | Python 3 + pip install anthropic python-dotenv pyyaml |
| API 키 | .env에 ANTHROPIC_API_KEY와 MODEL_ID(필수) |
| 대체 프로바이더 | ANTHROPIC_BASE_URL로 MiniMax·GLM·Kimi·DeepSeek 등 호환 API 사용 가능 |
| 실행 방법 | 단계별 독립 실행: python s01_agent_loop/code.py |
| 웹 사이트(선택) | web/에서 Node.js + npm install 후 Next.js dev 서버 |
| 주의 | 에이전트가 bash로 실제 명령을 실행하므로, 격리된 디렉터리/VM에서 테스트 권장 |
s01의 차단 목록은 rm -rf /·sudo·shutdown 정도의 문자열 블랙리스트에 불과합니다. 우회가 얼마든지 가능하므로, 실제로 모델이 bash를 돌리는 단계는 중요 파일이 없는 임시 폴더나 컨테이너에서 실행하세요. 후반 단계(s03 권한, s18 워크트리)에서 격리가 점차 강화되지만 여전히 교육용 수준입니다.
.env를 채우고 python s01_agent_loop/code.py를 실행해, "이 폴더의 .py 파일 개수를 세줘" 같은 요청을 줘보세요. 모델이 bash 하나로 어떻게 문제를 푸는지, 루프가 몇 번 도는지 출력으로 관찰합니다.
s01 코드에 read_file 도구를 추가해보세요. TOOLS 리스트에 정의를 더하고 TOOL_HANDLERS에 핸들러만 등록하면 됩니다. 루프 코드는 한 줄도 안 바뀐다는 걸 직접 확인하는 게 핵심입니다.
s03/s04를 참고해, 특정 명령(git push·파일 삭제 등)에는 실행 전 input("승인? [y/N]")으로 사람 확인을 받게 하세요. "경계를 먼저, 자유는 그다음"을 코드로 구현하는 연습입니다.
.env의 ANTHROPIC_BASE_URL·MODEL_ID만 바꿔 DeepSeek이나 GLM 등 호환 API로 같은 s01을 돌려보세요. "하니스는 그대로, 운전자만 교체"가 실제로 되는지 확인합니다.
s08의 압축 전략을 읽고, 내가 만든 미니 에이전트(과제 1·2)에 "메시지가 N개를 넘으면 오래된 것을 요약으로 대체"하는 로직을 붙이세요. 토큰 사용량이 어떻게 달라지는지 측정해보면 컨텍스트 엔지니어링의 효과를 체감합니다.
s15/s16을 참고해, "기획자 에이전트"가 작업을 쪼개 JSONL 메일박스에 넣고 "실행자 에이전트"가 집어 처리하는 최소 2-에이전트 시스템을 만들어보세요. 고정 요청-응답 형식이 왜 필요한지 직접 부딪혀 깨닫게 됩니다.
s01~s04를 정독·실행합니다. 목표: 루프를 손으로 다시 쓸 수 있을 만큼 외우고, 도구를 디스패치 맵에 등록하는 패턴과 권한/훅을 "루프 둘레에 거는" 감각을 체득. Anthropic Messages API의 tool_use/tool_result 구조도 함께 익히세요.
s05(계획)·s06(서브에이전트)·s08(압축)·s09(기억)을 봅니다. 목표: 컨텍스트 엔지니어링의 핵심 — 언제 무엇을 기억하고, 무엇을 격리하고, 무엇을 압축하는가 — 을 이해하고 내 에이전트에 하나라도 이식하기.
s11(에러 복구)·s12(태스크 그래프)·s13(백그라운드)·s14(크론)과 s15~s18(팀·프로토콜·자율·워크트리)을 봅니다. 목표: 파일 기반 태스크 영속과 비동기 협업의 최소 구조를 파악. 동시성(threading)·격리(worktree) 개념도 함께.
s07(스킬 로딩)·s19(MCP)·s20(종합)을 봅니다. 목표: on-demand 능력 확장과 MCP 연결을 이해하고, s20에서 "모든 메커니즘이 하나의 루프로 어떻게 다시 합쳐지는지" 전체 그림을 완성. 여기까지 오면 자기만의 도메인 하니스를 설계할 수 있습니다.
{"bash": run_bash, "read": run_read, …}처럼 도구 이름 → 실행 함수를 잇는 딕셔너리. 도구를 늘릴 때 루프 대신 이 맵에만 항목을 추가합니다. 확장의 단일 지점.SKILL.md). 전부 미리 싣지 않고 먼저 목록만 보여주고 필요할 때 펼치는 방식으로 토큰을 아낍니다(s07). 레포의 skills/에 agent-builder·code-review·mcp-builder·pdf 예시가 있습니다.| 링크 | 설명 |
|---|---|
| GitHub 저장소 | 소스 전체. README.md와 s01~s20이 본체 |
| TrendShift 페이지 | 트렌딩 추이(연간 23위, 2026-06-09) |
| Anthropic Messages API | tool_use/tool_result 구조의 공식 문서 |
| Tool use 개요 | 도구 정의·스키마·실행 루프 공식 가이드 |
| Model Context Protocol | MCP 공식 사이트(s19의 배경) |
| Claude Code 스킬 문서 | SKILL.md 동작 원리(s07의 배경) |
| DQN (Nature, 2015) | "agency는 학습된다"의 역사적 근거로 README가 인용 |
| git worktree 문서 | s18 워크트리 격리의 기반 기능 |