diff --git a/agent-ops/rules/project/domain/testing/rules.md b/agent-ops/rules/project/domain/testing/rules.md index c1a9b5a..7e1ab6f 100644 --- a/agent-ops/rules/project/domain/testing/rules.md +++ b/agent-ops/rules/project/domain/testing/rules.md @@ -30,6 +30,7 @@ - 사용자 실행 파이프라인에는 `bin/**`, `apps/*/cmd/**`, `apps/*/internal/bootstrap/**`, edge-node transport/service/registry, adapter 실행/stream/cancel/status 경로, `configs/**`, `packages/config/**`, 관련 protobuf 계약 변경이 포함된다. - 기본 E2E smoke는 mock adapter와 임시 설정/포트를 사용해 외부 CLI 의존성 없이 수행한다. - E2E smoke에서는 최소한 node 등록, `/nodes` 확인, console 메시지 전송, delta/message 출력, complete event를 확인한다. +- 상세 수행 절차와 기능별 체크리스트는 `agent-ops/skills/project/e2e-smoke/SKILL.md`를 따른다. - `make test-e2e` 같은 고정 명령이 생기면 그 명령을 우선 사용한다. 아직 고정 명령이 없으면 동일한 내용을 수동 smoke 절차로 검증하거나, 실행하지 못한 이유를 최종 보고에 명시한다. - 실제 외부 CLI profile 검증은 사용자가 명시했거나 환경이 준비된 경우에만 opt-in으로 수행한다. - 작업 최종 보고에는 실행한 테스트 명령과 E2E smoke 수행 여부를 명시한다. 수행하지 못한 필수 검증은 이유와 남은 위험을 함께 적는다. diff --git a/agent-ops/rules/project/rules.md b/agent-ops/rules/project/rules.md index 1130890..57da18a 100644 --- a/agent-ops/rules/project/rules.md +++ b/agent-ops/rules/project/rules.md @@ -76,5 +76,5 @@ ## 스킬 라우팅 -- 현재 프로젝트 전용 skill은 만들지 않는다. +- 사용자 실행 파이프라인 검증, E2E smoke, `bin/edge.sh`/`bin/node.sh` 통합 테스트: `agent-ops/skills/project/e2e-smoke/SKILL.md` - 반복 작업이 확인되면 `agent-ops/skills/project//SKILL.md`를 생성하고 이 표에 등록한다. diff --git a/agent-ops/skills/project/e2e-smoke/SKILL.md b/agent-ops/skills/project/e2e-smoke/SKILL.md new file mode 100644 index 0000000..083272e --- /dev/null +++ b/agent-ops/skills/project/e2e-smoke/SKILL.md @@ -0,0 +1,114 @@ +--- +name: e2e-smoke +version: 1.0.0 +description: bin/edge.sh와 bin/node.sh 기반 사용자 실행 파이프라인 E2E smoke 및 CLI opt-in 통합 검증 절차 +--- + +# e2e-smoke + +## 목적 + +사용자 실행 방식에 가까운 `bin/edge.sh` + `bin/node.sh` 경로로 edge-node 실행 파이프라인을 검증한다. 기본 검증은 mock adapter 기반으로 외부 CLI 의존성 없이 수행하고, 실제 CLI profile 검증은 opt-in으로 분리한다. + +## 언제 호출할지 + +- 사용자 실행 파이프라인에 닿는 작업을 완료한 뒤 검증 단계에 들어갈 때 +- `bin/**`, `apps/*/cmd/**`, `apps/*/internal/bootstrap/**`, edge-node transport/service/registry, adapter 실행/stream/cancel/status 경로를 변경했을 때 +- `configs/**`, `packages/config/**`, 관련 protobuf 계약 변경이 edge-node 실행 방식에 영향을 줄 때 +- `make test-e2e` 또는 E2E smoke 스크립트를 만들거나 갱신할 때 + +## 입력 + +- `scope`: 검증할 변경 범위와 영향을 받은 도메인 (필수) +- `mode`: `mock` 또는 `real-cli` 또는 `both` (선택, 기본값: `mock`) +- `profiles`: opt-in으로 검증할 CLI profile 목록. 예: `claude`, `gemini`, `codex`, `opencode`, `cline-dgx` (선택) +- `config_strategy`: 임시 config 파일 또는 환경 변수 override 방식 (선택) + +## 먼저 확인할 것 + +- [ ] `agent-ops/rules/project/domain/testing/rules.md`를 읽고 이번 작업이 필수 E2E smoke 대상인지 확인한다. +- [ ] `bin/edge.sh`와 `bin/node.sh`가 현재 사용자 실행 entrypoint인지 확인한다. +- [ ] `make test-e2e` 같은 고정 명령이 이미 있으면 그 명령을 우선 사용한다. +- [ ] 고정 명령이 없으면 임시 config와 랜덤 포트로 수동 smoke 절차를 구성한다. +- [ ] real CLI 검증을 할 경우 실제 command 경로, 로그인/계정 상태, provider 설정, workspace 권한이 준비되어 있는지 확인한다. + +## 실행 절차 + +1. **검증 범위 결정** + - 변경 파일이 사용자 실행 파이프라인에 닿는지 확인한다. + - 필수 검증은 `go test ./...` 또는 대상 패키지 테스트와 mock E2E smoke이다. + - real CLI 검증은 사용자가 명시했거나 환경이 준비된 경우에만 opt-in으로 추가한다. + +2. **기본 E2E smoke 준비** + - 기본 `configs/*.yaml`을 오염시키지 말고 임시 edge/node config 또는 환경 변수 override를 사용한다. + - edge listen 주소와 node edge 주소는 충돌을 피하기 위해 임시 포트를 사용한다. + - edge console target은 외부 CLI가 아닌 mock adapter target으로 구성한다. + +3. **기본 E2E smoke 실행** + - `bin/edge.sh`와 `bin/node.sh`를 실제 entrypoint로 실행한다. + - node가 edge에 register되고 console `/nodes` 출력에 node ID와 alias가 표시되는지 확인한다. + - mock adapter 대상으로 같은 session에서 메시지를 최소 2회 전송한다. + - 두 요청 모두 `[edge] sent`, `[node-*-event] start`, `[node-*-message]`, `[node-*-event] complete` 출력이 생기는지 확인한다. + - 두 번째 메시지가 첫 번째 메시지 이후에도 같은 edge-node 연결에서 정상 처리되는지 확인한다. + - background off 기본값에서 foreground 응답 대기가 complete event까지 이어지는지 확인한다. + - `/session ` 변경 후 메시지를 보내고 출력의 session 값과 node event/message 흐름이 유지되는지 확인한다. + - `/terminate-session` 명령이 성공 출력 또는 mock adapter의 명확한 unsupported/error 출력을 내는지 확인한다. + +4. **edge console / transport 항목 확인** + - node 연결/해제 lifecycle event가 run event와 분리되어 출력되는지 확인한다. + - `RunEvent`의 `start`, `delta`, `complete`, `error`, `cancelled`가 console 출력 형식에 맞게 라우팅되는지 확인한다. + - node가 1대일 때는 node 선택 없이 single-node fallback으로 실행되는지 확인한다. + - node가 2대 이상인 smoke를 수행한다면 `/node ` 선택 없이는 ambiguous error가 출력되는지 확인한다. + - `/node ` 선택 후 선택된 node로 run request가 전달되고 출력 prefix가 해당 node label을 사용하는지 확인한다. + +5. **CLI profile opt-in 검증** + - real CLI 환경이 준비된 경우에만 수행한다. + - `claude`, `gemini`, `codex`, `opencode`, `cline-dgx` 또는 `cline-m1` 중 요청된 profile을 대상으로 같은 session 메시지를 최소 2회 주고받는다. + - 각 profile에서 start, delta-or-message, complete 출력이 모두 생기는지 확인한다. + - `opencode`는 SSE 기반 delta/message와 complete 출력이 생기는지 확인한다. + - `cline` 계열은 JSON stream delta/message와 complete 출력이 생기는지 확인한다. + +6. **usage status opt-in 검증** + - `/status`로 `codex`, `claude`, `gemini` 사용량을 조회한다. + - `[edge] sent command=status`와 `[node-*-status]`가 출력되는지 확인한다. + - `codex`와 `claude`는 daily/weekly limit 또는 raw fallback 출력이 표시되는지 확인한다. + - `gemini`는 quota metadata 또는 model usage 출력이 표시되는지 확인한다. + - `opencode`와 `cline`처럼 status checker가 아직 없는 profile은 조용히 실패하지 않고 명확한 unsupported error를 출력하는지 확인한다. + - parsed limit이 있으면 label/reset 정보를 포함하고, parsed limit이 없으면 raw output 일부를 보여주는지 확인한다. + +7. **cancel / session lifecycle 검증** + - 변경 범위가 cancel, timeout, persistent session에 닿는 경우 수행한다. + - foreground run 중 cancel 요청이 전달되면 cancelled event가 출력되고 node store 상태가 cancelled로 마감되는지 확인한다. + - persistent CLI session에서 `/terminate-session` 후 같은 session 재사용 시 새 worker 생성 또는 `REQUIRE_EXISTING` 실패가 의도대로 동작하는지 확인한다. + - timeout 발생 시 timeout message와 error/cancelled 상태가 사용자 출력에 드러나는지 확인한다. + +8. **결과 보고** + - 실행한 Go 테스트 명령과 결과를 적는다. + - 실행한 E2E smoke 방식, 사용한 config 전략, 검증한 profile을 적는다. + - 필수 검증을 실행하지 못했다면 이유와 남은 위험을 명시한다. + +## 실행 결과 검증 + +- [ ] 일반 Go 테스트 또는 대상 패키지 테스트 결과가 보고되었는가 +- [ ] 사용자 실행 파이프라인 변경 시 mock E2E smoke 수행 여부가 보고되었는가 +- [ ] node register, `/nodes`, 메시지 최소 2회, event/message/complete 출력 확인 여부가 보고되었는가 +- [ ] real CLI opt-in을 수행했다면 profile별 메시지 왕복과 `/status` 결과가 보고되었는가 +- 검증 실패 시: 실패한 항목, 관련 로그/출력 요약, 남은 위험을 최종 보고에 포함한다. + +## 출력 형식 + +```text +검증 결과 +- Go 테스트: <명령> — <통과|실패|미실행 사유> +- E2E smoke: — <통과|실패|미실행 사유> +- 확인 항목: node register, /nodes, message x2, event/message/complete, <추가 항목> +- Real CLI profile: +- 남은 위험: <없음 또는 내용> +``` + +## 금지 사항 + +- 사용자 실행 파이프라인에 닿는 변경을 하고 유닛/패키지 테스트만으로 완료 처리하지 않는다. +- 기본 E2E smoke를 외부 CLI 설치, 로그인, 네트워크 계정 상태에 의존하게 만들지 않는다. +- E2E smoke를 위해 기본 `configs/*.yaml`을 임시값으로 오염시키지 않는다. +- 필수 검증을 실행하지 못했는데 조용히 생략하지 않는다.