🔗 직접 눌러 보기 — 이 글에 나오는 화면은 모두 EP4 데모 사이트에서 실제로 눌러 볼 수 있습니다. 데모의 프로젝트·태스크·로그는 전부 Mock 데이터입니다.
소스 코드: github.com/jbpark/EasyProject4 (MIT)

드디어 마지막 편입니다. 1편에서 설치했고, 2편에서 AI에게 작업방을 줬고, 3편에서 터미널 자동 기록까지 걸었습니다. 이제 EP4를 내 것답게 만드는 시간입니다.

오늘의 메뉴: 플러그인 시스템, 화면을 떠도는 마스코트, 그리고 침대에서 모바일로 접속하기.


🧩 플러그인: EP4는 레고입니다

EP4의 화면과 기능은 사실 전부 플러그인 조각입니다. 대시보드도, 프로젝트 화면도, 태스크 화면도 다 플러그인이에요. 폴더 구조를 보면 감이 옵니다.

plugins/
├── View/      ← UI 화면 조각 (dashboard, projects, tasks, runlog, sessions)
├── MCP/       ← MCP 커넥터 자리
├── Data/      ← 데이터 관리 조각
└── Helper/    ← 도우미(마스코트) — 문어🐙 펭귄🐧 고양이🐱 강아지🐶

새 화면이 갖고 싶으면 폴더 하나 만들고 plugin.json + view.js를 넣으면 끝입니다. 백엔드 로직이 필요하면 backend.py를 추가하면 되는데, 내부적으로 pytest로 유명한 그 pluggy 훅 시스템을 씁니다. 검증된 레고 블록 규격이라는 뜻이죠.

언제 불리나
ep4_register_routes 플러그인이 자기 HTTP API를 등록할 때
ep4_on_task_done 태스크가 끝났을 때 (알림, 후처리 등)
ep4_on_plugin_toggle 플러그인을 켜고 끌 때

"태스크 끝나면 나한테 알림 보내줘" 같은 기능도 ep4_on_task_done 훅에 몇 줄 얹으면 됩니다.

플러그인 관리

확장 화면 — 설치된 플러그인을 유형별로 보고 스위치로 켜고 끕니다. 언인스톨해도 플러그인이 남긴 데이터는 보존됩니다. (데모에서 직접 보기)


🐙 마스코트: 진지한 기능입니다 (진짜로)

Helper 플러그인을 켜면 화면 구석에 문어가 삽니다. 펭귄, 고양이, 강아지 중에서 고를 수도 있습니다.

이 친구가 하는 일:

  • 화면을 랜덤하게 어슬렁거리며 가끔 말풍선으로 말을 겁니다
  • CLI 작업이 완료되면 말풍선으로 알려줍니다 — 다른 창 보다가도 "아, 끝났구나" 하고 알 수 있어요
  • 클릭하면 채팅창이 열립니다 — 시스템 사용법을 물어보면 대답해주는 도우미입니다
  • 드래그로 옮길 수 있고, 시끄러우면 끌 수도 있습니다 (끄면 🐾 발자국 버튼만 남습니다)

"이게 왜 필요하냐"고 물으신다면... 태스크 돌려놓고 유튜브 보다가 문어가 "작업 끝났어요!" 하고 알려줄 때의 그 기분, 써보시면 압니다. 알림 기능에 애교를 한 스푼 얹은 겁니다.

도우미 마스코트

왼쪽 아래 마스코트를 누르면 도우미 패널이 열립니다. 데모에서는 정해진 답만 하지만, 실제 EP4에서는 도우미 플러그인이 Claude로 답합니다. (데모에서 직접 보기)


📱 침대에서 접속하기

밤에 태스크를 잔뜩 걸어놓고 침대에 누웠습니다. 그런데 궁금합니다. "잘 돌고 있나...?"

PC 앞으로 돌아갈 필요 없습니다. 방법이 세 가지나 있거든요.

1단계: 같은 Wi-Fi면 그냥 접속

run.bat--bind 0.0.0.0 옵션을 추가하면, 같은 공유기에 물린 스마트폰에서 http://PC아이피:7788 로 바로 들어옵니다. EP4 대시보드는 반응형 웹이라 모바일 화면에서도 예쁘게 나옵니다.

2단계: 밖에서도 보고 싶다면 Cloudflare 터널

tunnel.bat

이거 하나 실행하면 https://어쩌구.trycloudflare.com 주소가 발급됩니다. 이 주소만 있으면 지구 반대편에서도 내 EP4에 접속할 수 있습니다. 별도 서버 임대료 0원.

3단계: 앱파 분들을 위한 Flutter 앱

브라우저 말고 네이티브 앱이 좋다면 mobile/ 폴더의 Flutter 앱을 빌드해서 쓰면 됩니다. SSE로 실시간 상태를 받아오기 때문에 태스크가 끝나는 순간 화면이 착착 갱신됩니다.

모바일 대시보드 모바일 태스크 모바일 실행 로그
모바일 대시보드 모바일 태스크 모바일 실행 로그

좁은 화면에서는 같은 대시보드가 세로로 재배치됩니다. 왼쪽부터 대시보드 · 태스크 · 실행 로그. (데모를 폰에서 열어 보기)

⚠️ 단, 이것 하나만은

EP4 서버 자체에는 인증이 없습니다. 터널 주소를 아는 사람은 누구나 들어올 수 있으니, 터널 주소를 SNS에 올리는 일은 하지 맙시다. 상시로 외부에 열어두려면 Cloudflare Zero Trust 같은 인증을 앞에 세우는 걸 권장합니다.


🎬 시리즈를 마치며

4편을 요약하면 이렇습니다.

  1. EP4는 AI용 할 일 목록 자판기다 — 쌓아두면 알아서 돈다
  2. Git worktree 덕분에 내 코드는 안전하다 — AI는 전용 작업방에서만 논다
  3. 훅과 MCP로 터미널 작업까지 자동 기록된다 — 나는 평소처럼 쓰면 된다
  4. 플러그인으로 내 맘대로 확장하고, 문어의 응원을 받으며, 침대에서 감상한다

AI에게 일을 시키는 시대에 정작 사람이 터미널 감시 요원이 되는 건 좀 억울하잖아요. EP4가 그 감시 업무를 대신해드립니다. 여러분은 커피를 드세요. ☕

👈 이전 글: 3편 — 터미널에 친 프롬프트가 알아서 기록되는 비밀
👈 시리즈 처음부터: 1편 — AI한테 일 시키고 커피 마시러 가기

Posted by 제이브레인
,

🔗 직접 눌러 보기 — 이 글에 나오는 화면은 모두 EP4 데모 사이트에서 실제로 눌러 볼 수 있습니다. 데모의 프로젝트·태스크·로그는 전부 Mock 데이터입니다.
소스 코드: github.com/jbpark/EasyProject4 (MIT)

2편에서 EP4의 심장인 태스크 하네스를 봤습니다. 그런데 개발자의 일상을 돌아보면, 대시보드에 태스크를 정성껏 등록하는 날보다 그냥 터미널 열고 Claude한테 바로 말 거는 날이 훨씬 많습니다.

"이것도 기록되면 좋겠는데... 근데 매번 복사해서 붙여넣긴 귀찮은데..."

귀찮음은 발명의 어머니죠. EP4는 이걸 자동으로 해결합니다. 오늘의 주인공은 MCP 도구훅(hook) 입니다.


🪝 훅: 터미널에 심어둔 착한 도청 장치

Claude CLI에는 특정 시점에 스크립트를 실행해주는 기능이 있습니다. EP4는 딱 두 군데에 훅을 겁니다.

시점 하는 일
프롬프트 입력 순간 ep4_hook_prompt.py "방금 이런 걸 시켰습니다" → EP4에 태스크 등록
응답 완료 순간 ep4_hook_stop.py "결과는 이렇습니다" → 실행 기록 저장

그래서 흐름이 이렇게 됩니다.

터미널에서 평소처럼 프롬프트 입력
  → (훅이 조용히) EP4에 태스크 등록
Claude가 열심히 일하고 응답 완료
  → (훅이 또 조용히) 결과를 EP4에 기록
나: 아무것도 안 함. 그냥 평소처럼 씀.

포인트는 "나: 아무것도 안 함" 입니다. 워크플로우를 바꿀 필요가 전혀 없어요. 평소처럼 쓰면 대시보드에 작업 이력이 차곡차곡 쌓입니다.

터미널 입력 자동 등록

세션 화면의 터미널 출력. 프롬프트를 친 직후 [ep4 hook] 줄이 붙으면서 태스크로 등록됩니다. (데모에서 직접 보기)

"근데 EP4 서버 꺼져 있으면요?"

좋은 질문입니다. 훅은 서버가 없으면 군말 없이 조용히 사라집니다. 에러도 안 띄우고, CLI를 방해하지도 않습니다. 눈치가 아주 빠른 친구예요.


🔧 MCP: Claude가 EP4를 직접 조작한다

훅이 "기록"이라면, MCP는 "조작"입니다. MCP(Model Context Protocol) 덕분에 Claude가 EP4를 직접 도구처럼 쓸 수 있습니다.

도구 하는 일
ep4_list_projects "지금 등록된 프로젝트 뭐 있어?"
ep4_find_project 현재 폴더가 어느 프로젝트인지 자동 매칭
ep4_create_task Claude가 스스로 태스크를 등록
ep4_log_result 작업 결과를 EP4에 직접 기록

이게 재밌는 게, 대화 중에 "이 작업 EP4에 태스크로 등록해줘"라고 하면 Claude가 알아서 프로젝트를 찾고 태스크를 만들어줍니다. AI가 자기 할 일을 자기가 등록하는 진풍경을 볼 수 있습니다.

MCP 도구 호출

Claude CLI 세션에서 EP4의 MCP 도구가 호출되는 장면입니다. (데모에서 직접 보기)


🚀 보너스: Gemini(Antigravity) CLI도 됩니다

"저는 Claude 말고 Gemini CLI도 쓰는데요?"

다행히 Gemini CLI(Antigravity 엔진)는 Claude와 호환되는 훅 방식을 쓰기 때문에, 같은 스크립트를 그대로 재사용할 수 있습니다. 등록할 때 인자로 antigravity_cli만 넘겨주면 끝.

// ~/.gemini/settings.json
"hooks": {
  "UserPromptSubmit": [{"matcher":"","hooks":[{"type":"command","command":"python \"…/ep4_hook_prompt.py\" antigravity_cli"}]}],
  "Stop":             [{"matcher":"","hooks":[{"type":"command","command":"python \"…/ep4_hook_stop.py\" antigravity_cli"}]}]
}

대시보드에는 어느 CLI가 시킨 일인지 라벨이 붙습니다. 🤖 Claude가 한 일, 🚀 Antigravity가 한 일이 한 화면에 정리되니, 나중에 "이 작업 누구한테 시켰더라?" 할 일이 없습니다.

CLI별 라벨 구분

Claude CLI로 들어온 태스크와 Antigravity로 들어온 태스크가 서로 다른 배지로 구분됩니다. (데모에서 직접 보기)


🔭 다음 편 예고

기록도 자동, 조작도 자동. 이제 남은 건 재미입니다.

다음 편은 이 시리즈의 하이라이트입니다. 화면을 돌아다니며 말을 거는 문어🐙, 입맛대로 갈아 끼우는 플러그인 시스템, 그리고 침대에 누워서 스마트폰으로 AI가 일하는 걸 감상하는 방법까지. 마지막 편에서 만나요.

👈 이전 글: 2편 — AI에게 전용 작업방을 주자
👉 다음 글: 4편 — 문어가 말을 겁니다

'유틸리티 > EasyProject4' 카테고리의 다른 글

문어가 말을 겁니다  (0) 2026.09.09
AI에게 전용 작업방을 주자  (0) 2026.09.09
EP4가 뭐하는 물건인지  (0) 2026.09.09
Posted by 제이브레인
,

🔗 직접 눌러 보기 — 이 글에 나오는 화면은 모두 EP4 데모 사이트에서 실제로 눌러 볼 수 있습니다. 데모의 프로젝트·태스크·로그는 전부 Mock 데이터입니다.
소스 코드: github.com/jbpark/EasyProject4 (MIT)

1편에서 EP4가 "AI용 할 일 목록 자판기"라는 걸 알아봤습니다. 이번 편은 EP4의 심장, 태스크 하네스(harness) 이야기입니다.

그런데 하네스 얘기 전에, 솔직한 고백부터 하나 하겠습니다.

"AI한테 코드 수정을 맡기고 자리를 비운다고? 돌아왔을 때 프로젝트가 잿더미면 어떡해?"

네, 저도 처음엔 무서웠습니다. AI는 성실하지만 가끔 과하게 성실하거든요. "이 함수 리팩토링해줘" 했더니 옆에 있던 멀쩡한 파일까지 정리해주는(?) 경우, 다들 한 번쯤 겪어보셨죠?

그래서 EP4는 AI에게 전용 작업방을 줍니다.


🏠 전용 작업방 = Git worktree

Git에는 worktree라는 숨은 보석 같은 기능이 있습니다. 한 저장소에서 여러 개의 작업 폴더를 동시에 꺼내 쓸 수 있게 해주는 기능인데요, EP4는 이걸 이렇게 씁니다.

태스크 실행 버튼 클릭!
  → EP4가 project/{프로젝트이름}/task001 브랜치를 자동 생성
  → server/worktrees/ 아래에 전용 폴더(작업방)를 만들어줌
  → Claude는 그 방 안에서만 신나게 작업
  → 끝나면 커밋 → 프로젝트 브랜치로 머지

비유하자면 이렇습니다. 아이(AI)에게 거실(원본 코드)에서 물감 놀이를 시키는 게 아니라, 전용 놀이방을 하나 내주는 겁니다. 방 안에서 뭘 하든 거실은 깨끗하고, 결과물이 마음에 들면 거실에 걸어주면(머지) 되는 거죠.

worktree 생성 로그

실행 로그의 [git] 줄에서 worktree 브랜치가 만들어지고, 끝에서 프로젝트 브랜치를 거쳐 main으로 머지되는 과정을 그대로 볼 수 있습니다. (데모에서 직접 보기)

원본 코드는 태스크가 성공적으로 끝나고 머지되기 전까지 단 한 글자도 바뀌지 않습니다. 밤새 태스크를 돌려놓고 다리 뻗고 잘 수 있는 이유입니다.


⚙️ 하네스는 어떻게 굴러가나

"하네스"라는 단어가 좀 거창하게 들리는데, 하는 일은 명확합니다. 등록된 태스크를 하나씩 꺼내서, Claude CLI를 실행하고, 결과를 꼬박꼬박 받아 적는 성실한 진행 요원입니다.

POST /api/projects/{id}/tasks/{tid}/run
  → harness_runner() 기상!
    → Git worktree 생성 (작업방 준비)
    → claude CLI subprocess 실행 (일 시작)
    → task_runs 테이블에 기록 (받아쓰기)
    → Git 커밋 → 프로젝트 브랜치 머지 (결과물 반영)
    → SSE로 "run_done" 알림 발송 (퇴근 보고)

태스크가 여러 개면? 순차 실행입니다. 하나 끝나면 다음 거, 그다음 거... 제가 하던 "기다렸다가 다음 프롬프트 입력하기" 노동을 하네스가 대신해주는 겁니다.

태스크 목록과 실행 상태

실행 중인 태스크는 파란 테두리로 표시됩니다. 위쪽 필터로 대기·실행 중·완료·실패만 골라 볼 수 있습니다. (데모에서 직접 보기)


📜 실행 기록은 전부 남습니다

모든 실행은 task_runs 테이블에 차곡차곡 쌓입니다.

기록 항목 내용
status 성공/실패 여부
output Claude의 최종 응답
log_lines 실행 중 로그
git_* 어떤 브랜치에서 뭘 커밋했는지

"어제 밤에 AI가 뭘 했더라?" 싶을 때 대시보드의 run 기록만 열어보면 됩니다. AI는 거짓말을 해도 git 로그는 거짓말을 안 하니까요. 😎

실행 로그 상세

항목을 펼치면 태스크 브랜치, trace/span ID, 변경 파일별 +/− 라인 수, 커밋 목록까지 한 화면에 나옵니다. (데모에서 직접 보기)


💬 보너스: 세션 모드

매번 새 subprocess를 띄우는 게 아니라, 살아있는 터미널 세션(PTY) 에 프롬프트를 계속 던지는 모드도 있습니다. 프로젝트에 session_name을 설정하면 됩니다.

  • subprocess 모드: 매번 새 알바생을 고용 (독립적, 깔끔)
  • 세션 모드: 한 명의 직원과 계속 대화 (맥락 유지, 대화 이어가기)

앞서 한 얘기를 기억해야 하는 연속 작업이라면 세션 모드가 유용합니다.


🔭 다음 편 예고

작업방도 만들어줬고, 순차 실행도 됩니다. 그런데 여기서 욕심이 하나 더 생깁니다.

"대시보드 말고, 그냥 터미널에서 평소처럼 Claude 쓴 것도 EP4에 기록되면 좋겠는데?"

됩니다. 심지어 자동으로요. 다음 편에서 MCP 도구와 훅(hook)이라는 두 마리 토끼를 잡으러 갑니다.

👈 이전 글: 1편 — AI한테 일 시키고 커피 마시러 가기
👉 다음 글: 3편 — 터미널에 친 프롬프트가 알아서 기록되는 비밀

Posted by 제이브레인
,