# VEGA 확장 — Gemini CLI 보안 분석 모듈 설계 핸드오프 문서 --- ## 1. 배경 및 논의 경과 ### 출발점 로컬 LLM(Qwen 3.5)만으로는 소스 분석 품질에 한계가 있어, Gemini CLI의 분석력을 활용하되 **내부 소스 보안을 유지**하는 시스템을 설계. ### 핵심 논의 과정 (v1 → v8) | 버전 | 논의 | 결론 | |------|------|------| | v1~v2 | API vs CLI, 멀티 워커 | Gemini CLI 사용, 역할별 워커 | | v3~v4 | Rate Limit, 반복 루프 | AI Ultra 120RPM/2000RPD, Plan→Execute→Reflect 루프 | | v4 비판 | 자기평가 불신뢰, 과잉동원 | 연구 기반 5개 약점 발견 | | v5~v6 | MCP 도구, Verifier, 보안 | Source Mediator 패턴, Verifier를 Critic으로 전환 | | v7 | 보안 원칙 확정, Critic 협력자 | 소스 원문 금지, 로직 설명 허용, LLM 앞단+검증자 | | **v8** | **Mode B 가치 재검토** | **Gemini CLI 자체가 완전한 에이전트 → Mode B는 추가 개발 불필요** | ### 최종 결론 ``` Mode B (외부/범용): Gemini CLI를 그대로 쓰면 됨 → VS Code Agent Mode 또는 터미널 gemini -i → 추가 개발 불필요 Mode A (내부/보안): VEGA 확장으로 구현해야 하는 부분 → 로컬 LLM이 내부 소스를 읽고 추상화 → Gemini CLI(선생님)와 대화로 분석 → 로컬 LLM이 결과를 소스와 대조 검증 ``` --- ## 2. VEGA에서 구현할 것: Mode A ### 구조 ``` User ↔ VEGA Web UI │ Local LLM (프롬프트 A: 앞단) │ 도구: 내부 파일/RAG/DB │ 소스 읽고 추상화/마스킹 ▼ Gemini CLI (-p, --approval-mode yolo) │ 추상화된 정보로 분석 │ 질문 → LLM 답변 → 분석 (대화 루프) ▼ Local LLM (프롬프트 B: 검증자, 별도 호출) │ Gemini 결과 vs 실제 소스 대조 ▼ User에게 검증된 결과 전달 ``` ### 보안 정책 | 허용 ✅ | 금지 ❌ | |---------|---------| | 학술적 알고리즘 설명 (HW, LSMC 등) | 소스코드 원문 | | 함수 로직/흐름 설명 | 테이블/컬럼 구조 | | 호출 관계 개괄 | 실제 값, 파라미터 수치 | | 개별 함수 입출력 의미 | 내부 URL, 인증정보 | LLM 추상화 후 **정규식 2단계 필터**로 금지어 자동 치환. ### Student ↔ Teacher 모델 - LLM(학생)이 소스를 읽고 설명 → Gemini(선생님)가 분석/조언 - LLM이 문제 정립 못 해도 → Gemini가 질문으로 끌어냄 - LLM이 헛소리해도 → Gemini가 교정 - 앞단(프롬프트 A)과 검증자(프롬프트 B)는 **별도 호출** → 순환 오류 방지 ### Gemini CLI 호출 방식 ```bash # 역할별 headless 호출 (서브에이전트 풀 불필요) gemini -p "분석 요청" --system "분석가 프롬프트" -o json --approval-mode yolo gemini -p "리뷰 요청" --system "리뷰어 프롬프트" -o json --approval-mode yolo ``` 매 호출이 **독립 컨텍스트** → 컨텍스트 포화 없음 → 풀 관리 불필요. ### VEGA 기존 인프라 활용 - **Ollama API**: 로컬 LLM 호출 (이미 존재) - **FastAPI + SSE**: Web UI (이미 존재) - **RAG/벡터DB**: 내부 문서 검색 (이미 존재) - **추가 필요**: `gemini -p` subprocess 호출 모듈, 마스킹 필터, 대화 루프 --- ## 3. 새로운 목표 — AI Agent Team ### 진짜 최종 목표 위 Mode A/B 논의는 더 큰 목표의 **일부**였음: > **사용자가 디스코드로 추상적 명령을 주면, > AI Agent Team이 스스로 작업을 분석/분해/실행하고, > 샌드박스에서 코드를 실행/테스트하고, > Gitea CI로 컴파일/배포까지 수행하며, > 사용자는 디스코드로 확인/컨펌만 하는 시스템.** ### 왜 이 구조가 필요한가 | 현재 문제 | 원인 | 해결 방향 | |----------|------|----------| | **컨텍스트 초과** | 한 에이전트가 긴 작업 → 컨텍스트 포화 → 멈춤/유실 | 작업을 역할별로 분할, 각 에이전트는 짧은 컨텍스트 | | **추상적 명령 처리** | "이거 고쳐줘" → 어디를? 뭘? | 작업 분석 에이전트가 구체적 태스크로 분해 | | **실행/테스트 불가** | 분석만 하고 실제 실행 못 함 | 샌드박스 + CI 연동 | | **확인의 어려움** | 결과를 보려면 IDE 열어야 | 디스코드로 중간 보고 + 컨펌 | ### 제안 아키텍처: AI Agent Team ``` Discord (사용자 인터페이스) │ ▼ ┌─────────────────────────────────────────┐ │ Coordinator Agent │ │ (Gemini CLI 또는 로컬 LLM) │ │ │ │ 역할: │ │ - 사용자 명령 해석 │ │ - 작업 분해 (추상 → 구체) │ │ - 에이전트에게 작업 배분 │ │ - 결과 종합 → 디스코드 보고 │ └──┬──────────┬──────────┬────────────────┘ │ │ │ ┌──▼──┐ ┌───▼───┐ ┌───▼───┐ │분석 │ │구현 │ │테스트 │ ... 역할별 │Agent │ │Agent │ │Agent │ └──┬──┘ └───┬───┘ └───┬───┘ │ │ │ └──────────┼──────────┘ │ ┌─────────▼─────────┐ │ 실행 환경 │ │ - 샌드박스 (코드) │ │ - Gitea Runner │ │ - CI/CD 파이프라인 │ └───────────────────┘ │ 디스코드로 결과 보고 + 사용자 컨펌 │ 배포 / 완료 ``` ### 이 목표를 이루기 위한 프로젝트 분해 | 프로젝트 | 설명 | 의존성 | |---------|------|--------| | **P1: Discord Bot** | 사용자 ↔ 시스템 인터페이스 | 없음 | | **P2: Task Decomposer** | 추상 명령 → 구체 태스크 목록 | Gemini CLI | | **P3: Agent Runner** | 역할별 `gemini -p` headless 호출 | Gemini CLI | | **P4: Sandbox** | 코드 실행/테스트 환경 | Docker 또는 로컬 격리 | | **P5: Gitea CI 연동** | PR 생성 → Runner 실행 → 결과 수집 | Gitea API | | **P6: 보안 분석 (Mode A)** | VEGA 확장, 내부 소스 보안 분석 | P3 + VEGA | ### 접근 전략 **단계적 구축 (작은 것부터 동작하게):** ``` Step 1: Discord Bot + gemini -p 호출 "디스코드로 질문 → Gemini 답변 → 디스코드로 반환" → 가장 작은 동작 단위. 기초 인프라 검증. Step 2: Task Decomposer "이 모듈 리팩토링해줘" → 구체 태스크 3개로 분해 → Gemini CLI의 plan mode 활용 Step 3: Agent Runner + 파일 접근 분해된 태스크를 순차 실행, 파일 수정, 결과 보고 → gemini -p --approval-mode yolo Step 4: Sandbox 실행 수정된 코드를 샌드박스에서 실행/테스트 → Docker 컨테이너 또는 gemini --sandbox Step 5: Gitea CI 연동 수정 완료 → Gitea PR 생성 → Runner 실행 → 결과를 디스코드로 → Gitea API + Webhook Step 6: 보안 분석 (Mode A) VEGA와 통합, 내부 소스 보안 분석 파이프라인 ``` ### 핵심 원칙 1. **Gemini CLI가 에이전트 엔진** — 자기가 이미 파일 읽기/쓰기/실행 가능 2. **headless 호출로 컨텍스트 분할** — 역할별/태스크별 독립 호출 → 포화 방지 3. **디스코드 = 유일한 사용자 인터페이스** — 명령, 중간 보고, 컨펌 모두 디스코드에서 4. **Gitea CI = 실행/배포 인프라** — 코드 수정 → PR → 빌드 → 테스트 → 배포 5. **단계적 구축** — Step 1부터 동작 확인 후 다음 단계