Pre-flight assets prepared on the main machine before the new-machine rewrite of my-deepagent in Python. - poc/: BudgetTracker + CostMiddleware + MockChatModel PoC. Validates wrap_model_call pattern, SQLite WAL + ON CONFLICT upsert, per-scope cap accounting. 5/5 pytest PASS in isolated uv venv. - schemas/: 10 personas (Anthropic Sonnet/Opus/Haiku + DeepSeek mix), 3 workflows (spec-and-review, bug-fix-with-reproduction, code-investigation), 4 artifact JSON Schemas (dev/spec@1, dev/phase-plan@1, dev/review-finding-batch@1, common/final-report@1). - schemas/validate.py: pydantic + Draft202012 cross-validation. 18/18 assets verified. - README.md: new-machine bootstrap instructions. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
my-deepagent v0.1.0 Seed Assets
이 디렉토리는 새 머신(/Users/1111615/Desktop/Repository/my-deepagent)에서 v0.1.0 개발을 시작할 때 사용하는 자산 묶음입니다. 메인 머신에서 실제 검증 완료 (deepagents 0.6.1 API inspect, OpenRouter ChatOpenAI 인스턴스화, BudgetTracker PoC pytest 5/5 PASS, 시드 yaml/json 18개 validate.py 통과).
구성
my-deepagent-seed/
├── README.md # 이 문서
├── poc/ # BudgetTracker + CostMiddleware PoC (검증 완료)
│ ├── pyproject.toml
│ ├── src/poc/{budget,pricing,middleware,mock_model}.py
│ └── tests/test_budget.py # 5/5 PASSED
└── schemas/ # v0.1.0 시드 자산 (validate.py 통과)
├── validate.py
├── personas/ # 10개 yaml
│ ├── default-interactive@1.yaml
│ ├── openrouter-claude-spec-writer@1.yaml
│ ├── openrouter-claude-phase-planner@1.yaml
│ ├── openrouter-claude-code-editor@1.yaml
│ ├── openrouter-claude-code-reviewer@1.yaml
│ ├── openrouter-claude-security-auditor@1.yaml
│ ├── openrouter-deepseek-verifier@1.yaml
│ ├── openrouter-claude-debugger@1.yaml
│ ├── openrouter-deepseek-log-analyzer@1.yaml
│ └── openrouter-claude-architect@1.yaml
├── workflows/ # 3개 yaml
│ ├── spec-and-review@1.yaml
│ ├── bug-fix-with-reproduction@1.yaml
│ └── code-investigation@1.yaml
└── artifacts/ # 4개 JSON Schema 2020-12
├── dev/{spec,phase-plan,review-finding-batch}@1.json
└── common/final-report@1.json
새 머신으로 옮기는 방법
이 디렉토리는 메인 머신 워크트리 안에 있습니다. 새 머신에서 사용하려면:
옵션 A: tar.zst 압축 후 수동 복사 (가장 단순)
# 메인 머신에서
cd /Users/chungyeong/Desktop/Dev/dev-puppeteer/.claude/worktrees/sad-satoshi-d938d4
tar --zstd -cf /tmp/my-deepagent-seed.tar.zst my-deepagent-seed/
# AirDrop / scp / iCloud Drive 등으로 새 머신에 복사
# 새 머신에서
cd /Users/1111615/Desktop/Repository
tar --zstd -xf my-deepagent-seed.tar.zst
mv my-deepagent-seed my-deepagent # 이름 변경
옵션 B: Git push/clone
# 메인 머신에서 (워크트리에 commit 후)
git add my-deepagent-seed/
git commit -m "feat: my-deepagent v0.1.0 seed assets"
git push origin claude/sad-satoshi-d938d4
# 새 머신에서
git clone <repo-url>
# my-deepagent-seed/ 디렉토리만 추출 후 새 위치로 이동
옵션 C: 클립보드 (작은 파일은)
각 yaml/json/py를 채팅에서 복사 → 새 머신 에디터에 paste.
새 머신 시작 절차 (Step 0)
cd /Users/1111615/Desktop/Repository/my-deepagent
# 1. uv 설치 (없으면)
curl -LsSf https://astral.sh/uv/install.sh | sh
# 2. Python 프로젝트 초기화
uv init --no-readme
# 3. 의존성 추가 (정확한 1.x 버전)
uv add \
'deepagents>=0.6.1,<0.7.0' \
'langchain>=1.3.0,<2.0.0' \
'langchain-core>=1.4.0,<2.0.0' \
'langchain-openai>=1.2.1,<2.0.0' \
'langgraph>=1.2.0' \
'langgraph-checkpoint-sqlite>=3.1.0' \
'openai>=2.26.0' \
'pydantic>=2.9' \
'pydantic-settings>=2.6' \
'pyyaml>=6.0' \
'jsonschema>=4.23' \
'aiosqlite>=0.20' \
'alembic>=1.14' \
'typer>=0.14' \
'prompt-toolkit>=3.0' \
'rich>=13.9' \
'structlog>=24.4' \
'platformdirs>=4.9' \
'keyring>=25.7' \
'zstandard>=0.23' \
'httpx>=0.28'
uv add --dev 'pytest>=8.3' 'pytest-asyncio>=0.24' 'pytest-httpx>=0.34' 'ruff>=0.8' 'mypy>=1.13' 'pre-commit>=4.0'
# 4. 시드 자산을 docs/schemas/ 로 복사
mkdir -p docs/schemas
cp -r my-deepagent-seed/schemas/personas docs/schemas/
cp -r my-deepagent-seed/schemas/workflows docs/schemas/
cp -r my-deepagent-seed/schemas/artifacts docs/schemas/
# 5. PoC 코드를 참조 (Step 5/8 구현 시 활용)
# 직접 복사하지 말고 패턴/구조만 참조해 src/my_deepagent/ 아래로 재작성
# 6. plan-v2.0 본문을 docs/plan.md로 저장
# (채팅의 plan v2.0 본문을 통째 복사 + 아래 §10 패치 반영)
plan v2.0 §10 middleware 패턴 정정 (필수)
채팅의 plan v2.0 §10 (DeepAgent Session Wrapper)에 적힌 cost_middleware(run, phase_def) 함수형은 잘못된 패턴입니다. PoC 검증 결과 langchain 1.x의 정확한 패턴은:
from langchain.agents.middleware import AgentMiddleware
class CostMiddleware(AgentMiddleware):
"""Track LLM cost per call. Sub-class pattern (not decorator)."""
def __init__(
self,
tracker: BudgetTracker,
run_id: UUID | None,
persona_name: str,
model_name: str,
) -> None:
super().__init__()
self.tracker = tracker
self.run_id = run_id
self.persona_name = persona_name
self.model_name = model_name
async def awrap_model_call(self, request, handler):
estimated = compute_cost(self.model_name, 1000, 2000) # worst-case estimate
await self.tracker.assert_can_call(self.run_id, self.persona_name, estimated)
response = await handler(request)
usage = getattr(response, "usage_metadata", None) or {}
actual = compute_cost(
self.model_name,
usage.get("input_tokens", 0),
usage.get("output_tokens", 0),
)
await self.tracker.record(self.run_id, self.persona_name, actual)
return response
핵심:
AgentMiddlewaresubclass (decorator 아님)awrap_model_callasync 메서드 오버라이드 (sync 변형 없음)from langchain.agents.middleware import AgentMiddleware(정확한 import)create_deep_agent(..., middleware=[CostMiddleware(tracker, run_id, persona.name, persona.model)])
audit_tool_middleware, safety_middleware, fallback_middleware, phase_artifact_watcher도 동일 패턴(class subclass + async method override)으로 구현. plan v2.0 §10 코드 블록을 위 형식으로 교체.
PoC에서 검증된 핵심 사실
- deepagents 0.6.1: 실제 설치 성공,
create_deep_agentsignature 확인됨 — model/tools/system_prompt/subagents/middleware/checkpointer/interrupt_on/permissions/backend/skills/memory/response_format 등 모두 keyword args - SubAgent는 TypedDict:
name,description,system_prompt필수. dict 그대로 전달 가능 - FilesystemPermission은 dataclass:
operations/paths(절대 경로 강제,../~금지) /mode - LocalShellBackend:
executetool 동작용 backend.inherit_env=False권장 (보안) - OpenRouter 통합 검증:
ChatOpenAI(model="...", api_key="sk-or-...", base_url="https://openrouter.ai/api/v1", max_tokens=...)인스턴스화 성공 - AgentMiddleware: subclass +
awrap_model_callasync 패턴 (위 정정) - BudgetTracker: SQLite WAL +
ON CONFLICT DO UPDATEupsert로 concurrent-safe ledger 가능 (PoC 검증)
v0.1.0 6주 계획 (Step 0 ~ 16)
채팅의 plan v2.0 §25 참조. 각 Step 끝에:
uv run ruff check . && uv run ruff format --check . && uv run mypy --strict . && uv run pytest
모두 PASS → commit → 다음 Step.
모델 위임 (메모리 룰)
- Python 구현 → sonnet 서브에이전트
- 코드 리뷰 → opus 서브에이전트
- 리뷰 지적 수정 → sonnet
- 메인 스레드 (Claude Code, Opus 4.7) 는 오케스트레이션만
다음 액션 (새 머신에서)
- 위 "새 머신 시작 절차" 1~6 실행
- Claude Code 새 세션:
claude - 첫 메시지로 plan v2.0 본문 + 본 README의 §10 정정 패치 + "Step 0부터 진행해" 지시
- Step 0 (스캐폴딩) → Step 1 (core) → ... 순차 진행
- 각 Step에서 sonnet 서브에이전트에 실제 구현 위임 (메인 스레드는 오케스트레이션)