feat(my-deepagent): v0.3 PR #9 — workflow optionization + user dir wiring

Workflow engine 을 주력에서 "옵션" 으로 격하: 사용자가 명시적
`/workflow <name>` 호출 시만 활성.  대신 `<data_dir>/personas/` 와
`<data_dir>/workflows/` 에 YAML 파일을 떨궈 자신만의 persona·workflow 를
등록할 수 있게 함 (seed override 가능).

핵심 동작:
- `ensure_user_dirs_initialized(config)` — 두 사용자 디렉터리 `mkdir -p`,
  idempotent.  매 REPL 시작 시 호출.
- `load_combined_personas(config, seed_dir)` — seed (strict) + user
  (best-effort per-file skip) merge.  Dedupe key `(name, version)`,
  user-overrides-seed.  Broken user YAML 1개 가 REPL 죽이지 못함.
- `load_combined_workflows(config, seed_dir)` — workflow 도 동일.

데이터·라이브러리:
- `user_dirs.py` (신규): `user_personas_dir`, `user_workflows_dir`,
  `ensure_user_dirs_initialized`, `load_combined_personas`,
  `load_combined_workflows`, `_safe_load_personas`, `_safe_load_workflows`.

REPL 통합 (`cli/interactive.py`):
- `InteractiveSession(..., workflows=...)` 시그니처 확장.
- `_interactive_loop_async` 가 user dir bootstrap + combined load 사용.
- 신규 슬래시 4개:
  - `/personas` — 로드된 persona 목록 (현재 활성 표시)
  - `/workflows` — 로드된 workflow 템플릿 목록 (phase/role 개수, 파일명)
  - `/workflow <name>` — `mydeepagent run` 명령 안내 (현재 백그라운드 invoke
    는 안내 메시지만; 실제 kick-off 는 별도 PR 또는 `mydeepagent run` CLI)
  - `/binding show` — 각 workflow 의 role 별 required_capabilities 표시
- `_register_workflow_slash` 의 복잡도(C901) 회피를 위해 print 헬퍼
  (`_print_personas` 등) 를 module-level 로 추출.

테스트 (`tests/integration/test_user_dirs.py`, 10 케이스):
- 부트스트랩 idempotency
- persona seed-only / seed+user / user-overrides-seed / malformed-user-skip
- workflow 동일 4종
- 빈 user 디렉터리 처리

게이트:
- ruff check / format --check / mypy: PASS
- pytest -q --ignore=tests/integration/test_e2e_workflow.py
  --ignore=tests/integration/test_openrouter_smoke.py: 685 passed (10 신규 포함)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
chungyeong
2026-05-17 21:11:19 +09:00
parent e326c07dcb
commit 361d6d7636
4 changed files with 465 additions and 2 deletions

View File

@@ -2,6 +2,36 @@
## [Unreleased]
### Added
- **v0.3 PR #9 — Workflow 옵션화 + user 디렉터리 wiring**. Workflow engine 은
주력이 아니라 "옵션" 으로 격하 (사용자가 명시적 `/workflow <name>` 호출 시만
활성). 대신 사용자가 `<data_dir>/personas/``<data_dir>/workflows/`
YAML 파일을 떨궈 자신만의 persona·workflow 를 등록할 수 있게 함.
- `user_dirs.py` (신규):
- `user_personas_dir(config)`, `user_workflows_dir(config)` — 경로 헬퍼.
- `ensure_user_dirs_initialized(config)``mkdir -p`, idempotent.
- `load_combined_personas(config, seed_dir)` — seed (strict) + user
(best-effort per-file skip on malformed) merge. Dedupe key
`(name, version)`, user-overrides-seed. Broken user YAML 1개 가 REPL
을 죽이지 못함.
- `load_combined_workflows(config, seed_dir)` — workflow 도 동일.
- `cli/interactive.py`:
- `InteractiveSession(..., workflows=...)` 시그니처 확장 — 세션은 로드된
workflow 리스트를 기억.
- `_interactive_loop_async``ensure_user_dirs_initialized` 호출 +
`load_combined_personas` / `load_combined_workflows` 사용.
- 신규 슬래시 4개:
- `/personas` — 모든 로드된 persona 목록 (현재 활성 표시)
- `/workflows` — 모든 로드된 workflow 템플릿 목록 (phase/role 개수, 파일명)
- `/workflow <name[@version]>``mydeepagent run` 명령으로 진행하라는
안내 (실제 백그라운드 invoke 은 별도 PR — 현재는 안내만 제공)
- `/binding show` — 각 workflow 의 role 별 required_capabilities 표시
- `tests/integration/test_user_dirs.py` (신규, 10 케이스):
- 부트스트랩 idempotency
- seed-only / seed+user / user-overrides-seed / malformed-user-skip (persona)
- workflow 동일 4종
- 빈 user 디렉터리 처리
### Added
- **v0.3 PR #8 — Conversation-centric Web GUI (`/conversation.html`)**.
Workflow run 페이지는 archive 로 격하; 사용자가 처음 보는 화면은 chat-style