---
ui_doc_type: view
view_id: builds
status: 구현됨
frame: null
source_evidence:
  - type: code
    path: lib/src/features/builds/builds_page.dart
    notes: "BuildsPage, _JobSelected, _JobRow, _BuildRow, _InstallCta"
  - type: docs
    path: README.md
    notes: "Jenkins job/build/artifact 조회 scope"
  - type: user
    path: null
    notes: "agent-ui 생성 요청"
regions:
  - builds.connection-state
  - builds.job-search
  - builds.job-list
  - builds.build-search
  - builds.build-list
  - builds.install-cta
---

# Builds

View ID: `builds`

Frame:
- 없음

Status: `구현됨`

## Source Evidence

| Type | Path | Notes |
|------|------|-------|
| code | `lib/src/features/builds/builds_page.dart` | `BuildsPage`, `_JobSelected`, `_JobRow`, `_BuildRow`, `_InstallCta` |
| docs | `README.md` | Jenkins job/build/artifact 조회 scope |
| user | 없음 | agent-ui 생성 요청 |

## Purpose

Jenkins job을 검색하고 build 목록에서 APK artifact를 골라 download/stage한 뒤 디바이스 설치 흐름으로 넘긴다.

## Primary Users

- 특정 Jenkins build artifact를 Mac에 내려받아 Android device에 설치하려는 개발자 또는 QA 담당자

## Primary Tasks

- Jenkins job을 검색하고 선택한다.
- 선택한 job의 build를 검색하고 선택한다.
- APK artifact를 다운로드하거나 설치 handoff를 시작한다.

## Information Priority

1. Jenkins credential/connection 상태 또는 job/build 목록
2. build result, branch/flavor/requestedBy/artifact metadata
3. selected build의 download/install CTA 상태

## Regions

| Region ID | Purpose | Component | Priority | Notes |
|-----------|---------|-----------|----------|-------|
| `builds.connection-state` | credential 없음, 재로그인, 네트워크/서버 실패, 권한 없음 상태 표시 | 없음 | high | `_JobStatus`, `_BuildStatus` |
| `builds.job-search` | Jenkins job 검색 입력 | `job-list` | high | `job-search-field` |
| `builds.job-list` | job/folder 목록과 selection affordance | `job-list` | high | `_JobRow` |
| `builds.build-search` | 선택 job 안의 build 검색 입력 | `build-row` | medium | `build-search-field` |
| `builds.build-list` | build row 목록과 선택 상태 표시 | `build-row` | high | `_BuildRow`, `_StateBadge` |
| `builds.install-cta` | APK download/progress/retry/install handoff | `install-cta` | high | `_InstallCta` |

## Actions

| Action ID | Trigger | Result | Guard |
|-----------|---------|--------|-------|
| `builds.filter-jobs` | Job 검색 입력 변경 | job list를 name/fullName/url 기준으로 필터링 | job loader loaded |
| `builds.select-job` | job row 클릭 | build list mode로 전환 | job 선택 가능 |
| `builds.back-to-jobs` | 목록으로 icon button | job selector mode로 복귀 | 선택 job 있음 |
| `builds.filter-builds` | Build 검색 입력 변경 | build list를 metadata 기준으로 필터링 | build loader loaded |
| `builds.select-build` | build row 클릭 | selected build와 install CTA 표시 | APK artifact 있음 |
| `builds.download-artifact` | 다운로드 button | artifact download/stage 진행률 표시 | downloader/stager 있음 |
| `builds.cancel-download` | 취소 button | download를 취소 상태로 전환 | downloading |
| `builds.retry-download` | 재시도 button | failed download를 다시 시작 | failed |
| `builds.request-install` | 설치 button | pending install을 shell로 전달하고 devices로 이동 | staged APK 있음 |

## States

- loading: job/build loader 실행 중 `CircularProgressIndicator`를 표시한다.
- empty: 접근 가능한 job 없음, APK artifact 없음, 검색 결과 없음.
- error: Jenkins 조회 실패, download 실패, 네트워크/서버 실패.
- permission-denied: Jenkins 인증 필요, 재로그인 필요, job/build 접근 권한 없음.

## Open Questions

- 없음

## Decision History

- 2026-06-25: Jenkins job/build 탐색과 install CTA를 `builds` view로 기록했다.
