feat(my-deepagent): v0.3 PR #7 — MYDEEPAGENT.md global+project hierarchy
Claude Code 의 CLAUDE.md 글로벌/프로젝트 레이어링 등가. 세션 시작 시 두
파일을 자동 로드해 시스템 프롬프트에 inject:
- Global: <config.data_dir>/MYDEEPAGENT.md (템플릿 자동 생성, idempotent)
- Project: <repo>/MYDEEPAGENT.md (있을 때만 로드, auto-create 안 함)
순서는 [global → project → MEMORY.md → entry .md] 라서 후순위 파일이
deepagents `MemoryMiddleware`의 "later overrides earlier" 규칙에 따라
더 구체적인 맥락으로 일반 지침을 덮을 수 있음.
데이터·라이브러리:
- `instructions.py` (신규):
- `global_instructions_path(config)`, `project_instructions_path(repo_root)`
- `ensure_global_instructions_initialized(config)` — 글로벌 템플릿 1회 생성.
Korean-default 협업·코드 스타일 가이드 시드. Idempotent (사용자 편집 보존).
- `resolve_instruction_paths(config, repo_root)` — 존재하는 파일만 절대 경로로
글로벌 → 프로젝트 순서 반환.
REPL 통합 (`cli/interactive.py`):
- `InteractiveSession.__init__`에서 `ensure_global_instructions_initialized`
호출.
- `build_agent_if_needed`에서 `[*instructions, *memory]` 순서로
`memory_paths_override` 구성 → deepagents memory= kwarg 까지 전파.
테스트 (`tests/integration/test_instructions.py`, 6 케이스):
- 글로벌 부트스트랩 + idempotency (수동 편집 보존)
- 프로젝트 파일은 auto-create 안 함
- 0/1/2 개 존재 시 `resolve_instruction_paths` 반환 순서 검증
- global path 가 data_dir 아래에 위치
- **integration**: `build_agent`가 결합 리스트를 `create_deep_agent(memory=...)`
로 그대로 전달
게이트:
- ruff check / format --check / mypy: PASS
- pytest -q --ignore=tests/integration/test_e2e_workflow.py
--ignore=tests/integration/test_openrouter_smoke.py: 671 passed (6 신규 포함)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -36,6 +36,7 @@ from ..budget import make_budget_tracker_from_config
|
||||
from ..compaction import compact_session, should_compact
|
||||
from ..config import Config, load_config
|
||||
from ..governance import require_consent
|
||||
from ..instructions import ensure_global_instructions_initialized, resolve_instruction_paths
|
||||
from ..memory import (
|
||||
add_memory_entry,
|
||||
ensure_memory_initialized,
|
||||
@@ -167,6 +168,9 @@ class InteractiveSession:
|
||||
# the same repo across sessions hits the same memory.
|
||||
self.memory_dir: Path = project_memory_dir(config, project_key)
|
||||
ensure_memory_initialized(self.memory_dir)
|
||||
# v0.3 PR #7: bootstrap global MYDEEPAGENT.md (project file is loaded
|
||||
# if present but never auto-created — we don't write into the user's repo).
|
||||
ensure_global_instructions_initialized(config)
|
||||
# v0.3 PR #4: user-scope skills directory bootstrap. Empty is normal —
|
||||
# users drop `<name>/SKILL.md` directories under here to register skills.
|
||||
self.skills_dir: Path = user_skills_dir(config)
|
||||
@@ -263,6 +267,10 @@ class InteractiveSession:
|
||||
plan_mw = PlanModeMiddleware(is_active=lambda: self._plan_mode)
|
||||
# Re-glob memory paths every time the agent is rebuilt — `/remember` and
|
||||
# `/forget` call `clear_agent_cache()` so this picks up new/removed files.
|
||||
# Order: instruction files (global → project) FIRST, then MEMORY.md
|
||||
# index, then individual entries. Later files override earlier ones
|
||||
# at the same path per `deepagents.MemoryMiddleware`.
|
||||
instruction_paths = resolve_instruction_paths(self.config, self.repo_root)
|
||||
memory_paths = list_memory_paths(self.memory_dir)
|
||||
skill_sources = resolve_skill_sources(self.config)
|
||||
self._agent = build_agent(
|
||||
@@ -272,7 +280,7 @@ class InteractiveSession:
|
||||
middleware=[plan_mw, cost_mw, audit_mw],
|
||||
model_override=self._model_override,
|
||||
checkpointer=self.saver,
|
||||
memory_paths_override=memory_paths,
|
||||
memory_paths_override=[*instruction_paths, *memory_paths],
|
||||
skills_sources_override=skill_sources,
|
||||
)
|
||||
return self._agent
|
||||
|
||||
Reference in New Issue
Block a user