Ear — 뉴스 큐레이터
Discord 채널에 공유된 기사 링크를 자동 감지하여, 관련성을 3단계(필독/추천/참고)로 분류하고
마크다운으로 아카이브합니다. 매일 아침 digest HTML로 요약되고, 필독 기사는
/search로 자동 투입되어 자가진화 루프를 완성합니다.
개요 & 동작 방식
Ear는 하나의 롱런닝 Claude Code 세션입니다. 자체 MCP 도구(discord2 채널)로 메시지를 받아 기사 링크를 감지하고, WebFetch로 원문을 가져와 분석·분류한 뒤 파일로 저장합니다.
Discord 메시지
↓ (discord2 MCP 채널)
Ear 세션이 수신 감지
↓ WebFetch
원문 기사 fetch
↓ Claude (이 세션 자체가 분석)
관련성 3단계 분류
↓
ear/archive/YYYY-MM-DD-slug.md ← YAML frontmatter + 요약
↓
Discord에 "아카이브 완료!" 짧게 응답
ccd라는 alias로 기동됩니다 — 별도의 Discord 토큰/채널을 쓰는 두 번째 bot입니다. 관리용 ccc와 분리되어 있어 큐레이션만 담당합니다.
Discord 봇 설정 (초회 1회)
- Discord Developer Portal에서 Application 생성 → Bot 추가 → Token 복사
- Bot → Privileged Gateway Intents에서
Message Content Intent활성화 (필수) - OAuth2 → URL Generator에서 scope=
bot, 권한=Send/Read/Attach 체크 → 생성된 URL로 봇을 서버에 초대 - 토큰을
~/.claude/channels/discord2/.env에 저장:DISCORD_BOT_TOKEN=MTQ4...
운영 모드
Ear는 두 가지 실행 방식을 지원합니다. 기본은 Mode B(LaunchAgent REST 폴링)입니다 — 터미널을 닫아도 24/7 동작하고 Discord IDENTIFY 쿼터를 소비하지 않습니다. Mode A(인터랙티브 ccd)는 실시간 반응이 필요할 때만 사용합니다.
Mode A — 인터랙티브 ccd | Mode B — ear-poll LaunchAgent (기본) | |
|---|---|---|
| 실행 방식 | 터미널에서 ccd alias 실행 | install.sh가 자동 등록 (15분마다 REST 폴링) |
| 지연 | 실시간 (gateway push) | 최대 15분 |
| 가용성 | 터미널 창이 열려 있는 동안만 | 24/7 (launchd가 관리) |
| IDENTIFY 쿼터 | 세션당 1회 | 0회 (gateway 미사용) |
| MCP 로딩 | discord2 MCP 상주 | 메시지 처리 시점에만 one-shot claude -p (MCP 미로드) |
Mode A — 인터랙티브 ccd
ccd alias는 Ear 전용 Claude 세션을 시작합니다. ~/.zshrc에 다음과 같이 정의됩니다:
alias ccd='claude --dangerously-skip-permissions \
--dangerously-load-development-channels server:discord2 \
--append-system-prompt "$(cat ~/Programmer/01-comad/comad-world/ear/CLAUDE.md)"'
실행하면 상단에 다음과 같이 뜹니다:
Listening for channel messages from: server:discord2
Experimental · inbound messages will be pushed into this session...
ccd는 반드시 GUI 세션(터미널 앱)에서 실행. launchd/cron에서 기동하면 OAuth keychain 잠금으로 실패합니다 (스케줄러 가이드 참고). Mode B는 launchd gui/<uid> 도메인에서 정상 동작합니다 — REST 호출만 하고 OAuth-기반 claude -p는 메시지가 도착했을 때만 invoke하기 때문입니다.
Mode B — ear-poll LaunchAgent (기본·권장)
~/.claude/channels/discord2/.env에 DISCORD_BOT_TOKEN만 저장해두면 install.sh가 자동으로 com.comad.ear-poll을 등록합니다 (토큰이 없으면 조용히 skip). 15분 간격으로 /channels/:id/messages?after=<last>를 polling해서 새 메시지에 대해서만 claude -p를 one-shot 실행합니다.
# 설치 (Mode B는 환경파일만 있으면 자동 등록)
zsh brain/scripts/launchd/install.sh
# 상태 확인
launchctl list | grep com.comad.ear-poll
# 즉시 실행 (다음 15분을 기다리지 않고)
launchctl kickstart gui/$(id -u)/com.comad.ear-poll
# 로그
tail -f ear/poll-ear.log
핵심: 매 메시지마다 claude -p --strict-mcp-config --mcp-config ear/poll-no-mcp.json으로 호출하므로 MCP가 절대 로드되지 않습니다 — Discord IDENTIFY 쿼터 소비량은 0입니다.
ccd를 KeepAlive=true LaunchAgent로 감싸서 상시 실행하려 시도했다가 TTY 없는 launchd 환경에서 즉시 crash → 30초마다 재시작 → 매 재시작이 discord2 MCP를 spawn → 8시간 만에 1000/1000 소진하는 사고가 있었습니다 (2026-04-16). 교훈: 절대 인터랙티브 ccd를 launchd/systemd에서 감싸지 마세요. 24/7 운영은 Mode B(REST 폴링)가 유일한 정답입니다. 응급 복구는 Discord Developer Portal에서 토큰 회전(쿼터 즉시 리셋).
아카이브 포맷
저장 경로: ear/archive/YYYY-MM-DD-slug.md — 슬러그는 기사 제목의 영문 kebab-case. 모든 기사는 동일한 frontmatter 구조를 엄격히 유지합니다.
---
date: 2026-04-12
relevance: 필독
categories: [AI/LLM, Tool, OpenSource]
geeknews: https://news.hada.io/topic?id=28419
source: https://github.com/example/repo
---
# Claude Code Auto Mode를 설계한 방법
## 핵심 요약
- (3~5개 핵심 포인트)
## 왜 알아야 하는가
(2~3문장 — 실무 영향)
## 추가 리소스
- [공식 문서](URL)
- [관련 GitHub](URL)
3단 관련성 기준
| 등급 | 비율 | 기준 |
|---|---|---|
| 필독 🔴 | ~13% | 현재 스택(Claude Code/MCP/Neo4j/Bun) 직접 영향 · 보안 위협 · 패러다임 변화 · 자기 프로젝트 언급 |
| 추천 🟡 | ~65% | 핵심 관심 분야지만 당장 영향 없는 기사 |
| 참고 🔵 | ~22% | 트렌드 가치는 있으나 관련성 낮음 |
일일 digest HTML
매일 08:00 (스케줄러에 의해 자동 실행) ear/generate-digest.js가 어제 아카이브된 모든 기사를 모아 ear/digests/YYYY-MM-DD-digest.html로 생성합니다.
# 수동 실행
node ear/generate-digest.js # 어제 기준
node ear/generate-digest.js 2026-04-12 # 특정 날짜
toISOString()이 UTC 반환이라 KST 08:00 cron에서 "이틀 전"을 타겟했었음. 로컬 컴포넌트 조립으로 수정 + 누락분 백필.
Brain 인제스트
Ear의 아카이브는 ingest-geeknews.sh cron(매일 09:30)이 Brain Neo4j로 임포트합니다. GeekNews 외 일반 블로그 포스트도 동일한 frontmatter 구조면 함께 처리됩니다.
bun run packages/ingester/src/geeknews-importer.ts
# → ~/Programmer/01-comad/comad-world/ear/archive/*.md 스캔
# → Article / Topic / Technology 노드 MERGE
# → 엔티티 추출(Haiku) + Claim 추출
/search 자동 피드 (2026-04-13 추가)
ear-ingest가 매일 07:00 돌면서 필독 + 핵심 카테고리(AI/LLM, Tool, OpenSource, Backend, Frontend, DevOps, Database, Language) 기사를 골라 기술 토큰을 추출하고 /search에 쿼리로 투입합니다.
bun run packages/search/src/ear-ingest.ts --since 1 # 어제만
bun run packages/search/src/ear-ingest.ts --since 7 # 지난 1주
bun run packages/search/src/ear-ingest.ts --dry-run # 쿼리만 미리보기
실제 동작 예
ear-ingest: 5 article(s) pass filter (relevance=필독, since=3d)
✓ 2026-04-12-managed-agents-brain-hands-separation — 4 queries, 47 adopts
✓ 2026-04-10-advisor-strategy-opus-sonnet — 4 queries, 1 adopt
✓ 2026-04-12-meta-hyperagents-self-referential — 4 queries, 1 adopt
ear-ingest: 5 articles, 12 queries, 49 adopt hits
log: brain/data/ear-to-search.jsonl
관심사 프로필
Ear의 분류 기준은 ear/CLAUDE.md의 시스템 프롬프트와 comad.config.yaml의 interests 블록으로 구성됩니다. 프리셋 전환 시 자동 재구성.
커스터마이징 포인트
interests.high.keywords— "필독" 판정에 가중치must_read_stack— 현재 스택 (직접 영향 기준)categories— 분류 태그 화이트리스트- 봇 응답 말투 —
ear/CLAUDE.md"Voice & Tone" 섹션
관련 파일: ear/CLAUDE.md, ear/archive/, ear/digests/, ear/generate-digest.js, brain/packages/search/src/ear-ingest.ts