docs: 세션 종료 — devlog + known-issues + STATUS.md 업데이트
- known-issues: WebDAV 501, anime action 분기 누락, 함수명 불일치 3건 - devlog: 007~013 (7건 추가) - STATUS.md: NC 4모듈, Foreman, unified 라우팅 반영 - Vikunja: #418 done, #439 created+done - Wiki: Status 페이지 동기화
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
|
||||
> AI 에이전트는 **세션 시작 시** 이 문서를 읽어 전체 맥락을 파악합니다.
|
||||
> **세션 종료 시** 변경사항을 이 문서에 반영합니다.
|
||||
> Last updated: 2026-03-17
|
||||
> Last updated: 2026-03-18
|
||||
|
||||
## 시스템 개요
|
||||
|
||||
@@ -10,11 +10,12 @@ Hybrid Skill-Based AI Agent v3 — 사용자가 디스코드에서 자연어 명
|
||||
|
||||
```
|
||||
Discord 메시지
|
||||
→ Orchestrator.classify() — NLU 분류
|
||||
→ unified prompt (Gemini 분류) → JSON 파싱
|
||||
├── chat → 즉답
|
||||
├── clarify → 질문
|
||||
├── anime → AnimeTool (파이프라인)
|
||||
└── task → TaskPipeline.execute() → Gemini CLI agent 모드
|
||||
├── anime → handle_anime_message (AnimePipeline)
|
||||
├── nextcloud → NCHandler (Files/Calendar/Mail/Contacts)
|
||||
└── task → Gemini CLI agent 모드
|
||||
```
|
||||
|
||||
## 핵심 설계 결정 (불변)
|
||||
@@ -42,6 +43,13 @@ Discord 메시지
|
||||
| Gitea Wiki 관리 | `.agent/workflows/helpers/wiki_helper.py` | Wiki 페이지 CRUD | ✅ |
|
||||
| Discord Bot | `api/discord_bot.py` | 이벤트 핸들러 + NLU 라우팅 (~310줄) | ✅ |
|
||||
| 커뮤니티 트렌드 | `tools/community_scraper.py` | DCInside 갤러리 인기글 스크래핑 + 랭킹 + 본문 조회 (Gemini Skill) | ✅ |
|
||||
| NC 파일 관리 | `tools/nc_files.py` | Nextcloud WebDAV 파일 목록/검색/공유 (PROPFIND 폴백) | ✅ |
|
||||
| NC 캘린더 | `tools/nc_calendar.py` | CalDAV 일정 CRUD (조회/추가/수정/삭제) | ✅ |
|
||||
| NC 메일 | `tools/nc_mail.py` | IMAP 메일 조회/검색 (Mailcow PLAIN auth) | ✅ |
|
||||
| NC 연락처 | `tools/nc_contacts.py` | CardDAV 연락처 조회/검색 | ✅ |
|
||||
| NC 핸들러 | `handlers/nc_handler.py` | 자연어→NC 도구 라우팅 (Embed 응답) | ✅ |
|
||||
| AI Foreman | `core/foreman.py` | 목표 분해 + 상담 + Vikunja 일괄 등록 (/goal) | ✅ |
|
||||
| 통합 분류 라우팅 | `api/discord_bot.py` | unified prompt→JSON→모드별 핸들러 라우팅 | ✅ |
|
||||
| CLI Bridge | - | Gemini CLI 영속 프로세스 (PTY 미지원으로 보류) | ⏸️ |
|
||||
|
||||
## 모듈 상태
|
||||
@@ -53,12 +61,15 @@ Discord 메시지
|
||||
| Gemini 래퍼 | `core/gemini_caller.py` | ✅ | text/agent 모드 |
|
||||
| 컨텍스트 | `core/context_manager.py` | ✅ | 관련 파일 선별 + 토큰 예산 |
|
||||
| 애니 파이프라인 | `tools/anime_pipeline.py` | ✅ | v2 에피소드 추출, 그룹 필터링, 자막 보호 |
|
||||
| Discord Bot | `api/discord_bot.py` | ✅ | 레거시 800줄 제거, ~310줄 |
|
||||
| Discord Bot | `api/discord_bot.py` | ✅ | unified classify→route, ~470줄 |
|
||||
| 커뮤니티 스크래퍼 | `tools/community_scraper.py` | ✅ | DCInside 스크래퍼 + 4종 정렬 + Gemini Skill |
|
||||
| NC 4모듈 | `tools/nc_*.py` | ✅ | Files/Calendar/Mail/Contacts |
|
||||
| AI Foreman | `core/foreman.py` | ✅ | 목표 분해 + 상담 + Vikunja 등록 |
|
||||
| 에이전트 워크플로우 | `.agent/` | ✅ | STATUS.md + 수칙 업데이트 |
|
||||
|
||||
## 최근 마일스톤
|
||||
|
||||
- **2026-03-18**: Nextcloud 4모듈 + NC핸들러 + AI Foreman v0.1 + unified 분류→라우팅 구현
|
||||
- **2026-03-17**: 커뮤니티 트렌드 스크래퍼 구현 (DCInside 인기글 + Gemini Skill)
|
||||
- **2026-03-16**: 에이전트 수칙 업데이트 + STATUS.md 도입 + .agents 통합
|
||||
- **2026-03-15**: MCP 서버 제거 → CLI 직접 실행 전환
|
||||
|
||||
@@ -106,3 +106,20 @@
|
||||
- **해결**: `conn.authenticate("PLAIN", lambda x: ("\0" + user + "\0" + pw).encode())` 사용
|
||||
- **주의**: 일반 계정 비밀번호는 `LOGIN`도 가능하지만, 앱 비밀번호는 반드시 `PLAIN` auth 필요
|
||||
|
||||
### [2026-03-18] WebDAV SEARCH — Nextcloud 501 Not Implemented
|
||||
- **증상**: `nc_files.search()` 결과 0건, 로그에 `WebDAV SEARCH 실패: 501`
|
||||
- **원인**: Nextcloud 인스턴스가 WebDAV `SEARCH` 메서드를 지원하지 않음
|
||||
- **해결**: SEARCH 실패 시 PROPFIND depth=99 → 로컬 필터 폴백 (`nc_files.py`)
|
||||
- **주의**: PROPFIND depth=99는 파일 수가 많으면 느릴 수 있음. 추후 OCS 파일 검색 API 검토
|
||||
|
||||
### [2026-03-18] anime_handler — action 분기 누락
|
||||
- **증상**: 자연어 "자막 최신화" → "무엇을 도와드릴까요?" 표시
|
||||
- **원인**: unified prompt가 `action: "download", title: ""` 반환 → `download and title` 조건 불충족 → else 분기
|
||||
- **해결**: `download and not title` 분기 추가 (filter에 "sub" 포함 시 `batch_download(sub_only)`)
|
||||
- **주의**: 새 action 추가 시 unified prompt와 handler 양쪽 매핑 반드시 확인
|
||||
|
||||
### [2026-03-18] discord_bot — 모듈 함수명 불일치
|
||||
- **증상**: `cannot import name 'handle_anime_action'`
|
||||
- **원인**: 존재하지 않는 함수명으로 import (실제: `handle_anime_message`)
|
||||
- **해결**: import 수정 + 시그니처 확인 `(message, parsed)`
|
||||
- **주의**: 핸들러 연결 시 반드시 실제 모듈의 함수명/시그니처 확인 후 코드 작성
|
||||
|
||||
Reference in New Issue
Block a user