---
ui_doc_type: view
view_id: app-shell
status: 구현됨
frame: null
source_evidence:
  - type: code
    path: lib/src/features/app_shell.dart
    notes: "AppSokShell, _BrandHeader, _TopBar, _StatusPill, _pages"
  - type: docs
    path: README.md
    notes: "Current Scaffold feature 목록"
  - type: user
    path: null
    notes: "agent-ui 생성 요청"
regions:
  - app-shell.nav
  - app-shell.top-bar
  - app-shell.content
---

# App Shell

View ID: `app-shell`

Frame:
- 없음

Status: `구현됨`

## Source Evidence

| Type | Path | Notes |
|------|------|-------|
| code | `lib/src/features/app_shell.dart` | `AppSokShell`, `_BrandHeader`, `_TopBar`, `_StatusPill`, `_pages` |
| docs | `README.md` | Current Scaffold feature 목록 |
| user | 없음 | agent-ui 생성 요청 |

## Purpose

AppSok의 primary navigation과 현재 feature page를 호스팅한다. shell은 pending install handoff, console target device, install result 같은 cross-page 상태를 소유한다.

## Primary Users

- Android artifact를 Mac에서 설치하고 확인하는 개발자 또는 QA 담당자

## Primary Tasks

- 빌드, 디바이스, 콘솔, 설정 화면으로 전환한다.
- Jenkins/ADB 상태를 top bar에서 확인한다.
- 빌드 화면에서 준비한 APK를 디바이스 화면으로 넘긴다.

## Information Priority

1. 현재 선택된 feature page의 제목과 업무 영역
2. NavigationRail의 AppSok brand 및 주요 화면 목록
3. Jenkins/ADB 상태 pill

## Regions

| Region ID | Purpose | Component | Priority | Notes |
|-----------|---------|-----------|----------|-------|
| `app-shell.nav` | AppSok brand와 네 개의 primary destination 제공 | `shell-navigation` | high | `빌드`, `디바이스`, `콘솔`, `설정` |
| `app-shell.top-bar` | 현재 page title과 Jenkins/ADB status 표시 | `status-pill` | medium | 현재 구현은 대기 상태 pill 두 개를 고정 표시 |
| `app-shell.content` | 선택된 feature page 렌더링 | 없음 | high | `_pages[_selectedIndex].child` |

## Actions

| Action ID | Trigger | Result | Guard |
|-----------|---------|--------|-------|
| `app-shell.select-page` | NavigationRail destination 선택 | 선택 page를 content region에 표시 | 없음 |
| `app-shell.handoff-install` | build artifact 설치 요청 | pending install 상태를 만들고 `devices`로 이동 | staged APK가 있음 |
| `app-shell.open-console` | device tile의 logcat action | console target device를 설정하고 `console`로 이동 | device가 ready |

## States

- loading: child page가 자체 loading state를 표시한다.
- empty: child page가 자체 empty state를 표시한다.
- error: child page가 자체 error state를 표시한다.
- permission-denied: Jenkins credential 문제는 `builds`와 `settings`에서 표시한다.

## Open Questions

- 없음

## Decision History

- 2026-06-25: `AppSokShell` 구현을 shell view 기준으로 기록했다.
