feat(my-deepagent): v0.4 — workflow generator UI + hot-reload + UX polish
브라우저에서 YAML 안 쓰고도 새 워크플로우 템플릿 만들기 + 즉시 등록. + /new.html / index.html / new-workflow.html / runs.html / conversation.html 의 nav·copy·empty-state 정비. A. /new.html UX: - 제목 "새 Run" → "워크플로우 실행 (고급)" - 상단 info-box: "자유 대화는 여기가 아닙니다 → 메인 페이지" - 모든 필드에 한 줄 hint - Persona 오버라이드 <details> 접힘 B. Nav 재정렬 (5 페이지): - "대화" nav-primary, 나머지 nav-secondary (작고 dim) C. 메인 안내 + CSS: - 메인 / 에 "👋 my-deepagent" info-box 추가 - .info-box / .nav-primary / .nav-secondary / .wf-* 신규 스타일 D. Workflow hot-reload: - api/deps.py get_workflows 가 매 요청 mtime 튜플 검사 후 변경 시 reload - lifespan 도 user dir 포함하도록 _load_workflows_combined E. Workflow generator: - POST /api/workflows: CreateWorkflowRequest → WorkflowTemplate validate → <data_dir>/workflows/<name>@<version>.yaml 저장. 중복 409, validation 422. - static/new-workflow.html: 기본 정보 / Roles / Phases / YAML preview - app.js bootstrapWorkflowGenerator: capability chip 토글, role select 동적, 실시간 YAML preview, XSS 정책 유지 테스트 (test_workflow_generator.py, 7 신규): - 페이지 200 + 마크업 - POST happy / 422 (empty roles) / 422 (unknown role) / 409 (dup) - GET hot-reload after POST - GET hot-reload after external file drop 게이트: - ruff / format / mypy: PASS (142 source files) - pytest -q --ignore=tests/integration/test_e2e_workflow.py --ignore=tests/integration/test_openrouter_smoke.py: 709 passed (+7 신규) - 라이브 smoke: / / new.html / new-workflow.html 모두 200, screenshot OK Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -2,6 +2,57 @@
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
### Added
|
||||
- **v0.4 — Workflow generator UI + hot-reload + UX polish**. 사용자가 직접
|
||||
YAML 을 작성하지 않고도 브라우저에서 새 워크플로우 템플릿을 만들고 즉시
|
||||
실행할 수 있도록 함. 메인 페이지 / new.html / runs.html / new-workflow.html
|
||||
의 nav · copy · empty-state 도 동시에 정비.
|
||||
- **A — `/new.html` UX 패치** (HTML/CSS only):
|
||||
- 제목 "새 Run 시작" → "워크플로우 실행 (고급 기능)".
|
||||
- 상단 `info-box`: "자유 대화는 여기가 아닙니다 → 메인 페이지" 안내 +
|
||||
"+ 템플릿 만들기" 링크.
|
||||
- 모든 필드에 한 줄 hint (예: `repo 절대경로 — 작업할 git 저장소 위치`).
|
||||
- Persona 오버라이드를 `<details>` 접힘 상태로 → 첫 사용자가 압도되지
|
||||
않도록.
|
||||
- **B — nav 재정렬** (`/`, `/runs.html`, `/new.html`, `/run.html`,
|
||||
`/conversation.html`):
|
||||
- "대화" 가 `nav-primary` (큰 폰트 + 진한 색).
|
||||
- "Runs" / "워크플로우 실행" / "+ 템플릿 만들기" 는 `nav-secondary`
|
||||
(작은 폰트 + 65% opacity, hover 시 100%).
|
||||
- **C — 메인 페이지 안내** + CSS:
|
||||
- 메인 `/` 에 `info-box` 추가 ("👋 my-deepagent — OpenRouter 가성비 모델로
|
||||
돌아가는 Claude Code 스타일 멀티턴 에이전트").
|
||||
- `style.css` 에 `.info-box`, `.nav-primary`/`.nav-secondary`,
|
||||
`.wf-row-card`, `.wf-chip` 등 신규 스타일 추가.
|
||||
- **D — Workflow hot-reload**:
|
||||
- `api/deps.py` 의 `get_workflows` 가 매 요청 시
|
||||
`_workflow_dir_signature(config)` (seed + user 디렉터리의 mtime 튜플)
|
||||
을 계산해 cached signature 와 다르면 `load_combined_workflows` 재호출.
|
||||
파일 watcher / inotify 없이 stat 만으로 충분 (디렉터리가 작음).
|
||||
- lifespan 의 `_load_seed_workflows` 도 `_load_workflows_combined` 로
|
||||
교체해 user dir 첫 부팅 시도 자동 로드.
|
||||
- **E — Workflow generator UI**:
|
||||
- **API**: `POST /api/workflows` 신설. Body = `CreateWorkflowRequest`
|
||||
pydantic (name / version / description / roles / phases / default_gates /
|
||||
max_total_budget_usd). `WorkflowTemplate.model_validate` 로 strict
|
||||
검증 → 실패 시 422 (loc:msg 포맷으로 평탄화). 성공 시
|
||||
`<data_dir>/workflows/<name>@<version>.yaml` 에 YAML 저장 (`yaml.safe_dump
|
||||
allow_unicode=True, sort_keys=False`). 중복 (name, version) 은 409.
|
||||
- **HTML**: `static/new-workflow.html` (신규). 기본 정보 → Roles →
|
||||
Phases → YAML 미리보기 → 저장 버튼.
|
||||
- **JS**: `app.js` 에 `bootstrapWorkflowGenerator` 와 `WF_STATE` 추가.
|
||||
Role 별 capability 를 chip 형태로 클릭 토글, Phase 의 role 셀렉트는
|
||||
현재 Role 목록에서 동적으로 생성. 실시간 YAML preview. XSS 정책
|
||||
유지 (모든 사용자 입력은 textContent).
|
||||
- **신규 테스트** (`tests/integration/test_workflow_generator.py`, 7 케이스):
|
||||
- `/new-workflow.html` 200 + 마크업
|
||||
- POST happy path → yaml 파일 영속 + path / name / version 검증
|
||||
- POST roles=[] → 422
|
||||
- POST phase.role 미존재 → 422 + 메시지에 role id 포함
|
||||
- POST duplicate (name, version) → 409
|
||||
- GET hot-reload: POST 후 새 항목이 GET 응답에 등장
|
||||
- GET hot-reload: 외부에서 YAML 파일 직접 떨궈도 mtime 으로 감지
|
||||
|
||||
### Changed
|
||||
- **v0.3 plan-conformance fixes** — 1차 구현 후 plan-v0.3 와 대조해 발견된 18건
|
||||
누락/명세 위반을 보강. 자기 리뷰 3 라운드 (누락·미완 / 오류·엣지케이스 /
|
||||
|
||||
Reference in New Issue
Block a user