Files
chungyeong 1fe59d16ca chore: my-deepagent-seed (BudgetTracker PoC + v0.1.0 seed assets)
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>
2026-05-15 19:39:37 +09:00

194 lines
7.9 KiB
Markdown

# 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 압축 후 수동 복사 (가장 단순)
```bash
# 메인 머신에서
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
```bash
# 메인 머신에서 (워크트리에 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)
```bash
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의 정확한 패턴은:
```python
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
```
핵심:
- `AgentMiddleware` **subclass** (decorator 아님)
- `awrap_model_call` async 메서드 오버라이드 (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에서 검증된 핵심 사실
1. **deepagents 0.6.1**: 실제 설치 성공, `create_deep_agent` signature 확인됨 — model/tools/system_prompt/subagents/middleware/checkpointer/interrupt_on/permissions/backend/skills/memory/response_format 등 모두 keyword args
2. **SubAgent는 TypedDict**: `name`, `description`, `system_prompt` 필수. dict 그대로 전달 가능
3. **FilesystemPermission은 dataclass**: `operations` / `paths` (절대 경로 강제, `..`/`~` 금지) / `mode`
4. **LocalShellBackend**: `execute` tool 동작용 backend. `inherit_env=False` 권장 (보안)
5. **OpenRouter 통합 검증**: `ChatOpenAI(model="...", api_key="sk-or-...", base_url="https://openrouter.ai/api/v1", max_tokens=...)` 인스턴스화 성공
6. **AgentMiddleware**: subclass + `awrap_model_call` async 패턴 (위 정정)
7. **BudgetTracker**: SQLite WAL + `ON CONFLICT DO UPDATE` upsert로 concurrent-safe ledger 가능 (PoC 검증)
## v0.1.0 6주 계획 (Step 0 ~ 16)
채팅의 plan v2.0 §25 참조. 각 Step 끝에:
```bash
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. 위 "새 머신 시작 절차" 1~6 실행
2. Claude Code 새 세션: `claude`
3. 첫 메시지로 plan v2.0 본문 + 본 README의 §10 정정 패치 + "Step 0부터 진행해" 지시
4. Step 0 (스캐폴딩) → Step 1 (core) → ... 순차 진행
5. 각 Step에서 sonnet 서브에이전트에 실제 구현 위임 (메인 스레드는 오케스트레이션)