feat(my-deepagent): v0.3 PR #3 — auto-memory (project-scoped MEMORY.md + /remember/forget)
Claude Code의 auto-memory + `/remember`/`/forget` 슬래시 등가. 사전 검증 false-positive 였던 deepagents `memory=` kwarg 동작을 확정 (실제로 `MemoryMiddleware` 가 sources 리스트를 매 ainvoke 마다 backend 로 download 해서 system prompt 에 `<agent_memory>` 블록 으로 inject). 핵심 동작: - 세션 시작 시 `<config.data_dir>/projects/<project_key>/memory/` 디렉터리 부트스트랩 + `MEMORY.md` (index) 자동 생성 (idempotent). `project_key` = `sha256(realpath(repo_path))[:16]` 라서 같은 repo 는 세션 간 동일 memory. - 매 agent 재빌드 시 `list_memory_paths(memory_dir)`로 현재 `*.md` 목록을 다시 읽어 deepagents `memory=` kwarg 로 전달. index 파일이 항상 첫 번째 → ToC 역할. - `/remember <text>`: `<slug>.md` 파일 생성 + index 에 pointer 한 줄 append + `clear_agent_cache()` 로 다음 턴에 새 파일 반영. - `/forget <slug>`: 파일 삭제 + index 라인 prune + cache flush. - `/memory`: 현재 디렉터리의 entry 목록 표시. 데이터·라이브러리: - `memory.py` (신규): `project_memory_dir` / `ensure_memory_initialized` / `list_memory_paths` / `add_memory_entry` (슬러그 충돌 시 `-2`/`-3` suffix) / `remove_memory_entry` (index 자체는 삭제 거부) / `memory_entries_summary` / `_slugify`. - `session.py`: `build_agent(..., memory_paths_override=...)` 신규 kwarg. `persona.memory_files`와 합쳐 deepagents `memory=` 로 전달 (empty 이면 kwarg 자체 생략). `_resolve_memory_paths` 헬퍼 추출 (C901 회피). - `cli/interactive.py`: `InteractiveSession` 시그니처에 `project_key: str` 추가. `_register_memory_slash` 신규. 테스트 (`tests/integration/test_memory.py`, 22 케이스): - Bootstrap idempotency - add/remove 정상/실패 (slug 충돌, 없는 항목, index 보호, 빈 입력 거부) - list 순서 (index 우선), 누락된 디렉터리 처리 - project_key 격리, empty key 거부 - `_slugify` 영문/유니코드 fallback/max_len - **integration**: `build_agent(..., memory_paths_override=...)`가 실제로 `create_deep_agent(memory=...)` 까지 전달되는지 monkeypatch 로 검증. Plan §사전검증 #5 false-positive 해소. 게이트: - ruff check / format --check / mypy: PASS - pytest -q --ignore=tests/integration/test_e2e_workflow.py --ignore=tests/integration/test_openrouter_smoke.py: 633 passed (22 신규 포함) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -2,6 +2,47 @@
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
### Added
|
||||
- **v0.3 PR #3 — auto-memory (project-scoped `MEMORY.md` + entry files)**.
|
||||
Claude Code의 auto-memory + `/remember`/`/forget` 슬래시 등가. 세션이 시작될
|
||||
때 `<config.data_dir>/projects/<project_key>/memory/` 디렉터리를 부트스트랩
|
||||
(idempotent) 하고, 그 안의 모든 `*.md` 파일을 deepagents `memory=` kwarg로
|
||||
전달. 같은 repo 경로(= 같은 `project_key`)는 세션 간 동일 memory를 본다.
|
||||
- `memory.py` (신규):
|
||||
- `project_memory_dir(config, project_key)` — `<data_dir>/projects/<key>/memory`
|
||||
- `ensure_memory_initialized(dir)` — `MEMORY.md` (index) 생성, idempotent
|
||||
- `list_memory_paths(dir)` — 모든 `*.md` 정렬, index 파일 맨 앞 배치
|
||||
(deepagents가 순서대로 concat하므로 index가 시스템 프롬프트의 ToC 역할)
|
||||
- `add_memory_entry(dir, content, name=...)` — `<slug>.md` 작성 + index에
|
||||
pointer 한 줄 append. 슬러그 충돌 시 `-2`, `-3` suffix. 빈 콘텐츠 거부.
|
||||
- `remove_memory_entry(dir, slug_or_filename)` — 파일 삭제 + index 라인 prune.
|
||||
`MEMORY.md` 자체는 삭제 거부.
|
||||
- `memory_entries_summary(dir)` — `[(name, char_count), ...]` index 제외.
|
||||
- `session.py`:
|
||||
- `build_agent(..., memory_paths_override: list[str] | None = None)` 신규
|
||||
kwarg. `persona.memory_files`와 합쳐 deepagents `memory=` kwarg로 전달
|
||||
(없으면 kwarg 자체를 생략 → `MemoryMiddleware` 미생성).
|
||||
- 복잡도 제어를 위해 `_resolve_memory_paths` 헬퍼 추출 (C901 회피).
|
||||
- `cli/interactive.py`:
|
||||
- `InteractiveSession(...)` 시그니처에 `project_key: str` 추가, `__init__`
|
||||
에서 `project_memory_dir(...)` + `ensure_memory_initialized(...)` 호출.
|
||||
- `build_agent_if_needed`가 매 재빌드 시 `list_memory_paths(memory_dir)`로
|
||||
현재 디렉터리 상태를 다시 읽어 deepagents에 전달. `/remember`/`/forget`이
|
||||
`clear_agent_cache()`를 호출하면 다음 턴에 새 파일 목록 반영.
|
||||
- `_register_memory_slash`: `/remember <text>`, `/forget <slug>`, `/memory`
|
||||
슬래시 등록. `/memory`는 현재 저장된 항목 목록 표시.
|
||||
- `tests/integration/test_memory.py` (신규, 22 케이스):
|
||||
- Bootstrap idempotency, index 자동 생성
|
||||
- add_memory_entry: 파일·index 동시 작성, 충돌 처리, 빈 입력 거부, name override
|
||||
- remove_memory_entry: slug/filename 매칭, 없는 항목, index 자체 보호
|
||||
- list_memory_paths: index 우선, 누락된 디렉터리는 빈 리스트
|
||||
- memory_entries_summary: index 제외, 누락된 디렉터리
|
||||
- project_memory_dir: project_key 격리, empty key 거부
|
||||
- _slugify: 영문, 유니코드 fallback, max_len 잘라내기
|
||||
- **integration**: `build_agent(..., memory_paths_override=[...])`가 실제로
|
||||
`create_deep_agent(memory=...)` 까지 전달되는지 monkeypatch로 검증
|
||||
(false-positive 였던 plan §사전검증 #5 해소)
|
||||
|
||||
### Added
|
||||
- **v0.3 PR #2 — context compaction (auto + manual `/compact`)**.
|
||||
Claude Code의 auto-compact + `/compact` 슬래시 등가. 세션 누적 토큰이
|
||||
|
||||
Reference in New Issue
Block a user