chungyeong
|
2685cb26db
|
feat(my-deepagent): v0.3 PR #4 — Agent Skills (LLM-routing, SKILL.md index inject)
Claude Code의 Agent Skills 동작을 그대로 구현 — deepagents `SkillsMiddleware`가
`<name>/SKILL.md` 디렉터리들을 스캔하고 `(name, description)` 인덱스만
시스템 프롬프트에 inject. LLM이 필요한 skill을 골라 read_file 로 본문을
가져감 (progressive disclosure). 임베딩·벡터 검색 없음.
데이터·라이브러리:
- `skills.py` (신규):
- `user_skills_dir(config)` — `<config.data_dir>/skills/`
- `ensure_skills_initialized(dir)` — `mkdir -p`, 예제 skill 시드 안 함
- `list_installed_skills(dir)` — `<name>/SKILL.md` frontmatter 파싱.
malformed (frontmatter 없음/YAML 깨짐/name-dir mismatch/10MB 초과)는
silently skip. description 200자 트렁케이트.
- `read_skill_body(dir, name)` — `/skill <name>` 본문 표시용
- `resolve_skill_sources(config)` — deepagents 에 전달할 source 리스트
- `session.py`:
- `build_agent(..., skills_sources_override=...)` 신규 kwarg.
`persona.skills`와 합쳐 `deepagents.create_deep_agent(skills=...)`로 전달
(empty 면 kwarg 생략 → middleware 미생성).
- `_resolve_skill_sources` 헬퍼 추출.
REPL 통합 (`cli/interactive.py`):
- `InteractiveSession.__init__`에서 `ensure_skills_initialized` 호출
→ `self.skills_dir`.
- `build_agent_if_needed`가 매 재빌드 시 `resolve_skill_sources(config)` 전달.
- `_register_skills_slash`: `/skills` (목록), `/skill <name>` (본문) 등록.
테스트 (`tests/integration/test_skills.py`, 15 케이스):
- Bootstrap idempotency, 빈 디렉터리 정상 상태
- list: 정렬, SKILL.md 누락 스킵, YAML 깨짐 스킵, name-dir mismatch 스킵,
description truncate, 누락된 디렉터리 빈 리스트, 긴 description 트렁케이트
- read_skill_body: 정상/누락/빈 이름
- resolve_skill_sources: user-scope 1개 반환
- **integration**: `build_agent(..., skills_sources_override=[...])` 가 실제로
`create_deep_agent(skills=...)` 까지 monkeypatch 로 전달되는지 검증
게이트:
- ruff check / format --check / mypy: PASS
- pytest -q --ignore=tests/integration/test_e2e_workflow.py
--ignore=tests/integration/test_openrouter_smoke.py: 648 passed (15 신규 포함)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-17 20:42:32 +09:00 |
|