자동화·에이전트

Agent Hub

자연어 한 줄로 개인 AI 에이전트를 만들고, 맥미니와 GitHub Actions 러너가 구독 로그인된 Claude Code·Gemini CLI로 실행하는 Firebase 웹앱.

분야자동화·에이전트플랫폼Web · Mac mini · GitHub Actions기술Vanilla JS · Firebase Hosting · Firestore · Firebase Auth · Node.js · node-cron · Claude Code CLI · Gemini CLI · GitHub Actions · launchd저장소비공개
웹앱Firebase HostingFirestoreagents맥미니 러너NodeGitHub Actions30분마다 1회 처리Jev + 하네스판정
비공개 저장소라 실제 화면 대신 구조를 그림으로 보여 줍니다.

왜 만들었나

정기 요약·조사 같은 개인 자동화를 매번 프롬프트와 스크립트로 짜기 번거롭고, API 키 과금 없이 구독 계정으로 안전하게 돌릴 방법이 필요했다. 발송·주문처럼 되돌리기 어려운 작업은 사람이 확인한 뒤에만 실행되어야 했다.

주요 기능

  • 자연어 요청을 에이전트 스펙(역할·도구·스케줄·실행 위치)으로 자동 변환
  • LLM 없이 코드만으로 담당 에이전트·중요도(P0~P3)·모델을 정하는 판정기 Jev
  • 발송·주문·예약이 들어간 작업은 계획 → 승인 → 실행 2단계
  • 결과를 체크리스트로 검증하고 미달이면 같은 세션으로 1회 보완
  • 사용 한도 초과 시 notBefore 이후 자동 재시도

숫자로 보면

GitHub Actions 러너 cron: 30분마다 (*/30 * * * *)
Jev 판정 파이프라인 8단계, 프롬프트 하네스 7개 레이어
Jev 평가 케이스 17개 · 시드 학습 데이터 64건 · 러너 테스트 22개

어떻게 동작하나

  1. 자연어로 에이전트 생성

    사용자 요청과 사용 가능한 도구·MCP 목록을 프롬프트로 묶어 에이전트 스펙 JSON으로 컴파일한다.

    runner/src/core/compiler.js
  2. 태스크 큐 구독

    웹앱이 Firestore에 쌓은 queued 태스크를 러너가 구독해 자기 실행 위치(local/github) 담당분만 가져간다.

    runner/src/core/orchestrator.js
  3. Jev 판정

    route → rules → ml → agent → memory → capability → longInput → budget 단계를 거쳐 모델 등급과 우선순위를 정하고 이유를 trace로 남긴다.

    runner/src/core/jev.js
  4. 프롬프트 조립

    역할·컨텍스트·장기 메모리·가드레일·단계·출력 형식·체크리스트 레이어를 쌓고 단계별 도구 권한을 나눈다.

    runner/src/core/harness.js
  5. CLI 실행과 검증

    claude -p / gemini -p를 자식 프로세스로 실행하고, 결과를 체크리스트로 검증해 미달이면 읽기 전용으로 1회 보완한다.

    runner/src/core/executor.js
  6. 결과 기록과 학습

    결과와 판정·검증 이유를 저장하고, 쌓인 기록으로 로컬 분류기를 주기적으로 재학습한다.

    runner/src/core/jev-ml/train.js

구조

Firestore가 에이전트·태스크 큐·러너 하트비트를 저장하고, 상시 실행되는 맥미니 Node 러너(launchd)와 30분마다 도는 GitHub Actions 러너가 큐를 처리한다.

웹앱Firebase Hosting · 정적 JS
Firestoreagents · tasks 큐 · runners
맥미니 러너Node · launchd 상시 실행
GitHub Actions 러너30분마다 1회 처리
Jev + 하네스판정 · 프롬프트 조립 · 검증
Claude Code / Gemini CLI구독 로그인 실행
  • Firestore → GitHub Actions 러너: 대기 태스크 조회
  • 맥미니 러너 → Jev + 하네스: 트리아지
  • Claude Code / Gemini CLI → Firestore: 결과 기록

비공개 저장소라 소스 코드 링크와 코드 발췌는 싣지 않았습니다.

어려웠던 점

LLM을 부르지 않고 모델·우선순위를 정해야 해서, 의존성 없는 순수 JS 다중 헤드 소프트맥스 분류기를 직접 구현하고 확신도가 낮을 때는 규칙으로 되돌아가게 했다. 러너가 둘이라 GitHub 러너가 꺼져 있으면 로컬 러너가 그 태스크를 대신 맡도록 해 큐에 영원히 남는 일을 막았다.