agf 분석 기반 cmux session-finder 스펙
0. 조사 출처
확인한 원본은 https://github.com/subinium/agf/blob/main/README.md, https://raw.githubusercontent.com/subinium/agf/main/README.md, https://github.com/subinium/agf 리포 페이지, 그리고 raw source src/main.rs, src/model.rs, src/scanner/mod.rs, src/scanner/claude.rs, src/scanner/codex.rs, src/scanner/opencode.rs, src/scanner/pi.rs, src/scanner/kiro.rs, src/scanner/cursor_agent.rs, src/scanner/gemini.rs, src/fuzzy.rs, src/cache.rs, src/action.rs다. 설치는 하지 않았다. ~/knowledge-agent/cowork/subinium-review-20260413/review.md의 “오늘 1순위” 판단도 확인했다.
1. agf 기능 목록
agf는 “AI Agent Session Finder”다. README 기준 지원 세션 타입은 Claude Code, Codex, OpenCode, pi, Kiro, Cursor CLI, Gemini다. 핵심 기능은 여러 에이전트 세션을 한 목록으로 모으고, 프로젝트명·경로·요약으로 fuzzy search하며, 선택한 세션을 한 키로 재개하는 것이다. UI/UX는 Rust TUI 기반이다. 검색 입력, 위아래 이동, 에이전트 필터, 정렬 전환, 상세 미리보기, bulk delete, 새 세션 시작, smart cd, mouse support, 한글/CJK 검색, quick resume(agf resume <query>)가 있다.
코드상 인덱싱은 에이전트별 scanner를 병렬 실행하는 구조다. src/scanner/mod.rs는 Claude/Codex/OpenCode/pi/Kiro/Cursor/Gemini scanner를 thread로 동시에 돌린 뒤 timestamp 내림차순으로 합친다. src/model.rs의 공통 Session 필드는 agent, session_id, project_name, project_path, summaries, timestamp, git_branch, worktree다. src/fuzzy.rs는 nucleo fuzzy matcher로 project_name + project_path, 선택 시 summaries, git branch까지 검색 텍스트로 삼는다. src/cache.rs는 ~/.cache/agf/sessions.json에 agent별 mtime과 session 목록을 저장해 stale agent만 재스캔한다. src/action.rs는 cd <project_path> && <agent resume command>를 생성한다.
Claude scanner는 ~/.claude/history.jsonl을 중심으로 sessionId, project, display, timestamp를 묶고, ~/.claude/projects/*/*.jsonl의 cwd에서 .claude/worktrees/<name>을 감지한다. Codex scanner는 ~/.codex/state_*.sqlite의 threads(id,cwd,title,updated_at,git_branch,first_user_message)를 1차로 쓰고, 없으면 ~/.codex/sessions/**/*.jsonl의 session_meta를 fallback으로 읽는다. Codex summary는 ~/.codex/history.jsonl도 합친다.
2. 우리 시스템 현황
현재 cmux는 “라이브 surface 관리”가 중심이다. 해리 기준 현황은 cmux 7 surface 라이브 세션이며, 과거 세션 검색·복귀는 약하다. 로컬 확인 경로는 다음이다.
- Claude Code 로그:
/Users/ron/.claude/history.jsonl,/Users/ron/.claude/projects/-Users-ron/*.jsonl - Codex 로그:
/Users/ron/.codex/history.jsonl,/Users/ron/.codex/state_5.sqlite,/Users/ron/.codex/sessions/2026/{02,03,04}/... - Codex 보조 인덱스:
/Users/ron/.codex/session_index.jsonl - claude-mem:
/Users/ron/.claude-mem/claude-mem.db,/Users/ron/.claude-mem/chroma/chroma.sqlite3 - OpenClaw dashboard/bus:
http://127.0.0.1:3344, DB/Users/ron/.openclaw/data/ops_multiagent.db - cmux-orchestrator 스크립트 위치:
/Users/ron/.claude/skills/cmux-orchestrator/scripts/
3. 격차 분석
agf에 있고 우리에게 부족한 것: 과거 Claude/Codex 세션을 한 표준 레코드로 정규화하는 인덱스, fuzzy 검색, summary 검색 범위 옵션, 모델별 필터, 프로젝트별 resume command 생성, 빠른 list/json 출력, cache invalidation, worktree/branch 표시다. 특히 우리 cmux는 “지금 떠 있는 surface”는 다루지만 “어제 하던 Codex/Claude 작업으로 돌아가기” UX가 약하다.
우리에게 있고 agf에는 약한 것: OpenClaw dashboard, bus command queue, ~/knowledge-agent 산출물, claude-mem 장기 기억, cmux surface, agent 작업 분배 맥락이다. 즉 agf는 세션 파일 검색기는 강하지만 작업 큐·보고서·memory와 연결된 운영 판단은 없다.
4. session-finder 서브커맨드 스펙
추가 명령은 다음으로 고정한다.
cmux-dispatch.sh find <query> [--model claude|codex|all] [--project <path-or-name>] [--since <YYYY-MM-DD|Nd|Nh>]
인덱싱 데이터 소스
1일 MVP는 Claude와 Codex만 한다. Claude는 /Users/ron/.claude/history.jsonl에서 sessionId, project, display, timestamp를 읽고, /Users/ron/.claude/projects/-Users-ron/*.jsonl 첫 줄 또는 앞 3줄의 cwd를 보강한다. Codex는 /Users/ron/.codex/state_5.sqlite의 threads 테이블을 우선 읽고, /Users/ron/.codex/history.jsonl 및 /Users/ron/.codex/sessions/**/*.jsonl을 보조로 쓴다. 결과 캐시는 /Users/ron/knowledge-agent/cowork/cmux-orchestrator/session-index.jsonl에 저장한다. 향후 메모리 보강은 /Users/ron/.claude-mem/claude-mem.db와 Chroma를 별도 enrichment 단계로 붙인다.
검색 키
검색 키는 model, session_id, project_name, project_path, summary, first_user_message, git_branch, mtime, source_file이다. <query>는 우선 grep -i/간단 점수화로 시작하고, 이후 Python rapidfuzz 또는 SQLite FTS로 전환한다. --since는 timestamp/mtime 둘 다 적용한다.
결과 포맷
기본 stdout은 bite-sized 표다.
[1] codex 2026-04-13 /Users/ron main <short summary>
id=<session_id> source=/Users/ron/.codex/state_5.sqlite
resume: cd '/Users/ron' && codex resume '<session_id>'
[2] claude 2026-04-12 /Users/ron - <short summary>
id=<session_id> source=/Users/ron/.claude/history.jsonl
resume: cd '/Users/ron' && claude --resume '<session_id>'
--json은 1주 확장에 둔다. 재개 동작은 즉시 실행하지 않고 기본은 명령 출력만 한다. 실행형은 별도 cmux-dispatch.sh resume <result-number|session-id>로 분리해 사고를 줄인다. cmux surface 연결은 1주 확장: 선택한 resume command를 새 cmux surface 또는 현재 surface에 주입한다.
5. MVP: 1일 구현 가능 범위
scripts/cmux-session-index.py작성: Claude/Codex만 스캔.cmux-dispatch.sh find추가: query/model/project/since 파싱.- 캐시 파일 생성:
/Users/ron/knowledge-agent/cowork/cmux-orchestrator/session-index.jsonl. - 결과 표 출력과 resume command 생성.
- 검증 샘플:
find natural gas --model all --since 14d,find cmux --model claude,find OpenClaw --model codex.
6. 확장: 1주 범위
- fuzzy scorer 고도화:
rapidfuzz또는 SQLite FTS5. --json,--limit,--sort time|score|model추가.- claude-mem join: session summary와 memory observation을 묶어 “왜 이 세션인지” 설명.
- OpenClaw dashboard 카드: 최근 복귀 후보, 프로젝트별 마지막 세션, 실패 후 재개 후보 표시.
- cmux 통합:
cmux-dispatch.sh resume가 새 surface 생성 또는 기존 surface 선택 후 resume command를 전달. - 안전장치: 삭제 기능은 MVP/1주 모두 제외. agf의 bulk delete는 우리 운영에서는 위험하다.