feat: control-plane jenkins-aligned layout pass - phase, agent-ui definitions, and related artifacts
This commit is contained in:
parent
ba91d4efe3
commit
a86f86e0ea
31 changed files with 2172 additions and 65 deletions
|
|
@ -33,6 +33,9 @@
|
||||||
- [진행중] Control Plane 운영 보안·감사 표면
|
- [진행중] Control Plane 운영 보안·감사 표면
|
||||||
- 경로: `agent-roadmap/phase/control-plane-product-surface/milestones/control-plane-security-audit-surface.md`
|
- 경로: `agent-roadmap/phase/control-plane-product-surface/milestones/control-plane-security-audit-surface.md`
|
||||||
- 요약: write action 표면 이후 필요한 인증/권한, 감사 로그, 민감 정보 마스킹, UI 노출 경계를 SDD와 구현 가능한 Task로 구체화한다.
|
- 요약: write action 표면 이후 필요한 인증/권한, 감사 로그, 민감 정보 마스킹, UI 노출 경계를 SDD와 구현 가능한 Task로 구체화한다.
|
||||||
|
- [계획] Control Plane Jenkins 정렬 레이아웃 패스
|
||||||
|
- 경로: `agent-roadmap/phase/control-plane-product-surface/milestones/control-plane-jenkins-aligned-layout-pass.md`
|
||||||
|
- 요약: Jenkins 최신 weekly/LTS와 `2.516+` refreshed UI, Pipeline Graph View를 러프 참조로 삼아 OTO console shell, navigation, 주요 운영 view의 레이아웃을 구현에 반영한다.
|
||||||
|
|
||||||
## Phase 경계
|
## Phase 경계
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,67 @@
|
||||||
|
# Milestone: Control Plane Jenkins 정렬 레이아웃 패스
|
||||||
|
|
||||||
|
## 위치
|
||||||
|
|
||||||
|
- Roadmap: `agent-roadmap/ROADMAP.md`
|
||||||
|
- Phase: `agent-roadmap/phase/control-plane-product-surface/PHASE.md`
|
||||||
|
|
||||||
|
## 목표
|
||||||
|
|
||||||
|
Jenkins 최신 weekly/LTS, `2.516+` refreshed UI, Pipeline Graph View를 pixel parity가 아닌 운영 화면 정보 구조와 레이아웃 밀도 참조로 삼아 OTO Control Plane Flutter console의 shell, navigation, 주요 view layout을 재정렬한다.
|
||||||
|
완료 후 agent-ui의 Jenkins 정렬 `계획` view/component는 코드 evidence와 검증 결과를 바탕으로 `구현됨`으로 되돌릴 수 있어야 한다.
|
||||||
|
|
||||||
|
## 상태
|
||||||
|
|
||||||
|
[계획]
|
||||||
|
|
||||||
|
## 구현 잠금
|
||||||
|
|
||||||
|
- 상태: 해제
|
||||||
|
- SDD: 불필요
|
||||||
|
- SDD 사유: 현재 범위는 Flutter UI layout 재배치와 agent-ui/code 동기화이며 API/proto/config/schema, 외부 provider, 감사 source of truth, durable persistence를 바꾸지 않는다.
|
||||||
|
- 결정 필요: 없음
|
||||||
|
|
||||||
|
## 범위
|
||||||
|
|
||||||
|
- `agent-ui/definition/**`에 정리된 Jenkins reference baseline과 Target Layout Delta를 구현 입력으로 삼는다.
|
||||||
|
- `packages/flutter/oto_console`의 shell, navigation, overview, runners, pipelines, executions, artifacts, settings layout을 재정렬한다.
|
||||||
|
- `apps/client` host wiring은 기존 package boundary를 유지하며 필요한 mount/config 조정만 허용한다.
|
||||||
|
- Pipeline Graph View의 stage graph는 OTO stage 데이터가 없으면 placeholder/summary region까지만 반영한다.
|
||||||
|
- agent-shell view는 Jenkins parity 대상이 아니므로 navigation consistency만 확인한다.
|
||||||
|
|
||||||
|
## 기능
|
||||||
|
|
||||||
|
### Epic: [layout-pass] Jenkins 정렬 레이아웃 구현
|
||||||
|
|
||||||
|
Jenkins 참조 기준선을 OTO console 코드에 구현하고 agent-ui 상태를 검증 근거로 되돌린다.
|
||||||
|
|
||||||
|
- [ ] [layout-definition] Jenkins reference baseline, view/component Target Layout Delta, status=`계획` 정합성을 agent-ui에 고정한다. 검증: `validate-agent-ui` 결과가 PASS이고, 대상 view/component가 코드 반영 전 `계획` 상태로 남아 있다.
|
||||||
|
- [ ] [shell-layout] `console-shell`과 `console-rail`을 Jenkins refreshed header/action context와 운영 destination grouping에 맞춰 재배치한다. 검증: Flutter 정적 분석 또는 widget test, shell/navigation smoke, `validate-agent-ui`.
|
||||||
|
- [ ] [view-layout] `overview`, `runners`, `pipelines`, `executions`, `artifacts`, `settings`를 Target Layout Delta에 맞춰 재배치한다. 검증: 각 view의 주요 region이 코드에 남고 empty/error/data 상태가 깨지지 않는다.
|
||||||
|
- [ ] [component-layout] `record-list`, `state-panel`, `status-badge`, `action-feedback`, `execution-action-toolbar`, `log-preview`, `artifact-list`, create/update form의 reusable layout pattern을 정리한다. 검증: shared component 또는 surface별 widget 코드가 agent-ui component rules와 충돌하지 않는다.
|
||||||
|
- [ ] [agent-ui-completion] 코드 반영과 검증이 끝난 view/component의 `status`를 `구현됨`으로 되돌리고 code evidence를 유지한다. 검증: 최종 `validate-agent-ui` PASS와 code-review의 `Agent UI Completion` 근거가 남아 있다.
|
||||||
|
|
||||||
|
## 완료 리뷰
|
||||||
|
|
||||||
|
- 상태: 없음
|
||||||
|
- 요청일: 없음
|
||||||
|
- 완료 근거: 없음
|
||||||
|
- 검토 항목:
|
||||||
|
- agent-ui 상태 반영: 대기
|
||||||
|
- 리뷰 코멘트: 없음
|
||||||
|
|
||||||
|
## 범위 제외
|
||||||
|
|
||||||
|
- Jenkins pixel parity, exact spacing/color token 복제는 하지 않는다.
|
||||||
|
- Jenkins plugin ecosystem 전체, Blue Ocean 신규 기준화, Jenkins folder/multibranch taxonomy 구현은 제외한다.
|
||||||
|
- Core API, proto, auth/audit source of truth, durable artifact storage 변경은 제외한다.
|
||||||
|
- production identity provider나 조직/테넌트 모델은 제외한다.
|
||||||
|
|
||||||
|
## 작업 컨텍스트
|
||||||
|
|
||||||
|
- 관련 agent-ui: `agent-ui/definition/index.md`, `agent-ui/definition/views/**`, `agent-ui/definition/components/**`, `agent-ui/frame/index.md`
|
||||||
|
- 관련 코드: `packages/flutter/oto_console/lib/src/**`, `apps/client/lib/src/app/oto_client_app.dart`
|
||||||
|
- 표준선: 기존 `OtoConsoleSection` enum과 package boundary를 우선 유지한다.
|
||||||
|
- 표준선: Jenkins reference는 정보 구조와 운영 밀도 기준이며, exact visual clone이 아니다.
|
||||||
|
- sync-agent-ui 라우팅: `MILESTONE_REQUIRED`
|
||||||
|
- 확인 필요: 없음. 구현 계획은 이 Milestone의 기능 Task와 agent-ui Target Layout Delta를 입력으로 작성한다.
|
||||||
|
|
@ -0,0 +1,201 @@
|
||||||
|
<!-- task=m-control-plane-jenkins-aligned-layout-pass/01_definition_shell_foundation plan=0 tag=LAYOUT -->
|
||||||
|
|
||||||
|
# Code Review Reference - LAYOUT
|
||||||
|
|
||||||
|
> **[IMPLEMENTING AGENT — READ FIRST] Filling in this file is the mandatory final step of implementation.**
|
||||||
|
> The task is NOT complete until every implementation-owned section below is filled in.
|
||||||
|
> Complete the `구현 체크리스트`; the final checklist item is mandatory before saving.
|
||||||
|
> Fill implementation-owned sections, then stop with active files in place and report ready for review.
|
||||||
|
> If implementation is blocked by a selected Milestone `구현 잠금 > 결정 필요` item, fill `사용자 리뷰 요청` with linked evidence and stop with active files in place; code-review decides whether to write `USER_REVIEW.md`. Environment/secret/service blockers, generic scope changes, repeated failures, and evidence gaps that a follow-up agent can close are normal follow-up issues, not user-review blockers by themselves.
|
||||||
|
> Do not ask the user directly, present choices in chat, or call `request_user_input` during implementation; record only Milestone lock decisions in `사용자 리뷰 요청` and stop for code-review.
|
||||||
|
> Finalization (`코드리뷰 결과`, log rename, `complete.log`, archive moves, `코드리뷰 전용 체크리스트`) is review-agent-only, even after compaction/resume.
|
||||||
|
> Follow the ownership table at the bottom of this file for which sections you own.
|
||||||
|
|
||||||
|
## 개요
|
||||||
|
|
||||||
|
date=2026-07-02
|
||||||
|
task=m-control-plane-jenkins-aligned-layout-pass/01_definition_shell_foundation, plan=0, tag=LAYOUT
|
||||||
|
|
||||||
|
## Roadmap Targets
|
||||||
|
|
||||||
|
- Milestone: `agent-roadmap/phase/control-plane-product-surface/milestones/control-plane-jenkins-aligned-layout-pass.md`
|
||||||
|
- Task ids:
|
||||||
|
- `layout-definition`: Jenkins reference baseline, view/component Target Layout Delta, status=`계획` 정합성 고정
|
||||||
|
- `shell-layout`: `console-shell`과 `console-rail`을 Jenkins refreshed header/action context와 운영 destination grouping에 맞춰 재배치
|
||||||
|
- Completion mode: check-on-pass
|
||||||
|
|
||||||
|
## 이 파일을 읽는 리뷰 에이전트에게
|
||||||
|
|
||||||
|
> **[REVIEW AGENT ONLY]** 아래 종결 절차는 코드리뷰 에이전트 전용이다. 구현 에이전트는 이 섹션을 실행하지 않는다.
|
||||||
|
|
||||||
|
각 항목의 구현을 실제 소스 파일과 대조하고, `검증 결과` 섹션의 출력이 코드와 일치하는지 확인하세요.
|
||||||
|
리뷰 완료는 아래 순서까지 끝난 상태를 의미합니다.
|
||||||
|
|
||||||
|
1. 판정을 append한다.
|
||||||
|
2. `CODE_REVIEW-local-G06.md` → `code_review_local_G06_0.log`, `PLAN-local-G06.md` → `plan_local_G06_0.log`로 아카이브한다.
|
||||||
|
3. PASS이면 `complete.log` 작성 후 active task 디렉터리를 `agent-task/archive/YYYY/MM/m-control-plane-jenkins-aligned-layout-pass/01_definition_shell_foundation/`로 이동한다. WARN/FAIL이면 user-review gate를 확인한 뒤 다음 active plan/review 파일 또는 `USER_REVIEW.md`를 작성한다. `USER_REVIEW.md`가 연결된 Milestone 결정으로 완료/PASS 해소되면 code-review가 `USER_REVIEW.md`를 해소 상태로 갱신하고 `complete.log` 작성 후 archive 이동한다.
|
||||||
|
4. PASS이고 task group이 `m-<milestone-slug>`이면 완료 이벤트 메타데이터를 보고한다. roadmap 상태 체크와 `update-roadmap` 호출은 런타임 책임이다.
|
||||||
|
5. 적용 가능한 `코드리뷰 전용 체크리스트` 항목을 최종 `.log` 위치에서 체크한 뒤 보고한다.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 구현 항목별 완료 여부
|
||||||
|
|
||||||
|
| 항목 | 완료 여부 |
|
||||||
|
|------|---------|
|
||||||
|
| [LAYOUT-1] Agent UI Definition Baseline Guard | [ ] |
|
||||||
|
| [LAYOUT-2] Shell Page Frame | [ ] |
|
||||||
|
| [LAYOUT-3] Rail Grouping And Fallback Section Surface | [ ] |
|
||||||
|
|
||||||
|
## 구현 체크리스트
|
||||||
|
|
||||||
|
- [ ] agent-ui definition baseline이 `계획` 상태와 source evidence를 유지하는지 검증하고, 깨진 문서 정합성이 있으면 코드 변경 전에 고친다.
|
||||||
|
- [ ] `OtoConsoleShell`에 rail + content만 있던 구조를 current section header/action slot을 담을 수 있는 Jenkins-style page frame으로 재배치한다.
|
||||||
|
- [ ] `_OtoConsoleRail` destination grouping을 overview/workflow/operations/admin 형태로 정리하되 `OtoConsoleSection` enum, tooltip, navigation callback은 유지한다.
|
||||||
|
- [ ] `OtoConsoleSectionSurface`를 settings/runtime summary fallback에 맞게 header, state panel, detail groups로 재정렬하고 기존 fallback 문자열을 유지한다.
|
||||||
|
- [ ] shell/navigation widget tests를 갱신하거나 추가해 Overview, Agent, Settings navigation과 fallback detail 표시를 검증한다.
|
||||||
|
- [ ] 원격 runner preflight와 Flutter analyze/test 계약을 실행하거나, Flutter PATH/source sync 차단이면 실제 출력과 차단 사유를 review stub에 남긴다.
|
||||||
|
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.
|
||||||
|
|
||||||
|
## 코드리뷰 전용 체크리스트
|
||||||
|
|
||||||
|
> **[REVIEW AGENT ONLY]** 이 체크리스트는 코드리뷰 에이전트만 사용한다.
|
||||||
|
> 구현 에이전트는 이 섹션을 수정하거나 체크하지 않는다.
|
||||||
|
|
||||||
|
- [ ] `코드리뷰 결과`에 `PASS`, `WARN`, `FAIL` 중 하나의 판정을 append한다.
|
||||||
|
- [ ] 판정과 `차원별 평가`, Required/Suggested/Nit 분류가 서로 일치한다.
|
||||||
|
- [ ] active `CODE_REVIEW-*-G??.md`를 `code_review_local_G06_0.log`로 아카이브한다.
|
||||||
|
- [ ] active `PLAN-*-G??.md`를 `plan_local_G06_0.log`로 아카이브한다.
|
||||||
|
- [ ] `.gitignore`의 Agent-Ops 관리 block이 `agent-task/**/*.md`와 `agent-task/**/*.log`를 unignore하고 `agent-roadmap/current.md`를 ignore하는지 확인한다.
|
||||||
|
- [ ] PASS이면 `agent-ops/skills/common/code-review/templates/complete-log-template.md` 기준으로 `complete.log`를 작성하고 active `.md` 파일을 남기지 않는다.
|
||||||
|
- [ ] PASS이면 active task 디렉터리 `agent-task/m-control-plane-jenkins-aligned-layout-pass/01_definition_shell_foundation/`를 `agent-task/archive/YYYY/MM/m-control-plane-jenkins-aligned-layout-pass/01_definition_shell_foundation/`로 이동하고 최종 archive 경로에서 이 체크리스트를 갱신한다.
|
||||||
|
- [ ] PASS이고 task group이 `m-<milestone-slug>`이면 런타임이 읽을 완료 이벤트 메타데이터를 보고하고, roadmap 수정이나 `update-roadmap` 직접 호출을 하지 않는다.
|
||||||
|
- [ ] PASS split 작업이면 이동 후 빈 active parent `agent-task/m-control-plane-jenkins-aligned-layout-pass/`를 제거하거나, 남은 sibling/file이 있어 유지했다고 확인한다.
|
||||||
|
- [ ] WARN/FAIL이고 user-review gate가 트리거되지 않았으면 다음 active `PLAN-local-G06.md`와 `CODE_REVIEW-local-G06.md`를 작성하고 `complete.log`를 작성하지 않는다.
|
||||||
|
- [ ] USER_REVIEW이면 `agent-ops/skills/common/code-review/templates/user-review-template.md` 기준으로 `USER_REVIEW.md`를 작성하고 active `PLAN-*.md`, `CODE_REVIEW-*.md`, `complete.log`를 남기지 않는다.
|
||||||
|
- [ ] USER_REVIEW가 연결된 Milestone 결정으로 완료/PASS 해소되면 `USER_REVIEW.md`를 해소 상태로 갱신하고 `complete.log`를 작성한 뒤 task directory를 archive로 이동한다.
|
||||||
|
|
||||||
|
## 계획 대비 변경 사항
|
||||||
|
|
||||||
|
_구현 에이전트가 계획과 다르게 구현한 부분을 이유와 함께 기록한다._
|
||||||
|
|
||||||
|
## 주요 설계 결정
|
||||||
|
|
||||||
|
_구현 에이전트가 주요 설계 결정 사항을 기록한다._
|
||||||
|
|
||||||
|
## 사용자 리뷰 요청
|
||||||
|
|
||||||
|
_기본값은 `없음`이다. 구현 중 새 결정이 필요해 보여도 직접 질문하거나 선택지를 제시하거나 `request_user_input`을 호출하지 않는다. 이 섹션은 선택된 Milestone `구현 잠금 > 결정 필요` 항목이 실구현을 차단할 때만 채운다. 외부 환경/secret/서비스 준비, 검증 증거 공백, 반복 실패, 일반 범위 조정은 사용자 리뷰 요청이 아니며 `검증 결과`, `계획 대비 변경 사항`, 또는 code-review의 일반 follow-up plan으로 처리한다._
|
||||||
|
|
||||||
|
- 상태: 없음
|
||||||
|
- 사유 유형: 없음
|
||||||
|
- 연결 대상: 없음
|
||||||
|
- 결정 필요: 없음
|
||||||
|
- 차단 근거: 없음
|
||||||
|
- 실행한 검증/명령: 없음
|
||||||
|
- 자동 후속 불가 이유: 없음
|
||||||
|
- 재개 조건: 없음
|
||||||
|
|
||||||
|
## 리뷰어를 위한 체크포인트
|
||||||
|
|
||||||
|
- `OtoConsoleShell` public constructor와 `OtoConsoleSection` enum이 호환 유지되는지 확인한다.
|
||||||
|
- rail tooltip navigation smoke가 새 grouping에서도 깨지지 않는지 확인한다.
|
||||||
|
- Settings fallback이 `HTTP API`, `Wire URL`, `Browser API policy`, 기존 empty text를 유지하는지 확인한다.
|
||||||
|
- agent-ui status가 이 plan에서 `구현됨`으로 바뀌지 않았는지 확인한다.
|
||||||
|
- 원격 runner Flutter preflight 실패가 있으면 blocker 기록이 실제 출력과 일치하는지 확인한다.
|
||||||
|
|
||||||
|
## 검증 결과
|
||||||
|
|
||||||
|
_구현 에이전트가 각 중간 검증 및 최종 검증 명령 실행 후 출력을 여기에 붙여 넣는다._
|
||||||
|
|
||||||
|
필수 규칙:
|
||||||
|
- 검증 명령은 고정된 계약이다. 임의로 대체하지 않는다.
|
||||||
|
- 대체가 필요하면 `계획 대비 변경 사항`에 이유와 대체 명령을 기록한다.
|
||||||
|
- `검증 결과`에는 실제 stdout/stderr를 붙여 넣는다.
|
||||||
|
- 사용자 리뷰 요청으로 명령을 끝까지 실행하지 못했다면 `사용자 리뷰 요청`에 실행한 명령, 실제 출력, 미실행 명령의 사유를 기록한다.
|
||||||
|
- mobile/UI hang, timeout, 또는 2분 무진행은 blind retry를 중단하고 focused rerun 명령과 screenshot/window/UI-tree evidence path를 남기며, 불가능하면 정확한 사유를 남긴다.
|
||||||
|
|
||||||
|
### LAYOUT-1 중간 검증
|
||||||
|
```
|
||||||
|
$ git diff --check
|
||||||
|
(output)
|
||||||
|
```
|
||||||
|
|
||||||
|
### LAYOUT-2 중간 검증
|
||||||
|
```
|
||||||
|
$ cd packages/flutter/oto_console && flutter test
|
||||||
|
(output)
|
||||||
|
```
|
||||||
|
|
||||||
|
### LAYOUT-3 중간 검증
|
||||||
|
```
|
||||||
|
$ cd apps/client && flutter test
|
||||||
|
(output)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 최종 검증
|
||||||
|
```
|
||||||
|
$ git diff --check
|
||||||
|
(output)
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
$ python3 - <<'PY'
|
||||||
|
from pathlib import Path
|
||||||
|
targets = [
|
||||||
|
'agent-ui/definition/views/overview/index.md',
|
||||||
|
'agent-ui/definition/views/runners/index.md',
|
||||||
|
'agent-ui/definition/views/pipelines/index.md',
|
||||||
|
'agent-ui/definition/views/executions/index.md',
|
||||||
|
'agent-ui/definition/views/artifacts/index.md',
|
||||||
|
'agent-ui/definition/views/settings/index.md',
|
||||||
|
'agent-ui/definition/components/console-shell/index.md',
|
||||||
|
'agent-ui/definition/components/console-rail/index.md',
|
||||||
|
'agent-ui/definition/components/section-surface/index.md',
|
||||||
|
]
|
||||||
|
missing = [p for p in targets if not Path(p).exists()]
|
||||||
|
if missing:
|
||||||
|
raise SystemExit(f'missing agent-ui docs: {missing}')
|
||||||
|
for p in targets:
|
||||||
|
text = Path(p).read_text()
|
||||||
|
if 'status: 계획' not in text and 'Status: `계획`' not in text:
|
||||||
|
raise SystemExit(f'layout target status drift: {p}')
|
||||||
|
print('agent-ui layout target docs ok')
|
||||||
|
PY
|
||||||
|
(output)
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
$ ssh -o BatchMode=yes -o ConnectTimeout=10 toki@toki-labs.com 'cd /Users/toki/agent-work/oto && printf "workdir=%s\n" "$PWD" && printf "branch=" && git rev-parse --abbrev-ref HEAD && printf "head=" && git rev-parse --short HEAD && printf "status-start\n" && git status --short && printf "status-end\n" && command -v flutter && flutter --version | head -n 1'
|
||||||
|
(output)
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
$ ssh -o BatchMode=yes -o ConnectTimeout=10 toki@toki-labs.com 'cd /Users/toki/agent-work/oto/packages/flutter/oto_console && flutter analyze && flutter test'
|
||||||
|
(output)
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
$ ssh -o BatchMode=yes -o ConnectTimeout=10 toki@toki-labs.com 'cd /Users/toki/agent-work/oto/apps/client && flutter analyze && flutter test'
|
||||||
|
(output)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
> **[IMPLEMENTING AGENT — BEFORE SAVING] Have you filled in every implementation-owned section: completion table, implementation checklist, changes from plan, design decisions, and verification output?**
|
||||||
|
> If anything is blank, go back and fill it in before saving this file.
|
||||||
|
> Leave review-agent-only sections unchanged.
|
||||||
|
|
||||||
|
## Ownership
|
||||||
|
|
||||||
|
| Section | Owner | Note |
|
||||||
|
|---------|-------|------|
|
||||||
|
| Header comment, 개요, 리뷰 에이전트 지시 | Fixed at stub creation | Implementing agent must not modify or execute archive/finalization steps |
|
||||||
|
| Roadmap Targets | Fixed at stub creation from plan | Implementing agent must not modify |
|
||||||
|
| 구현 항목별 완료 여부 | Implementing agent | Check `[ ]` to `[x]` only |
|
||||||
|
| 구현 체크리스트 | Implementing agent | Check `[ ]` to `[x]` only |
|
||||||
|
| 코드리뷰 전용 체크리스트 | Review agent only | Implementing agent must not modify |
|
||||||
|
| 계획 대비 변경 사항, 주요 설계 결정 | Implementing agent | Replace placeholder text with actual content |
|
||||||
|
| 사용자 리뷰 요청 | Implementing agent | Keep `상태: 없음` unless selected Milestone lock decision blocks implementation |
|
||||||
|
| 리뷰어를 위한 체크포인트 | Fixed at stub creation | Review focus |
|
||||||
|
| 검증 결과 | Implementing agent | Fill command output only |
|
||||||
|
|
@ -0,0 +1,407 @@
|
||||||
|
<!-- task=m-control-plane-jenkins-aligned-layout-pass/01_definition_shell_foundation plan=0 tag=LAYOUT -->
|
||||||
|
|
||||||
|
# Plan - LAYOUT Definition And Shell Foundation
|
||||||
|
|
||||||
|
## 이 파일을 읽는 구현 에이전트에게
|
||||||
|
|
||||||
|
`CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션 작성은 필수다. 구현 후 검증을 실행하고 실제 변경 내용, 설계 결정, 명령 출력, 체크리스트를 채운 뒤 active 파일을 그대로 둔 상태로 리뷰 준비를 보고한다. 최종 판정, log rename, `complete.log`, archive 이동은 code-review 전용이다.
|
||||||
|
|
||||||
|
선택된 Milestone `구현 잠금 > 결정 필요` 항목 때문에 막힌 경우에만 review stub의 `사용자 리뷰 요청` 섹션을 정확한 연결 근거와 함께 채우고 멈춘다. 구현 중 사용자에게 직접 묻거나, 선택지를 제시하거나, `request_user_input`을 호출하거나, `USER_REVIEW.md`/`complete.log`를 만들지 않는다. 환경/secret/service 차단, 일반 범위 변경, 검증 evidence 공백은 사용자 리뷰 요청이 아니라 검증 결과 또는 follow-up 대상이다.
|
||||||
|
|
||||||
|
## 배경
|
||||||
|
|
||||||
|
현재 마일스톤의 `layout-pass` 에픽은 Jenkins 최신 weekly/LTS와 `2.516+` refreshed UI를 pixel parity가 아닌 운영 화면 레이아웃 기준으로 반영하는 작업이다. 현재 Flutter 구현은 60px rail과 각 view 내부 centered card/list 구조라 agent-ui의 Target Layout Delta와 다르다. 이 첫 하위 작업은 agent-ui 정의 기준이 고정되어 있음을 검증하고, 이후 view rollout이 기대는 shell/header/fallback surface 기반을 먼저 만든다.
|
||||||
|
|
||||||
|
## 사용자 리뷰 요청 흐름
|
||||||
|
|
||||||
|
구현 중 직접 사용자에게 묻지 않는다. 선택된 Milestone의 `구현 잠금 > 결정 필요` 항목이 실구현을 차단할 때만 `agent-ops/skills/common/_templates/implementation-user-review-request-section.md` 형식으로 active review stub의 `사용자 리뷰 요청`에 기록하고, code-review가 검증 후 실제 `USER_REVIEW.md` 생성을 맡는다.
|
||||||
|
|
||||||
|
## Roadmap Targets
|
||||||
|
|
||||||
|
- Milestone: `agent-roadmap/phase/control-plane-product-surface/milestones/control-plane-jenkins-aligned-layout-pass.md`
|
||||||
|
- Task ids:
|
||||||
|
- `layout-definition`: Jenkins reference baseline, view/component Target Layout Delta, status=`계획` 정합성 고정
|
||||||
|
- `shell-layout`: `console-shell`과 `console-rail`을 Jenkins refreshed header/action context와 운영 destination grouping에 맞춰 재배치
|
||||||
|
- Completion mode: check-on-pass
|
||||||
|
|
||||||
|
## 분석 결과
|
||||||
|
|
||||||
|
### 읽은 파일
|
||||||
|
|
||||||
|
- `agent-ops/rules/project/rules.md`
|
||||||
|
- `agent-ops/rules/common/rules-roadmap.md`
|
||||||
|
- `agent-ops/skills/common/router.md`
|
||||||
|
- `agent-ops/skills/common/update-agent-ui/SKILL.md`
|
||||||
|
- `agent-ops/rules/common/rules-agent-ui.md`
|
||||||
|
- `agent-ops/skills/common/validate-agent-ui/SKILL.md`
|
||||||
|
- `agent-ops/skills/common/sync-agent-ui/SKILL.md`
|
||||||
|
- `agent-ops/skills/common/update-roadmap/SKILL.md`
|
||||||
|
- `agent-ops/skills/common/plan/SKILL.md`
|
||||||
|
- `agent-test/local/rules.md`
|
||||||
|
- `agent-test/local/framework-smoke.md`
|
||||||
|
- `agent-roadmap/current.md`
|
||||||
|
- `agent-roadmap/phase/control-plane-product-surface/PHASE.md`
|
||||||
|
- `agent-roadmap/phase/control-plane-product-surface/milestones/control-plane-jenkins-aligned-layout-pass.md`
|
||||||
|
- `agent-ui/definition/index.md`
|
||||||
|
- `agent-ui/definition/views/index.md`
|
||||||
|
- `agent-ui/definition/views/overview/index.md`
|
||||||
|
- `agent-ui/definition/views/runners/index.md`
|
||||||
|
- `agent-ui/definition/views/pipelines/index.md`
|
||||||
|
- `agent-ui/definition/views/executions/index.md`
|
||||||
|
- `agent-ui/definition/views/artifacts/index.md`
|
||||||
|
- `agent-ui/definition/views/settings/index.md`
|
||||||
|
- `agent-ui/definition/views/agent/index.md`
|
||||||
|
- `agent-ui/definition/components/index.md`
|
||||||
|
- `agent-ui/definition/components/console-shell/index.md`
|
||||||
|
- `agent-ui/definition/components/console-rail/index.md`
|
||||||
|
- `agent-ui/definition/components/section-surface/index.md`
|
||||||
|
- `agent-ui/definition/components/state-panel/index.md`
|
||||||
|
- `agent-ui/definition/components/status-badge/index.md`
|
||||||
|
- `agent-ui/definition/components/record-list/index.md`
|
||||||
|
- `agent-ui/definition/components/action-feedback/index.md`
|
||||||
|
- `agent-ui/definition/components/runner-self-update-form/index.md`
|
||||||
|
- `agent-ui/definition/components/job-create-form/index.md`
|
||||||
|
- `agent-ui/definition/components/execution-action-toolbar/index.md`
|
||||||
|
- `agent-ui/definition/components/log-preview/index.md`
|
||||||
|
- `agent-ui/definition/components/artifact-list/index.md`
|
||||||
|
- `agent-ui/frame/index.md`
|
||||||
|
- `packages/flutter/oto_console/lib/oto_console.dart`
|
||||||
|
- `packages/flutter/oto_console/lib/src/oto_console_models.dart`
|
||||||
|
- `packages/flutter/oto_console/lib/src/oto_console_contract.dart`
|
||||||
|
- `packages/flutter/oto_console/lib/src/oto_console_shell.dart`
|
||||||
|
- `packages/flutter/oto_console/lib/src/oto_console_overview.dart`
|
||||||
|
- `packages/flutter/oto_console/lib/src/oto_runners_surface.dart`
|
||||||
|
- `packages/flutter/oto_console/lib/src/oto_jobs_surface.dart`
|
||||||
|
- `packages/flutter/oto_console/lib/src/oto_executions_surface.dart`
|
||||||
|
- `packages/flutter/oto_console/lib/src/oto_artifacts_surface.dart`
|
||||||
|
- `packages/flutter/oto_console/lib/src/oto_agent_panel.dart`
|
||||||
|
- `apps/client/lib/src/app/oto_client_app.dart`
|
||||||
|
- `packages/flutter/oto_console/pubspec.yaml`
|
||||||
|
- `packages/flutter/oto_console/analysis_options.yaml`
|
||||||
|
- `apps/client/pubspec.yaml`
|
||||||
|
- `apps/client/analysis_options.yaml`
|
||||||
|
- `packages/flutter/oto_console/test/oto_console_test.dart`
|
||||||
|
- `apps/client/test/widget_test.dart`
|
||||||
|
|
||||||
|
### SDD 기준
|
||||||
|
|
||||||
|
선택 Milestone은 `SDD: 불필요`다. 기록 사유는 Flutter UI layout 재배치와 agent-ui/code 동기화가 범위이며 API/proto/config/schema, 외부 provider, 감사 source of truth, durable persistence를 바꾸지 않는다는 것이다.
|
||||||
|
|
||||||
|
### 테스트 환경 규칙
|
||||||
|
|
||||||
|
- `test_env`: local.
|
||||||
|
- `agent-test/local/rules.md`를 읽었고 local 기준은 원격 runner `ssh toki@toki-labs.com`, checkout `/Users/toki/agent-work/oto`다.
|
||||||
|
- 매칭 profile: `agent-test/local/framework-smoke.md`. Flutter package/app 변경 후 `flutter analyze`와 `flutter test`를 실행해야 한다.
|
||||||
|
- 원격 프리플라이트 결과: checkout 접근 가능, branch `master`, head `7e51ef9`, dirty worktree 존재, `command -v flutter`가 빈 값으로 실패했다. 이 plan의 Flutter 검증은 원격 runner에 Flutter SDK가 PATH에 들어오고 구현 변경이 원격 checkout에 동기화된 뒤 실행해야 PASS 가능하다.
|
||||||
|
- 현재 workspace preflight: branch `master`, head `ba91d4e`, Flutter/Dart는 `/sdk/flutter/bin/flutter`, `/sdk/flutter/bin/dart`에 있다. 현재 workspace의 Flutter 실행은 보조 확인일 뿐 최종 evidence는 원격 runner 기준이다.
|
||||||
|
|
||||||
|
### 테스트 커버리지 공백
|
||||||
|
|
||||||
|
- shell rail navigation: 기존 `oto_console_test.dart`와 `apps/client/test/widget_test.dart`가 tooltip navigation과 Agent fallback을 검증한다. 새 grouping/header semantics는 테스트 갱신 필요.
|
||||||
|
- fallback settings/section surface: 기존 테스트가 `No local preferences`, `Browser API policy`, `same-origin proxy` 문자열을 검증한다. grouped settings layout으로 바꿔도 이 문자열과 endpoint detail은 유지해야 한다.
|
||||||
|
- agent-ui definition validation: 기존 Flutter 테스트가 아니라 문서 정합성 shell/Python check가 필요하다.
|
||||||
|
|
||||||
|
### 심볼 참조
|
||||||
|
|
||||||
|
삭제/rename 예정 symbol은 없다. `OtoConsoleShell`, `OtoConsoleSectionSurface`, `_OtoConsoleRail`, `_RailButton` 내부 구조만 변경한다. `OtoConsoleSection` enum과 public constructor surface는 유지한다.
|
||||||
|
|
||||||
|
### 분할 판단
|
||||||
|
|
||||||
|
split decision policy를 먼저 평가했다. 공유 shell/fallback 구조와 6개 view rollout, execution/artifact detail은 독립 리뷰 가능한 위험이 달라 split이 필요하다.
|
||||||
|
|
||||||
|
공유 task group: `m-control-plane-jenkins-aligned-layout-pass`
|
||||||
|
|
||||||
|
- `01_definition_shell_foundation`: agent-ui definition validation + shell/rail/fallback foundation. 의존 없음.
|
||||||
|
- `02+01_primary_views`: overview/runners/pipelines/settings rollout. predecessor `01`은 현재 missing이며 이 subtask PASS 후 실행해야 한다.
|
||||||
|
- `03+01,02_execution_artifact_views`: executions/artifacts/detail panes + common component density. predecessors `01`, `02`는 현재 missing이며 둘 다 PASS 후 실행해야 한다.
|
||||||
|
|
||||||
|
### 범위 결정 근거
|
||||||
|
|
||||||
|
이 작업은 shell foundation만 다룬다. `overview/runners/pipelines/settings` view body 변경은 `02+01_primary_views`, `executions/artifacts`와 log/artifact panes는 `03+01,02_execution_artifact_views`로 넘긴다. agent view body는 Jenkins parity 대상이 아니므로 navigation consistency만 확인하고 `OtoAgentPanel`은 변경하지 않는다. agent-ui 문서 status를 `구현됨`으로 되돌리는 작업은 `sync-agent-ui`의 milestone-required 규칙에 따라 마일스톤 완료 리뷰에서 처리한다.
|
||||||
|
|
||||||
|
### 빌드 등급
|
||||||
|
|
||||||
|
`local-G06`. 변경은 Flutter package shell/fallback으로 bounded되고 public API는 유지하지만, 이후 view rollout의 기반이 되어 위젯 테스트 갱신과 원격 runner 검증이 필요하다.
|
||||||
|
|
||||||
|
## 구현 체크리스트
|
||||||
|
|
||||||
|
- [ ] agent-ui definition baseline이 `계획` 상태와 source evidence를 유지하는지 검증하고, 깨진 문서 정합성이 있으면 코드 변경 전에 고친다.
|
||||||
|
- [ ] `OtoConsoleShell`에 rail + content만 있던 구조를 current section header/action slot을 담을 수 있는 Jenkins-style page frame으로 재배치한다.
|
||||||
|
- [ ] `_OtoConsoleRail` destination grouping을 overview/workflow/operations/admin 형태로 정리하되 `OtoConsoleSection` enum, tooltip, navigation callback은 유지한다.
|
||||||
|
- [ ] `OtoConsoleSectionSurface`를 settings/runtime summary fallback에 맞게 header, state panel, detail groups로 재정렬하고 기존 fallback 문자열을 유지한다.
|
||||||
|
- [ ] shell/navigation widget tests를 갱신하거나 추가해 Overview, Agent, Settings navigation과 fallback detail 표시를 검증한다.
|
||||||
|
- [ ] 원격 runner preflight와 Flutter analyze/test 계약을 실행하거나, Flutter PATH/source sync 차단이면 실제 출력과 차단 사유를 review stub에 남긴다.
|
||||||
|
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.
|
||||||
|
|
||||||
|
## 의존 관계 및 구현 순서
|
||||||
|
|
||||||
|
이 subtask는 predecessor가 없다. PASS 후 `02+01_primary_views`와 `03+01,02_execution_artifact_views`가 이 shell foundation을 기준으로 구현한다.
|
||||||
|
|
||||||
|
### [LAYOUT-1] Agent UI Definition Baseline Guard
|
||||||
|
|
||||||
|
#### 문제
|
||||||
|
|
||||||
|
마일스톤 task `layout-definition`은 Jenkins reference baseline, Target Layout Delta, 대상 view/component의 `계획` 상태가 코드 반영 전 유지되어야 한다. 현재 관련 문서는 agent-ui에 작성되어 있으나, 구현자가 코드부터 바꾸면 status/evidence 정합성이 깨진 상태로 진행될 수 있다.
|
||||||
|
|
||||||
|
#### 해결 방법
|
||||||
|
|
||||||
|
코드 변경 전에 agent-ui 활성 문서만 대상으로 source evidence path 존재, target view/component status, view component reference를 검증한다. archive는 읽지 않는다.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Before writing code
|
||||||
|
python3 - <<'PY'
|
||||||
|
from pathlib import Path
|
||||||
|
targets = [
|
||||||
|
'agent-ui/definition/views/overview/index.md',
|
||||||
|
'agent-ui/definition/views/runners/index.md',
|
||||||
|
'agent-ui/definition/views/pipelines/index.md',
|
||||||
|
'agent-ui/definition/views/executions/index.md',
|
||||||
|
'agent-ui/definition/views/artifacts/index.md',
|
||||||
|
'agent-ui/definition/views/settings/index.md',
|
||||||
|
'agent-ui/definition/components/console-shell/index.md',
|
||||||
|
'agent-ui/definition/components/console-rail/index.md',
|
||||||
|
'agent-ui/definition/components/section-surface/index.md',
|
||||||
|
]
|
||||||
|
for target in targets:
|
||||||
|
text = Path(target).read_text()
|
||||||
|
assert 'status: 계획' in text or 'Status: `계획`' in text, target
|
||||||
|
print('agent-ui layout baseline ok')
|
||||||
|
PY
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 수정 파일 및 체크리스트
|
||||||
|
|
||||||
|
- [ ] `agent-ui/definition/**`: baseline 검증만 수행한다. 의도치 않은 status 변경은 하지 않는다.
|
||||||
|
- [ ] `agent-ui/frame/index.md`: visual source 없음 상태를 유지한다.
|
||||||
|
|
||||||
|
#### 테스트 작성
|
||||||
|
|
||||||
|
새 Flutter 테스트는 작성하지 않는다. 이 항목은 문서 정합성 guard이며 shell/Python check로 검증한다.
|
||||||
|
|
||||||
|
#### 중간 검증
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git diff --check
|
||||||
|
```
|
||||||
|
|
||||||
|
예상: whitespace error 없음.
|
||||||
|
|
||||||
|
### [LAYOUT-2] Shell Page Frame
|
||||||
|
|
||||||
|
#### 문제
|
||||||
|
|
||||||
|
[packages/flutter/oto_console/lib/src/oto_console_shell.dart](/config/workspace/oto/packages/flutter/oto_console/lib/src/oto_console_shell.dart:52)는 `SafeArea > Row > rail + Expanded(content)`만 제공한다. agent-ui `console-shell` Target Layout Delta는 shell이 current view context와 action slot을 담을 수 있는 page frame이어야 한다.
|
||||||
|
|
||||||
|
#### 해결 방법
|
||||||
|
|
||||||
|
기존 public constructor는 유지하고 private shell frame helper를 추가한다. content widget을 바로 mount하지 않고 selected section metadata를 계산해 header/action-capable frame 안에 넣는다.
|
||||||
|
|
||||||
|
Before:
|
||||||
|
|
||||||
|
```dart
|
||||||
|
// packages/flutter/oto_console/lib/src/oto_console_shell.dart:52
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
final theme = widget.themeAdapter ?? const OtoConsoleThemeAdapter();
|
||||||
|
return Scaffold(
|
||||||
|
backgroundColor: theme.backgroundColor,
|
||||||
|
body: SafeArea(
|
||||||
|
child: Row(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||||
|
children: [
|
||||||
|
_OtoConsoleRail(
|
||||||
|
selected: _section,
|
||||||
|
onSelect: _select,
|
||||||
|
theme: theme,
|
||||||
|
),
|
||||||
|
Expanded(child: _buildContent(theme)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
After:
|
||||||
|
|
||||||
|
```dart
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
final theme = widget.themeAdapter ?? const OtoConsoleThemeAdapter();
|
||||||
|
final descriptor = _SectionDescriptor.forSection(_section);
|
||||||
|
return Scaffold(
|
||||||
|
backgroundColor: theme.backgroundColor,
|
||||||
|
body: SafeArea(
|
||||||
|
child: Row(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||||
|
children: [
|
||||||
|
_OtoConsoleRail(
|
||||||
|
selected: _section,
|
||||||
|
onSelect: _select,
|
||||||
|
theme: theme,
|
||||||
|
),
|
||||||
|
Expanded(
|
||||||
|
child: _ConsolePageFrame(
|
||||||
|
descriptor: descriptor,
|
||||||
|
theme: theme,
|
||||||
|
child: _buildContent(theme),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
`_ConsolePageFrame`은 header density만 담당하고 view body semantics는 각 surface가 유지한다. 중복 제목이 과해지면 view body title을 다음 subtasks에서 줄인다.
|
||||||
|
|
||||||
|
#### 수정 파일 및 체크리스트
|
||||||
|
|
||||||
|
- [ ] `packages/flutter/oto_console/lib/src/oto_console_shell.dart`: `_SectionDescriptor`, `_ConsolePageFrame` 추가.
|
||||||
|
- [ ] `packages/flutter/oto_console/lib/src/oto_console_shell.dart`: public API와 `OtoConsoleSection` enum 유지.
|
||||||
|
- [ ] `packages/flutter/oto_console/test/oto_console_test.dart`: shell smoke expectation 갱신.
|
||||||
|
- [ ] `apps/client/test/widget_test.dart`: host smoke expectation이 깨지면 갱신.
|
||||||
|
|
||||||
|
#### 테스트 작성
|
||||||
|
|
||||||
|
`packages/flutter/oto_console/test/oto_console_test.dart`에 shell frame이 Overview/Agent/Settings navigation 후에도 기존 핵심 문자열을 유지하는 assertion을 추가하거나 기존 test를 갱신한다. public API가 바뀌지 않으므로 새 model test는 필요 없다.
|
||||||
|
|
||||||
|
#### 중간 검증
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd packages/flutter/oto_console && flutter test
|
||||||
|
```
|
||||||
|
|
||||||
|
예상: console shell/navigation widget tests PASS. 원격 runner에서 Flutter가 없으면 preflight 출력과 blocker를 기록한다.
|
||||||
|
|
||||||
|
### [LAYOUT-3] Rail Grouping And Fallback Section Surface
|
||||||
|
|
||||||
|
#### 문제
|
||||||
|
|
||||||
|
[packages/flutter/oto_console/lib/src/oto_console_shell.dart](/config/workspace/oto/packages/flutter/oto_console/lib/src/oto_console_shell.dart:160)의 rail은 flat icon list이고, [OtoConsoleSectionSurface](/config/workspace/oto/packages/flutter/oto_console/lib/src/oto_console_shell.dart:296)는 centered generic empty panel이다. agent-ui `console-rail`과 `section-surface`는 Jenkins 운영 destination grouping과 Manage Jenkins-style runtime summary grouping을 요구한다.
|
||||||
|
|
||||||
|
#### 해결 방법
|
||||||
|
|
||||||
|
Rail은 `overview`, workflow(`pipelines`, `executions`), operations(`runners`, `artifacts`), admin(`settings`, `agent`) 순서의 grouped layout으로 바꾼다. Settings fallback은 empty panel + detail rows가 아니라 runtime/security/connectivity group label을 가진 list로 재배치한다.
|
||||||
|
|
||||||
|
Before:
|
||||||
|
|
||||||
|
```dart
|
||||||
|
// packages/flutter/oto_console/lib/src/oto_console_shell.dart:168
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
const SizedBox(height: 8),
|
||||||
|
_RailButton(tooltip: 'Overview', ...),
|
||||||
|
_RailButton(tooltip: 'Runners', ...),
|
||||||
|
_RailButton(tooltip: 'Pipelines', ...),
|
||||||
|
_RailButton(tooltip: 'Executions', ...),
|
||||||
|
_RailButton(tooltip: 'Artifacts', ...),
|
||||||
|
const Spacer(),
|
||||||
|
_RailButton(tooltip: 'Agent', ...),
|
||||||
|
_RailButton(tooltip: 'Settings', ...),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
After:
|
||||||
|
|
||||||
|
```dart
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
const SizedBox(height: 8),
|
||||||
|
_RailButton(tooltip: 'Overview', ...),
|
||||||
|
const _RailDivider(),
|
||||||
|
_RailButton(tooltip: 'Pipelines', ...),
|
||||||
|
_RailButton(tooltip: 'Executions', ...),
|
||||||
|
const _RailDivider(),
|
||||||
|
_RailButton(tooltip: 'Runners', ...),
|
||||||
|
_RailButton(tooltip: 'Artifacts', ...),
|
||||||
|
const Spacer(),
|
||||||
|
_RailButton(tooltip: 'Settings', ...),
|
||||||
|
_RailButton(tooltip: 'Agent', ...),
|
||||||
|
const SizedBox(height: 8),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 수정 파일 및 체크리스트
|
||||||
|
|
||||||
|
- [ ] `packages/flutter/oto_console/lib/src/oto_console_shell.dart`: `_RailDivider` 또는 동등한 grouping affordance 추가.
|
||||||
|
- [ ] `packages/flutter/oto_console/lib/src/oto_console_shell.dart`: fallback `OtoConsoleSectionSurface` detail layout 재정렬.
|
||||||
|
- [ ] `packages/flutter/oto_console/test/oto_console_test.dart`: tooltip navigation 테스트가 새 순서에서도 PASS하게 유지.
|
||||||
|
- [ ] `apps/client/test/widget_test.dart`: Settings fallback 문자열 유지 확인.
|
||||||
|
|
||||||
|
#### 테스트 작성
|
||||||
|
|
||||||
|
기존 shell/navigation smoke를 갱신한다. 새 순서는 tooltip으로 검증하고, Settings view는 `HTTP API`, `Wire URL`, `Browser API policy`가 보이는지 확인한다.
|
||||||
|
|
||||||
|
#### 중간 검증
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd apps/client && flutter test
|
||||||
|
```
|
||||||
|
|
||||||
|
예상: host app navigation smoke PASS. 원격 runner에서 Flutter가 없으면 preflight 출력과 blocker를 기록한다.
|
||||||
|
|
||||||
|
## 수정 파일 요약
|
||||||
|
|
||||||
|
| 파일 | 항목 |
|
||||||
|
|------|------|
|
||||||
|
| `packages/flutter/oto_console/lib/src/oto_console_shell.dart` | LAYOUT-2, LAYOUT-3 |
|
||||||
|
| `packages/flutter/oto_console/test/oto_console_test.dart` | LAYOUT-2, LAYOUT-3 |
|
||||||
|
| `apps/client/test/widget_test.dart` | LAYOUT-2, LAYOUT-3 |
|
||||||
|
| `agent-ui/definition/**`, `agent-ui/frame/index.md` | LAYOUT-1 검증만 |
|
||||||
|
|
||||||
|
## 최종 검증
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git diff --check
|
||||||
|
```
|
||||||
|
|
||||||
|
예상: PASS.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python3 - <<'PY'
|
||||||
|
from pathlib import Path
|
||||||
|
targets = [
|
||||||
|
'agent-ui/definition/views/overview/index.md',
|
||||||
|
'agent-ui/definition/views/runners/index.md',
|
||||||
|
'agent-ui/definition/views/pipelines/index.md',
|
||||||
|
'agent-ui/definition/views/executions/index.md',
|
||||||
|
'agent-ui/definition/views/artifacts/index.md',
|
||||||
|
'agent-ui/definition/views/settings/index.md',
|
||||||
|
'agent-ui/definition/components/console-shell/index.md',
|
||||||
|
'agent-ui/definition/components/console-rail/index.md',
|
||||||
|
'agent-ui/definition/components/section-surface/index.md',
|
||||||
|
]
|
||||||
|
missing = [p for p in targets if not Path(p).exists()]
|
||||||
|
if missing:
|
||||||
|
raise SystemExit(f'missing agent-ui docs: {missing}')
|
||||||
|
for p in targets:
|
||||||
|
text = Path(p).read_text()
|
||||||
|
if 'status: 계획' not in text and 'Status: `계획`' not in text:
|
||||||
|
raise SystemExit(f'layout target status drift: {p}')
|
||||||
|
print('agent-ui layout target docs ok')
|
||||||
|
PY
|
||||||
|
```
|
||||||
|
|
||||||
|
예상: `agent-ui layout target docs ok`.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ssh -o BatchMode=yes -o ConnectTimeout=10 toki@toki-labs.com 'cd /Users/toki/agent-work/oto && printf "workdir=%s\n" "$PWD" && printf "branch=" && git rev-parse --abbrev-ref HEAD && printf "head=" && git rev-parse --short HEAD && printf "status-start\n" && git status --short && printf "status-end\n" && command -v flutter && flutter --version | head -n 1'
|
||||||
|
```
|
||||||
|
|
||||||
|
예상: 원격 checkout 접근, Flutter 경로 출력, 구현 변경 source sync 상태 확인. 현재 사전 확인에서는 `command -v flutter`가 실패했으므로, 이 상태가 지속되면 Flutter 검증은 차단으로 기록한다.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ssh -o BatchMode=yes -o ConnectTimeout=10 toki@toki-labs.com 'cd /Users/toki/agent-work/oto/packages/flutter/oto_console && flutter analyze && flutter test'
|
||||||
|
```
|
||||||
|
|
||||||
|
예상: 원격 runner Flutter 준비 및 source sync 후 PASS.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ssh -o BatchMode=yes -o ConnectTimeout=10 toki@toki-labs.com 'cd /Users/toki/agent-work/oto/apps/client && flutter analyze && flutter test'
|
||||||
|
```
|
||||||
|
|
||||||
|
예상: 원격 runner Flutter 준비 및 source sync 후 PASS.
|
||||||
|
|
||||||
|
모든 코드 변경 완료 후 반드시 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 채운다. 이 파일 작성이 구현의 마지막 단계다.
|
||||||
|
|
@ -0,0 +1,173 @@
|
||||||
|
<!-- task=m-control-plane-jenkins-aligned-layout-pass/02+01_primary_views plan=0 tag=LAYOUT -->
|
||||||
|
|
||||||
|
# Code Review Reference - LAYOUT
|
||||||
|
|
||||||
|
> **[IMPLEMENTING AGENT — READ FIRST] Filling in this file is the mandatory final step of implementation.**
|
||||||
|
> The task is NOT complete until every implementation-owned section below is filled in.
|
||||||
|
> Complete the `구현 체크리스트`; the final checklist item is mandatory before saving.
|
||||||
|
> Fill implementation-owned sections, then stop with active files in place and report ready for review.
|
||||||
|
> If implementation is blocked by a selected Milestone `구현 잠금 > 결정 필요` item, fill `사용자 리뷰 요청` with linked evidence and stop with active files in place; code-review decides whether to write `USER_REVIEW.md`. Environment/secret/service blockers, generic scope changes, repeated failures, and evidence gaps that a follow-up agent can close are normal follow-up issues, not user-review blockers by themselves.
|
||||||
|
> Do not ask the user directly, present choices in chat, or call `request_user_input` during implementation; record only Milestone lock decisions in `사용자 리뷰 요청` and stop for code-review.
|
||||||
|
> Finalization (`코드리뷰 결과`, log rename, `complete.log`, archive moves, `코드리뷰 전용 체크리스트`) is review-agent-only, even after compaction/resume.
|
||||||
|
> Follow the ownership table at the bottom of this file for which sections you own.
|
||||||
|
|
||||||
|
## 개요
|
||||||
|
|
||||||
|
date=2026-07-02
|
||||||
|
task=m-control-plane-jenkins-aligned-layout-pass/02+01_primary_views, plan=0, tag=LAYOUT
|
||||||
|
|
||||||
|
## 이 파일을 읽는 리뷰 에이전트에게
|
||||||
|
|
||||||
|
> **[REVIEW AGENT ONLY]** 아래 종결 절차는 코드리뷰 에이전트 전용이다. 구현 에이전트는 이 섹션을 실행하지 않는다.
|
||||||
|
|
||||||
|
각 항목의 구현을 실제 소스 파일과 대조하고, `검증 결과` 섹션의 출력이 코드와 일치하는지 확인하세요.
|
||||||
|
리뷰 완료는 아래 순서까지 끝난 상태를 의미합니다.
|
||||||
|
|
||||||
|
1. 판정을 append한다.
|
||||||
|
2. `CODE_REVIEW-local-G06.md` → `code_review_local_G06_0.log`, `PLAN-local-G06.md` → `plan_local_G06_0.log`로 아카이브한다.
|
||||||
|
3. PASS이면 `complete.log` 작성 후 active task 디렉터리를 `agent-task/archive/YYYY/MM/m-control-plane-jenkins-aligned-layout-pass/02+01_primary_views/`로 이동한다. WARN/FAIL이면 user-review gate를 확인한 뒤 다음 active plan/review 파일 또는 `USER_REVIEW.md`를 작성한다.
|
||||||
|
4. PASS이고 task group이 `m-<milestone-slug>`이면 완료 이벤트 메타데이터를 보고한다. roadmap 상태 체크와 `update-roadmap` 호출은 런타임 책임이다.
|
||||||
|
5. 적용 가능한 `코드리뷰 전용 체크리스트` 항목을 최종 `.log` 위치에서 체크한 뒤 보고한다.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 구현 항목별 완료 여부
|
||||||
|
|
||||||
|
| 항목 | 완료 여부 |
|
||||||
|
|------|---------|
|
||||||
|
| [LAYOUT-1] Overview Status-First Dashboard | [ ] |
|
||||||
|
| [LAYOUT-2] Runners Dense List And Action Panel | [ ] |
|
||||||
|
| [LAYOUT-3] Pipelines Create Panel And Dense Job Rows | [ ] |
|
||||||
|
| [LAYOUT-4] Settings Runtime Groups | [ ] |
|
||||||
|
|
||||||
|
## 구현 체크리스트
|
||||||
|
|
||||||
|
- [ ] `01_definition_shell_foundation`의 `complete.log`가 active/archive predecessor로 존재하는지 확인하고 없으면 구현하지 않고 dependency missing을 기록한다.
|
||||||
|
- [ ] `OtoConsoleOverview`를 status-first dashboard layout으로 재배치하되 `Build Operations Overview`, endpoint, health/readiness, auth reference, refresh action을 유지한다.
|
||||||
|
- [ ] `OtoRunnersSurface`를 dense runner record list와 관리 action panel 형태로 재배치하되 self-update validation, callback, success/deferred/failed feedback을 유지한다.
|
||||||
|
- [ ] `OtoJobsSurface`를 compact create panel + dense job list로 재배치하되 create guard, submit callback, execution link navigation을 유지한다.
|
||||||
|
- [ ] Settings fallback을 runtime/security/connectivity group layout으로 정리하되 기존 endpoint/detail 문자열과 no preferences state를 유지한다.
|
||||||
|
- [ ] package/app widget tests를 갱신해 empty/error/data/action state와 primary layout markers를 검증한다.
|
||||||
|
- [ ] 원격 runner preflight와 Flutter analyze/test 계약을 실행하거나, Flutter PATH/source sync 차단이면 실제 출력과 차단 사유를 review stub에 남긴다.
|
||||||
|
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.
|
||||||
|
|
||||||
|
## 코드리뷰 전용 체크리스트
|
||||||
|
|
||||||
|
> **[REVIEW AGENT ONLY]** 이 체크리스트는 코드리뷰 에이전트만 사용한다.
|
||||||
|
> 구현 에이전트는 이 섹션을 수정하거나 체크하지 않는다.
|
||||||
|
|
||||||
|
- [ ] `코드리뷰 결과`에 `PASS`, `WARN`, `FAIL` 중 하나의 판정을 append한다.
|
||||||
|
- [ ] 판정과 `차원별 평가`, Required/Suggested/Nit 분류가 서로 일치한다.
|
||||||
|
- [ ] active `CODE_REVIEW-*-G??.md`를 `code_review_local_G06_0.log`로 아카이브한다.
|
||||||
|
- [ ] active `PLAN-*-G??.md`를 `plan_local_G06_0.log`로 아카이브한다.
|
||||||
|
- [ ] `.gitignore`의 Agent-Ops 관리 block이 `agent-task/**/*.md`와 `agent-task/**/*.log`를 unignore하고 `agent-roadmap/current.md`를 ignore하는지 확인한다.
|
||||||
|
- [ ] PASS이면 `agent-ops/skills/common/code-review/templates/complete-log-template.md` 기준으로 `complete.log`를 작성하고 active `.md` 파일을 남기지 않는다.
|
||||||
|
- [ ] PASS이면 active task 디렉터리 `agent-task/m-control-plane-jenkins-aligned-layout-pass/02+01_primary_views/`를 `agent-task/archive/YYYY/MM/m-control-plane-jenkins-aligned-layout-pass/02+01_primary_views/`로 이동하고 최종 archive 경로에서 이 체크리스트를 갱신한다.
|
||||||
|
- [ ] PASS이고 task group이 `m-<milestone-slug>`이면 런타임이 읽을 완료 이벤트 메타데이터를 보고하고, roadmap 수정이나 `update-roadmap` 직접 호출을 하지 않는다.
|
||||||
|
- [ ] PASS split 작업이면 이동 후 빈 active parent `agent-task/m-control-plane-jenkins-aligned-layout-pass/`를 제거하거나, 남은 sibling/file이 있어 유지했다고 확인한다.
|
||||||
|
- [ ] WARN/FAIL이고 user-review gate가 트리거되지 않았으면 다음 active `PLAN-local-G06.md`와 `CODE_REVIEW-local-G06.md`를 작성하고 `complete.log`를 작성하지 않는다.
|
||||||
|
- [ ] USER_REVIEW이면 `agent-ops/skills/common/code-review/templates/user-review-template.md` 기준으로 `USER_REVIEW.md`를 작성하고 active `PLAN-*.md`, `CODE_REVIEW-*.md`, `complete.log`를 남기지 않는다.
|
||||||
|
- [ ] USER_REVIEW가 연결된 Milestone 결정으로 완료/PASS 해소되면 `USER_REVIEW.md`를 해소 상태로 갱신하고 `complete.log`를 작성한 뒤 task directory를 archive로 이동한다.
|
||||||
|
|
||||||
|
## 계획 대비 변경 사항
|
||||||
|
|
||||||
|
_구현 에이전트가 계획과 다르게 구현한 부분을 이유와 함께 기록한다._
|
||||||
|
|
||||||
|
## 주요 설계 결정
|
||||||
|
|
||||||
|
_구현 에이전트가 주요 설계 결정 사항을 기록한다._
|
||||||
|
|
||||||
|
## 사용자 리뷰 요청
|
||||||
|
|
||||||
|
_기본값은 `없음`이다. 구현 중 새 결정이 필요해 보여도 직접 질문하거나 선택지를 제시하거나 `request_user_input`을 호출하지 않는다. 이 섹션은 선택된 Milestone `구현 잠금 > 결정 필요` 항목이 실구현을 차단할 때만 채운다. 외부 환경/secret/서비스 준비, 검증 증거 공백, 반복 실패, 일반 범위 조정은 사용자 리뷰 요청이 아니며 `검증 결과`, `계획 대비 변경 사항`, 또는 code-review의 일반 follow-up plan으로 처리한다._
|
||||||
|
|
||||||
|
- 상태: 없음
|
||||||
|
- 사유 유형: 없음
|
||||||
|
- 연결 대상: 없음
|
||||||
|
- 결정 필요: 없음
|
||||||
|
- 차단 근거: 없음
|
||||||
|
- 실행한 검증/명령: 없음
|
||||||
|
- 자동 후속 불가 이유: 없음
|
||||||
|
- 재개 조건: 없음
|
||||||
|
|
||||||
|
## 리뷰어를 위한 체크포인트
|
||||||
|
|
||||||
|
- `01_definition_shell_foundation` predecessor completion이 확인되었는지 본다.
|
||||||
|
- Overview 핵심 문자열과 refresh action guard가 유지되는지 확인한다.
|
||||||
|
- Runner self-update validation/callback/feedback behavior가 보존되는지 확인한다.
|
||||||
|
- Job create submit guard, callback, execution navigation이 보존되는지 확인한다.
|
||||||
|
- Settings fallback이 endpoint/policy detail을 잃지 않았는지 확인한다.
|
||||||
|
- 이 plan이 Roadmap task 완료나 agent-ui `구현됨` status 전환을 주장하지 않는지 확인한다.
|
||||||
|
|
||||||
|
## 검증 결과
|
||||||
|
|
||||||
|
_구현 에이전트가 각 중간 검증 및 최종 검증 명령 실행 후 출력을 여기에 붙여 넣는다._
|
||||||
|
|
||||||
|
필수 규칙:
|
||||||
|
- 검증 명령은 고정된 계약이다. 임의로 대체하지 않는다.
|
||||||
|
- 대체가 필요하면 `계획 대비 변경 사항`에 이유와 대체 명령을 기록한다.
|
||||||
|
- `검증 결과`에는 실제 stdout/stderr를 붙여 넣는다.
|
||||||
|
|
||||||
|
### LAYOUT-1 중간 검증
|
||||||
|
```
|
||||||
|
$ cd packages/flutter/oto_console && flutter test
|
||||||
|
(output)
|
||||||
|
```
|
||||||
|
|
||||||
|
### LAYOUT-2 중간 검증
|
||||||
|
```
|
||||||
|
$ cd apps/client && flutter test
|
||||||
|
(output)
|
||||||
|
```
|
||||||
|
|
||||||
|
### LAYOUT-3 중간 검증
|
||||||
|
```
|
||||||
|
$ cd packages/flutter/oto_console && flutter test
|
||||||
|
(output)
|
||||||
|
```
|
||||||
|
|
||||||
|
### LAYOUT-4 중간 검증
|
||||||
|
```
|
||||||
|
$ cd apps/client && flutter test
|
||||||
|
(output)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 최종 검증
|
||||||
|
```
|
||||||
|
$ git diff --check
|
||||||
|
(output)
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
$ ssh -o BatchMode=yes -o ConnectTimeout=10 toki@toki-labs.com 'cd /Users/toki/agent-work/oto && printf "workdir=%s\n" "$PWD" && printf "branch=" && git rev-parse --abbrev-ref HEAD && printf "head=" && git rev-parse --short HEAD && printf "status-start\n" && git status --short && printf "status-end\n" && command -v flutter && flutter --version | head -n 1'
|
||||||
|
(output)
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
$ ssh -o BatchMode=yes -o ConnectTimeout=10 toki@toki-labs.com 'cd /Users/toki/agent-work/oto/packages/flutter/oto_console && flutter analyze && flutter test'
|
||||||
|
(output)
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
$ ssh -o BatchMode=yes -o ConnectTimeout=10 toki@toki-labs.com 'cd /Users/toki/agent-work/oto/apps/client && flutter analyze && flutter test'
|
||||||
|
(output)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
> **[IMPLEMENTING AGENT — BEFORE SAVING] Have you filled in every implementation-owned section: completion table, implementation checklist, changes from plan, design decisions, and verification output?**
|
||||||
|
> If anything is blank, go back and fill it in before saving this file.
|
||||||
|
> Leave review-agent-only sections unchanged.
|
||||||
|
|
||||||
|
## Ownership
|
||||||
|
|
||||||
|
| Section | Owner | Note |
|
||||||
|
|---------|-------|------|
|
||||||
|
| Header comment, 개요, 리뷰 에이전트 지시 | Fixed at stub creation | Implementing agent must not modify or execute archive/finalization steps |
|
||||||
|
| 구현 항목별 완료 여부 | Implementing agent | Check `[ ]` to `[x]` only |
|
||||||
|
| 구현 체크리스트 | Implementing agent | Check `[ ]` to `[x]` only |
|
||||||
|
| 코드리뷰 전용 체크리스트 | Review agent only | Implementing agent must not modify |
|
||||||
|
| 계획 대비 변경 사항, 주요 설계 결정 | Implementing agent | Replace placeholder text with actual content |
|
||||||
|
| 사용자 리뷰 요청 | Implementing agent | Keep `상태: 없음` unless selected Milestone lock decision blocks implementation |
|
||||||
|
| 리뷰어를 위한 체크포인트 | Fixed at stub creation | Review focus |
|
||||||
|
| 검증 결과 | Implementing agent | Fill command output only |
|
||||||
|
|
@ -0,0 +1,369 @@
|
||||||
|
<!-- task=m-control-plane-jenkins-aligned-layout-pass/02+01_primary_views plan=0 tag=LAYOUT -->
|
||||||
|
|
||||||
|
# Plan - LAYOUT Primary Views
|
||||||
|
|
||||||
|
## 이 파일을 읽는 구현 에이전트에게
|
||||||
|
|
||||||
|
`CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션 작성은 필수다. 구현 후 검증을 실행하고 실제 변경 내용, 설계 결정, 명령 출력, 체크리스트를 채운 뒤 active 파일을 그대로 둔 상태로 리뷰 준비를 보고한다. 최종 판정, log rename, `complete.log`, archive 이동은 code-review 전용이다.
|
||||||
|
|
||||||
|
선택된 Milestone `구현 잠금 > 결정 필요` 항목 때문에 막힌 경우에만 review stub의 `사용자 리뷰 요청` 섹션을 정확한 연결 근거와 함께 채우고 멈춘다. 구현 중 사용자에게 직접 묻거나, 선택지를 제시하거나, `request_user_input`을 호출하거나, `USER_REVIEW.md`/`complete.log`를 만들지 않는다. 환경/secret/service 차단, 일반 범위 변경, 검증 evidence 공백은 사용자 리뷰 요청이 아니라 검증 결과 또는 follow-up 대상이다.
|
||||||
|
|
||||||
|
## 배경
|
||||||
|
|
||||||
|
`01_definition_shell_foundation`이 shell/header/fallback foundation을 만든 뒤, primary 운영 view 네 개를 agent-ui Target Layout Delta에 맞춰 코드로 반영한다. 현재 `overview`, `runners`, `pipelines`, `settings`는 centered list/card layout 또는 generic fallback 상태라 Jenkins-style 운영 밀도 기준과 다르다.
|
||||||
|
|
||||||
|
## 사용자 리뷰 요청 흐름
|
||||||
|
|
||||||
|
구현 중 직접 사용자에게 묻지 않는다. 선택된 Milestone의 `구현 잠금 > 결정 필요` 항목이 실구현을 차단할 때만 active review stub의 `사용자 리뷰 요청`에 기록하고, code-review가 검증 후 실제 `USER_REVIEW.md` 생성을 맡는다.
|
||||||
|
|
||||||
|
## 분석 결과
|
||||||
|
|
||||||
|
### 읽은 파일
|
||||||
|
|
||||||
|
- `agent-ops/rules/project/rules.md`
|
||||||
|
- `agent-ops/rules/common/rules-roadmap.md`
|
||||||
|
- `agent-ops/skills/common/router.md`
|
||||||
|
- `agent-ops/skills/common/plan/SKILL.md`
|
||||||
|
- `agent-ops/skills/common/sync-agent-ui/SKILL.md`
|
||||||
|
- `agent-test/local/rules.md`
|
||||||
|
- `agent-test/local/framework-smoke.md`
|
||||||
|
- `agent-roadmap/current.md`
|
||||||
|
- `agent-roadmap/phase/control-plane-product-surface/PHASE.md`
|
||||||
|
- `agent-roadmap/phase/control-plane-product-surface/milestones/control-plane-jenkins-aligned-layout-pass.md`
|
||||||
|
- `agent-ui/definition/views/overview/index.md`
|
||||||
|
- `agent-ui/definition/views/runners/index.md`
|
||||||
|
- `agent-ui/definition/views/pipelines/index.md`
|
||||||
|
- `agent-ui/definition/views/settings/index.md`
|
||||||
|
- `agent-ui/definition/components/state-panel/index.md`
|
||||||
|
- `agent-ui/definition/components/status-badge/index.md`
|
||||||
|
- `agent-ui/definition/components/record-list/index.md`
|
||||||
|
- `agent-ui/definition/components/action-feedback/index.md`
|
||||||
|
- `agent-ui/definition/components/runner-self-update-form/index.md`
|
||||||
|
- `agent-ui/definition/components/job-create-form/index.md`
|
||||||
|
- `packages/flutter/oto_console/lib/src/oto_console_contract.dart`
|
||||||
|
- `packages/flutter/oto_console/lib/src/oto_console_shell.dart`
|
||||||
|
- `packages/flutter/oto_console/lib/src/oto_console_overview.dart`
|
||||||
|
- `packages/flutter/oto_console/lib/src/oto_runners_surface.dart`
|
||||||
|
- `packages/flutter/oto_console/lib/src/oto_jobs_surface.dart`
|
||||||
|
- `apps/client/lib/src/app/oto_client_app.dart`
|
||||||
|
- `packages/flutter/oto_console/test/oto_console_test.dart`
|
||||||
|
- `apps/client/test/widget_test.dart`
|
||||||
|
|
||||||
|
### SDD 기준
|
||||||
|
|
||||||
|
선택 Milestone은 `SDD: 불필요`다. UI layout과 code sync 범위이며 API/proto/config/schema를 바꾸지 않는다.
|
||||||
|
|
||||||
|
### 테스트 환경 규칙
|
||||||
|
|
||||||
|
- `test_env`: local.
|
||||||
|
- `agent-test/local/rules.md`와 `framework-smoke.md`를 읽었다.
|
||||||
|
- Flutter package/app 변경이므로 원격 runner `/Users/toki/agent-work/oto`에서 `packages/flutter/oto_console`와 `apps/client`의 `flutter analyze`, `flutter test`가 필요하다.
|
||||||
|
- 원격 preflight에서 checkout은 접근되지만 `command -v flutter`가 실패했다. 구현자는 원격 Flutter PATH/source sync가 준비되지 않으면 해당 출력과 blocker를 review stub에 남긴다.
|
||||||
|
|
||||||
|
### 테스트 커버리지 공백
|
||||||
|
|
||||||
|
- Overview: 기존 테스트는 `Build Operations Overview`, `CORE ONLINE`, `Health`, `Readiness`를 검증한다. status-first dashboard layout은 신규/갱신 assertion 필요.
|
||||||
|
- Runners: 기존 테스트는 loading/empty/error/data, self-update validation/action state를 검증한다. row density/action panel로 바꿔도 draft guard와 feedback assertion을 유지해야 한다.
|
||||||
|
- Pipelines: 기존 테스트는 create form, job list, execution link, action states를 검증한다. compact create panel로 바꿔도 form field count와 submit guard를 유지해야 한다.
|
||||||
|
- Settings: 기존 shell fallback 테스트는 `No local preferences`, `Browser API policy`, `same-origin proxy`를 검증한다. grouped settings로 바꿔도 유지해야 한다.
|
||||||
|
|
||||||
|
### 심볼 참조
|
||||||
|
|
||||||
|
삭제/rename 예정 symbol은 없다. `OtoConsoleOverview`, `OtoRunnersSurface`, `OtoJobsSurface`, `OtoConsoleSectionSurface` public constructors는 유지한다. 호출부는 `apps/client/lib/src/app/oto_client_app.dart`와 package tests에 있다.
|
||||||
|
|
||||||
|
### 분할 판단
|
||||||
|
|
||||||
|
multi-plan output이다. 공유 task group은 `m-control-plane-jenkins-aligned-layout-pass`.
|
||||||
|
|
||||||
|
- `01_definition_shell_foundation`: predecessor. active/archive `complete.log`는 현재 missing이다. 이 plan은 directory dependency `02+01` 때문에 01 PASS 후 구현해야 한다.
|
||||||
|
- `02+01_primary_views`: 현재 plan. overview/runners/pipelines/settings만 담당한다.
|
||||||
|
- `03+01,02_execution_artifact_views`: 후속. executions/artifacts와 final view/component layout completion 담당.
|
||||||
|
|
||||||
|
### 범위 결정 근거
|
||||||
|
|
||||||
|
Executions/artifacts/log preview/action toolbar는 이 plan에서 제외한다. agent view body도 제외한다. agent-ui status `구현됨` 전환은 milestone-required completion review로 남긴다.
|
||||||
|
|
||||||
|
### 빌드 등급
|
||||||
|
|
||||||
|
`local-G06`. 네 개 view를 만지지만 Flutter widget 범위가 명확하고 기존 tests가 주요 action/state behavior를 커버한다. 원격 runner Flutter PATH 차단 가능성은 verification blocker로 분리한다.
|
||||||
|
|
||||||
|
## 구현 체크리스트
|
||||||
|
|
||||||
|
- [ ] `01_definition_shell_foundation`의 `complete.log`가 active/archive predecessor로 존재하는지 확인하고 없으면 구현하지 않고 dependency missing을 기록한다.
|
||||||
|
- [ ] `OtoConsoleOverview`를 status-first dashboard layout으로 재배치하되 `Build Operations Overview`, endpoint, health/readiness, auth reference, refresh action을 유지한다.
|
||||||
|
- [ ] `OtoRunnersSurface`를 dense runner record list와 관리 action panel 형태로 재배치하되 self-update validation, callback, success/deferred/failed feedback을 유지한다.
|
||||||
|
- [ ] `OtoJobsSurface`를 compact create panel + dense job list로 재배치하되 create guard, submit callback, execution link navigation을 유지한다.
|
||||||
|
- [ ] Settings fallback을 runtime/security/connectivity group layout으로 정리하되 기존 endpoint/detail 문자열과 no preferences state를 유지한다.
|
||||||
|
- [ ] package/app widget tests를 갱신해 empty/error/data/action state와 primary layout markers를 검증한다.
|
||||||
|
- [ ] 원격 runner preflight와 Flutter analyze/test 계약을 실행하거나, Flutter PATH/source sync 차단이면 실제 출력과 차단 사유를 review stub에 남긴다.
|
||||||
|
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.
|
||||||
|
|
||||||
|
## 의존 관계 및 구현 순서
|
||||||
|
|
||||||
|
디렉터리명 `02+01_primary_views`의 predecessor는 `01_definition_shell_foundation` 하나다. 구현 시작 전 `agent-task/m-control-plane-jenkins-aligned-layout-pass/01_definition_shell_foundation/complete.log` 또는 같은 task group archive의 `01_*` complete log를 확인한다. 현재 작성 시점에는 missing이다.
|
||||||
|
|
||||||
|
### [LAYOUT-1] Overview Status-First Dashboard
|
||||||
|
|
||||||
|
#### 문제
|
||||||
|
|
||||||
|
[packages/flutter/oto_console/lib/src/oto_console_overview.dart](/config/workspace/oto/packages/flutter/oto_console/lib/src/oto_console_overview.dart:28)는 `Center > ConstrainedBox(maxWidth: 840) > ListView` 구조다. agent-ui `overview` Target Layout Delta는 page header, connection status, primary refresh action, controller monitor summary를 한 줄 우선순위로 정렬해야 한다.
|
||||||
|
|
||||||
|
#### 해결 방법
|
||||||
|
|
||||||
|
Header/status/refresh를 상단 context row로 통합하고, connection status grid를 endpoints보다 먼저 스캔 가능한 summary band로 올린다. 기존 private `_StatusBadge`, `_EndpointTile`, `_ConnectionGrid`는 재사용하되 배치만 바꾼다.
|
||||||
|
|
||||||
|
Before:
|
||||||
|
|
||||||
|
```dart
|
||||||
|
// oto_console_overview.dart:28
|
||||||
|
return Container(
|
||||||
|
color: theme.backgroundColor,
|
||||||
|
padding: const EdgeInsets.all(24),
|
||||||
|
child: Center(
|
||||||
|
child: ConstrainedBox(
|
||||||
|
constraints: const BoxConstraints(maxWidth: 840),
|
||||||
|
child: ListView(
|
||||||
|
children: [
|
||||||
|
LayoutBuilder(... title + badge ...),
|
||||||
|
const SizedBox(height: 32),
|
||||||
|
_SectionHeader(title: 'CORE API ENDPOINTS', ...),
|
||||||
|
```
|
||||||
|
|
||||||
|
After:
|
||||||
|
|
||||||
|
```dart
|
||||||
|
return _OperationalPageBody(
|
||||||
|
theme: theme,
|
||||||
|
children: [
|
||||||
|
_OverviewHeader(
|
||||||
|
title: 'Build Operations Overview',
|
||||||
|
statusBadge: _StatusBadge(label: _statusLabel, color: statusColor),
|
||||||
|
onRefresh: onRefresh,
|
||||||
|
),
|
||||||
|
_ConnectionGrid(theme: theme, connection: connection),
|
||||||
|
_OperationalSection(title: 'Core API endpoints', children: [...]),
|
||||||
|
_OperationalSection(title: 'Authentication', children: [...]),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 수정 파일 및 체크리스트
|
||||||
|
|
||||||
|
- [ ] `packages/flutter/oto_console/lib/src/oto_console_overview.dart`: status-first layout 재배치.
|
||||||
|
- [ ] `packages/flutter/oto_console/test/oto_console_test.dart`: overview smoke 갱신.
|
||||||
|
- [ ] `apps/client/test/widget_test.dart`: host overview smoke 갱신.
|
||||||
|
|
||||||
|
#### 테스트 작성
|
||||||
|
|
||||||
|
기존 overview tests를 유지/갱신한다. `Build Operations Overview`, `CORE ONLINE`, `Health`, `Readiness`, refresh button이 있는 경우 `Refresh`가 렌더링되는지 검증한다.
|
||||||
|
|
||||||
|
#### 중간 검증
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd packages/flutter/oto_console && flutter test
|
||||||
|
```
|
||||||
|
|
||||||
|
예상: package widget tests PASS 또는 원격 Flutter blocker 기록.
|
||||||
|
|
||||||
|
### [LAYOUT-2] Runners Dense List And Action Panel
|
||||||
|
|
||||||
|
#### 문제
|
||||||
|
|
||||||
|
[packages/flutter/oto_console/lib/src/oto_runners_surface.dart](/config/workspace/oto/packages/flutter/oto_console/lib/src/oto_runners_surface.dart:46)는 centered maxWidth card layout이고, [self-update form](/config/workspace/oto/packages/flutter/oto_console/lib/src/oto_runners_surface.dart:336)은 row 내부에 항상 펼쳐진다. agent-ui는 Jenkins Nodes/Agents처럼 runner id/status/context를 먼저 스캔하고 self-update를 관리 action 영역으로 묶도록 요구한다.
|
||||||
|
|
||||||
|
#### 해결 방법
|
||||||
|
|
||||||
|
List row는 primary id/status/context/message를 dense하게 정리하고, self-update form은 row 하단 action panel로 구분한다. callback/validation 로직은 그대로 유지한다.
|
||||||
|
|
||||||
|
Before:
|
||||||
|
|
||||||
|
```dart
|
||||||
|
// oto_runners_surface.dart:222
|
||||||
|
return Container(
|
||||||
|
padding: const EdgeInsets.all(16),
|
||||||
|
decoration: BoxDecoration(...),
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
Row(... 'ID: ${runner.runnerID}' ... _StatusBadge ...),
|
||||||
|
if (widget.onSelfUpdateRunner != null) _buildSelfUpdateForm(...),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
```
|
||||||
|
|
||||||
|
After:
|
||||||
|
|
||||||
|
```dart
|
||||||
|
return _RecordRow(
|
||||||
|
title: runner.runnerID,
|
||||||
|
subtitle: runner.alias,
|
||||||
|
status: _StatusBadge(status: runner.status, theme: theme),
|
||||||
|
metadata: _RunnerContext(jobID: runner.currentJobID, executionID: runner.currentExecutionID),
|
||||||
|
message: runner.message,
|
||||||
|
actionPanel: widget.onSelfUpdateRunner == null ? null : _buildSelfUpdateForm(...),
|
||||||
|
);
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 수정 파일 및 체크리스트
|
||||||
|
|
||||||
|
- [ ] `packages/flutter/oto_console/lib/src/oto_runners_surface.dart`: dense row/action panel layout.
|
||||||
|
- [ ] `packages/flutter/oto_console/test/oto_console_test.dart`: runner data/action states 갱신.
|
||||||
|
- [ ] `apps/client/test/widget_test.dart`: client runner self-update tests 갱신.
|
||||||
|
|
||||||
|
#### 테스트 작성
|
||||||
|
|
||||||
|
기존 runner empty/error/data/self-update tests를 갱신한다. `ID: runner-1`, `ACTIVE`, current job/execution, `Self Update`, disabled/enabled `Update`, deferred/failed feedback assertion을 유지한다.
|
||||||
|
|
||||||
|
#### 중간 검증
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd apps/client && flutter test
|
||||||
|
```
|
||||||
|
|
||||||
|
예상: app runner wiring tests PASS 또는 원격 Flutter blocker 기록.
|
||||||
|
|
||||||
|
### [LAYOUT-3] Pipelines Create Panel And Dense Job Rows
|
||||||
|
|
||||||
|
#### 문제
|
||||||
|
|
||||||
|
[packages/flutter/oto_console/lib/src/oto_jobs_surface.dart](/config/workspace/oto/packages/flutter/oto_console/lib/src/oto_jobs_surface.dart:48)는 title, wide create form, card list 순서다. agent-ui는 Jenkins Dashboard/New Item flow처럼 create entry point와 job row 비교가 분리된 compact layout을 요구한다.
|
||||||
|
|
||||||
|
#### 해결 방법
|
||||||
|
|
||||||
|
Create form은 compact panel로 감싸고 list context와 시각적으로 분리한다. Job row는 name/id/state/execution link를 같은 dense anatomy로 정리한다.
|
||||||
|
|
||||||
|
Before:
|
||||||
|
|
||||||
|
```dart
|
||||||
|
// oto_jobs_surface.dart:78
|
||||||
|
if (widget.jobCreateState != null) ...[
|
||||||
|
_buildJobCreateForm(context, theme),
|
||||||
|
const SizedBox(height: 20),
|
||||||
|
],
|
||||||
|
Expanded(child: _buildContent(context, theme)),
|
||||||
|
```
|
||||||
|
|
||||||
|
After:
|
||||||
|
|
||||||
|
```dart
|
||||||
|
children: [
|
||||||
|
if (widget.jobCreateState != null)
|
||||||
|
_CreatePanel(child: _buildJobCreateForm(context, theme)),
|
||||||
|
Expanded(child: _buildContent(context, theme)),
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 수정 파일 및 체크리스트
|
||||||
|
|
||||||
|
- [ ] `packages/flutter/oto_console/lib/src/oto_jobs_surface.dart`: create panel/list row layout.
|
||||||
|
- [ ] `packages/flutter/oto_console/test/oto_console_test.dart`: jobs surface tests 갱신.
|
||||||
|
- [ ] `apps/client/test/widget_test.dart`: job create and pipeline navigation tests 갱신.
|
||||||
|
|
||||||
|
#### 테스트 작성
|
||||||
|
|
||||||
|
기존 create action tests를 유지한다. `Create New Job`, 두 `TextField`, disabled/enabled `Create`, success/failed feedback, `Execution: <id>` tap callback을 검증한다.
|
||||||
|
|
||||||
|
#### 중간 검증
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd packages/flutter/oto_console && flutter test
|
||||||
|
```
|
||||||
|
|
||||||
|
예상: package jobs tests PASS 또는 원격 Flutter blocker 기록.
|
||||||
|
|
||||||
|
### [LAYOUT-4] Settings Runtime Groups
|
||||||
|
|
||||||
|
#### 문제
|
||||||
|
|
||||||
|
[packages/flutter/oto_console/lib/src/oto_console_shell.dart](/config/workspace/oto/packages/flutter/oto_console/lib/src/oto_console_shell.dart:120)는 settings override가 없으면 generic `OtoConsoleSectionSurface`에 `No local preferences`와 detail rows를 넣는다. agent-ui `settings`는 Manage Jenkins-style runtime/security/connectivity grouping을 요구한다.
|
||||||
|
|
||||||
|
#### 해결 방법
|
||||||
|
|
||||||
|
`OtoConsoleSectionSurface` detail-present variant를 group heading + detail rows로 재배치한다. Settings fallback은 HTTP API/Wire URL/Browser API policy를 group label 아래에 표시한다.
|
||||||
|
|
||||||
|
Before:
|
||||||
|
|
||||||
|
```dart
|
||||||
|
// oto_console_shell.dart:120
|
||||||
|
OtoConsoleSectionSurface(
|
||||||
|
icon: Icons.tune,
|
||||||
|
title: 'Settings',
|
||||||
|
emptyTitle: 'No local preferences',
|
||||||
|
emptyMessage: 'Settings are using runtime defaults.',
|
||||||
|
details: [...],
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
After:
|
||||||
|
|
||||||
|
```dart
|
||||||
|
OtoConsoleSectionSurface(
|
||||||
|
icon: Icons.tune,
|
||||||
|
title: 'Settings',
|
||||||
|
emptyTitle: 'No local preferences',
|
||||||
|
emptyMessage: 'Settings are using runtime defaults.',
|
||||||
|
detailGroups: [
|
||||||
|
OtoConsoleSectionDetailGroup(title: 'Runtime endpoints', details: [...]),
|
||||||
|
OtoConsoleSectionDetailGroup(title: 'Browser policy', details: [...]),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
Public API를 새로 노출하지 않는 private/internal 구조로 구현한다. 기존 `details` constructor는 유지한다.
|
||||||
|
|
||||||
|
#### 수정 파일 및 체크리스트
|
||||||
|
|
||||||
|
- [ ] `packages/flutter/oto_console/lib/src/oto_console_shell.dart`: grouped detail variant.
|
||||||
|
- [ ] `packages/flutter/oto_console/test/oto_console_test.dart`: settings fallback assertion 갱신.
|
||||||
|
- [ ] `apps/client/test/widget_test.dart`: settings navigation smoke 갱신.
|
||||||
|
|
||||||
|
#### 테스트 작성
|
||||||
|
|
||||||
|
Settings tab 이동 후 `No local preferences`, `HTTP API`, `Wire URL`, `Browser API policy`, `same-origin proxy`를 검증한다.
|
||||||
|
|
||||||
|
#### 중간 검증
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd apps/client && flutter test
|
||||||
|
```
|
||||||
|
|
||||||
|
예상: settings host smoke PASS 또는 원격 Flutter blocker 기록.
|
||||||
|
|
||||||
|
## 수정 파일 요약
|
||||||
|
|
||||||
|
| 파일 | 항목 |
|
||||||
|
|------|------|
|
||||||
|
| `packages/flutter/oto_console/lib/src/oto_console_overview.dart` | LAYOUT-1 |
|
||||||
|
| `packages/flutter/oto_console/lib/src/oto_runners_surface.dart` | LAYOUT-2 |
|
||||||
|
| `packages/flutter/oto_console/lib/src/oto_jobs_surface.dart` | LAYOUT-3 |
|
||||||
|
| `packages/flutter/oto_console/lib/src/oto_console_shell.dart` | LAYOUT-4 |
|
||||||
|
| `packages/flutter/oto_console/test/oto_console_test.dart` | LAYOUT-1, LAYOUT-2, LAYOUT-3, LAYOUT-4 |
|
||||||
|
| `apps/client/test/widget_test.dart` | LAYOUT-1, LAYOUT-2, LAYOUT-3, LAYOUT-4 |
|
||||||
|
|
||||||
|
## 최종 검증
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git diff --check
|
||||||
|
```
|
||||||
|
|
||||||
|
예상: PASS.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ssh -o BatchMode=yes -o ConnectTimeout=10 toki@toki-labs.com 'cd /Users/toki/agent-work/oto && printf "workdir=%s\n" "$PWD" && printf "branch=" && git rev-parse --abbrev-ref HEAD && printf "head=" && git rev-parse --short HEAD && printf "status-start\n" && git status --short && printf "status-end\n" && command -v flutter && flutter --version | head -n 1'
|
||||||
|
```
|
||||||
|
|
||||||
|
예상: 원격 runner Flutter 경로와 source sync 상태 확인. 현재 사전 확인에서는 Flutter PATH 실패 상태다.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ssh -o BatchMode=yes -o ConnectTimeout=10 toki@toki-labs.com 'cd /Users/toki/agent-work/oto/packages/flutter/oto_console && flutter analyze && flutter test'
|
||||||
|
```
|
||||||
|
|
||||||
|
예상: 원격 runner Flutter 준비 및 source sync 후 PASS.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ssh -o BatchMode=yes -o ConnectTimeout=10 toki@toki-labs.com 'cd /Users/toki/agent-work/oto/apps/client && flutter analyze && flutter test'
|
||||||
|
```
|
||||||
|
|
||||||
|
예상: 원격 runner Flutter 준비 및 source sync 후 PASS.
|
||||||
|
|
||||||
|
모든 코드 변경 완료 후 반드시 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 채운다. 이 파일 작성이 구현의 마지막 단계다.
|
||||||
|
|
@ -0,0 +1,210 @@
|
||||||
|
<!-- task=m-control-plane-jenkins-aligned-layout-pass/03+01,02_execution_artifact_views plan=0 tag=LAYOUT -->
|
||||||
|
|
||||||
|
# Code Review Reference - LAYOUT
|
||||||
|
|
||||||
|
> **[IMPLEMENTING AGENT — READ FIRST] Filling in this file is the mandatory final step of implementation.**
|
||||||
|
> The task is NOT complete until every implementation-owned section below is filled in.
|
||||||
|
> Complete the `구현 체크리스트`; the final checklist item is mandatory before saving.
|
||||||
|
> Fill implementation-owned sections, then stop with active files in place and report ready for review.
|
||||||
|
> If implementation is blocked by a selected Milestone `구현 잠금 > 결정 필요` item, fill `사용자 리뷰 요청` with linked evidence and stop with active files in place; code-review decides whether to write `USER_REVIEW.md`. Environment/secret/service blockers, generic scope changes, repeated failures, and evidence gaps that a follow-up agent can close are normal follow-up issues, not user-review blockers by themselves.
|
||||||
|
> Do not ask the user directly, present choices in chat, or call `request_user_input` during implementation; record only Milestone lock decisions in `사용자 리뷰 요청` and stop for code-review.
|
||||||
|
> Finalization (`코드리뷰 결과`, log rename, `complete.log`, archive moves, `코드리뷰 전용 체크리스트`) is review-agent-only, even after compaction/resume.
|
||||||
|
> Follow the ownership table at the bottom of this file for which sections you own.
|
||||||
|
|
||||||
|
## 개요
|
||||||
|
|
||||||
|
date=2026-07-02
|
||||||
|
task=m-control-plane-jenkins-aligned-layout-pass/03+01,02_execution_artifact_views, plan=0, tag=LAYOUT
|
||||||
|
|
||||||
|
## Roadmap Targets
|
||||||
|
|
||||||
|
- Milestone: `agent-roadmap/phase/control-plane-product-surface/milestones/control-plane-jenkins-aligned-layout-pass.md`
|
||||||
|
- Task ids:
|
||||||
|
- `view-layout`: `overview`, `runners`, `pipelines`, `executions`, `artifacts`, `settings`를 Target Layout Delta에 맞춰 재배치
|
||||||
|
- `component-layout`: `record-list`, `state-panel`, `status-badge`, `action-feedback`, `execution-action-toolbar`, `log-preview`, `artifact-list`, create/update form의 reusable layout pattern 정리
|
||||||
|
- Completion mode: check-on-pass
|
||||||
|
|
||||||
|
## 이 파일을 읽는 리뷰 에이전트에게
|
||||||
|
|
||||||
|
> **[REVIEW AGENT ONLY]** 아래 종결 절차는 코드리뷰 에이전트 전용이다. 구현 에이전트는 이 섹션을 실행하지 않는다.
|
||||||
|
|
||||||
|
각 항목의 구현을 실제 소스 파일과 대조하고, `검증 결과` 섹션의 출력이 코드와 일치하는지 확인하세요.
|
||||||
|
리뷰 완료는 아래 순서까지 끝난 상태를 의미합니다.
|
||||||
|
|
||||||
|
1. 판정을 append한다.
|
||||||
|
2. `CODE_REVIEW-local-G07.md` → `code_review_local_G07_0.log`, `PLAN-local-G07.md` → `plan_local_G07_0.log`로 아카이브한다.
|
||||||
|
3. PASS이면 `complete.log` 작성 후 active task 디렉터리를 `agent-task/archive/YYYY/MM/m-control-plane-jenkins-aligned-layout-pass/03+01,02_execution_artifact_views/`로 이동한다. WARN/FAIL이면 user-review gate를 확인한 뒤 다음 active plan/review 파일 또는 `USER_REVIEW.md`를 작성한다.
|
||||||
|
4. PASS이고 task group이 `m-<milestone-slug>`이면 완료 이벤트 메타데이터를 보고한다. roadmap 상태 체크와 `update-roadmap` 호출은 런타임 책임이다.
|
||||||
|
5. 적용 가능한 `코드리뷰 전용 체크리스트` 항목을 최종 `.log` 위치에서 체크한 뒤 보고한다.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 구현 항목별 완료 여부
|
||||||
|
|
||||||
|
| 항목 | 완료 여부 |
|
||||||
|
|------|---------|
|
||||||
|
| [LAYOUT-1] Execution List And Selected Detail | [ ] |
|
||||||
|
| [LAYOUT-2] Execution Action Toolbar And Feedback | [ ] |
|
||||||
|
| [LAYOUT-3] Log And Artifact Panes | [ ] |
|
||||||
|
| [LAYOUT-4] Artifacts Browser Anatomy | [ ] |
|
||||||
|
|
||||||
|
## 구현 체크리스트
|
||||||
|
|
||||||
|
- [ ] `01_definition_shell_foundation`과 `02+01_primary_views`의 `complete.log`가 active/archive predecessor로 존재하는지 확인하고 없으면 구현하지 않고 dependency missing을 기록한다.
|
||||||
|
- [ ] `OtoExecutionsSurface`를 execution list + selected run detail 관계로 재배치하고, run header/action toolbar/summary placeholder/log pane/artifact pane 순서를 구현한다.
|
||||||
|
- [ ] execution action toolbar에서 cancel/report/log/artifact guard, confirmation dialog, callback payload, submitting/success/failed feedback을 유지한다.
|
||||||
|
- [ ] logs preview를 selected execution detail의 독립 bounded pane으로 재배치하고 loading/empty/error/data states를 유지한다.
|
||||||
|
- [ ] artifacts preview와 artifacts tab을 같은 artifact-list anatomy로 정리하고 name/path ellipsis, empty/error/data states를 유지한다.
|
||||||
|
- [ ] record-list/status-badge/state-panel/action-feedback private reusable pattern을 surface 간 충돌 없이 정리한다.
|
||||||
|
- [ ] package/app widget tests를 갱신해 executions/artifacts state, action, navigation, detail preview를 검증한다.
|
||||||
|
- [ ] 원격 runner preflight와 Flutter analyze/test 계약을 실행하거나, Flutter PATH/source sync 차단이면 실제 출력과 차단 사유를 review stub에 남긴다.
|
||||||
|
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.
|
||||||
|
|
||||||
|
## 코드리뷰 전용 체크리스트
|
||||||
|
|
||||||
|
> **[REVIEW AGENT ONLY]** 이 체크리스트는 코드리뷰 에이전트만 사용한다.
|
||||||
|
> 구현 에이전트는 이 섹션을 수정하거나 체크하지 않는다.
|
||||||
|
|
||||||
|
- [ ] `코드리뷰 결과`에 `PASS`, `WARN`, `FAIL` 중 하나의 판정을 append한다.
|
||||||
|
- [ ] 판정과 `차원별 평가`, Required/Suggested/Nit 분류가 서로 일치한다.
|
||||||
|
- [ ] active `CODE_REVIEW-*-G??.md`를 `code_review_local_G07_0.log`로 아카이브한다.
|
||||||
|
- [ ] active `PLAN-*-G??.md`를 `plan_local_G07_0.log`로 아카이브한다.
|
||||||
|
- [ ] `.gitignore`의 Agent-Ops 관리 block이 `agent-task/**/*.md`와 `agent-task/**/*.log`를 unignore하고 `agent-roadmap/current.md`를 ignore하는지 확인한다.
|
||||||
|
- [ ] PASS이면 `agent-ops/skills/common/code-review/templates/complete-log-template.md` 기준으로 `complete.log`를 작성하고 active `.md` 파일을 남기지 않는다.
|
||||||
|
- [ ] PASS이면 active task 디렉터리 `agent-task/m-control-plane-jenkins-aligned-layout-pass/03+01,02_execution_artifact_views/`를 `agent-task/archive/YYYY/MM/m-control-plane-jenkins-aligned-layout-pass/03+01,02_execution_artifact_views/`로 이동하고 최종 archive 경로에서 이 체크리스트를 갱신한다.
|
||||||
|
- [ ] PASS이고 task group이 `m-<milestone-slug>`이면 런타임이 읽을 완료 이벤트 메타데이터를 보고하고, roadmap 수정이나 `update-roadmap` 직접 호출을 하지 않는다.
|
||||||
|
- [ ] PASS split 작업이면 이동 후 빈 active parent `agent-task/m-control-plane-jenkins-aligned-layout-pass/`를 제거하거나, 남은 sibling/file이 있어 유지했다고 확인한다.
|
||||||
|
- [ ] WARN/FAIL이고 user-review gate가 트리거되지 않았으면 다음 active `PLAN-local-G07.md`와 `CODE_REVIEW-local-G07.md`를 작성하고 `complete.log`를 작성하지 않는다.
|
||||||
|
- [ ] USER_REVIEW이면 `agent-ops/skills/common/code-review/templates/user-review-template.md` 기준으로 `USER_REVIEW.md`를 작성하고 active `PLAN-*.md`, `CODE_REVIEW-*.md`, `complete.log`를 남기지 않는다.
|
||||||
|
- [ ] USER_REVIEW가 연결된 Milestone 결정으로 완료/PASS 해소되면 `USER_REVIEW.md`를 해소 상태로 갱신하고 `complete.log`를 작성한 뒤 task directory를 archive로 이동한다.
|
||||||
|
|
||||||
|
## 계획 대비 변경 사항
|
||||||
|
|
||||||
|
_구현 에이전트가 계획과 다르게 구현한 부분을 이유와 함께 기록한다._
|
||||||
|
|
||||||
|
## 주요 설계 결정
|
||||||
|
|
||||||
|
_구현 에이전트가 주요 설계 결정 사항을 기록한다._
|
||||||
|
|
||||||
|
## 사용자 리뷰 요청
|
||||||
|
|
||||||
|
_기본값은 `없음`이다. 구현 중 새 결정이 필요해 보여도 직접 질문하거나 선택지를 제시하거나 `request_user_input`을 호출하지 않는다. 이 섹션은 선택된 Milestone `구현 잠금 > 결정 필요` 항목이 실구현을 차단할 때만 채운다. 외부 환경/secret/서비스 준비, 검증 증거 공백, 반복 실패, 일반 범위 조정은 사용자 리뷰 요청이 아니며 `검증 결과`, `계획 대비 변경 사항`, 또는 code-review의 일반 follow-up plan으로 처리한다._
|
||||||
|
|
||||||
|
- 상태: 없음
|
||||||
|
- 사유 유형: 없음
|
||||||
|
- 연결 대상: 없음
|
||||||
|
- 결정 필요: 없음
|
||||||
|
- 차단 근거: 없음
|
||||||
|
- 실행한 검증/명령: 없음
|
||||||
|
- 자동 후속 불가 이유: 없음
|
||||||
|
- 재개 조건: 없음
|
||||||
|
|
||||||
|
## 리뷰어를 위한 체크포인트
|
||||||
|
|
||||||
|
- `01`과 `02` predecessor completion이 확인되었는지 본다.
|
||||||
|
- Execution row tap/selected detail behavior와 callback payload가 유지되는지 확인한다.
|
||||||
|
- Cancel confirmation, disabled unknown runner, success refresh/failure no-refresh behavior가 보존되는지 확인한다.
|
||||||
|
- Logs/artifacts empty/error/data strings가 기존 tests와 의미상 일치하는지 확인한다.
|
||||||
|
- Artifact path가 과도하게 노출되거나 download/content preview가 scope creep으로 들어오지 않았는지 확인한다.
|
||||||
|
- Roadmap Targets가 `view-layout`, `component-layout`만 주장하며 agent-ui status 전환을 하지 않는지 확인한다.
|
||||||
|
|
||||||
|
## 검증 결과
|
||||||
|
|
||||||
|
_구현 에이전트가 각 중간 검증 및 최종 검증 명령 실행 후 출력을 여기에 붙여 넣는다._
|
||||||
|
|
||||||
|
필수 규칙:
|
||||||
|
- 검증 명령은 고정된 계약이다. 임의로 대체하지 않는다.
|
||||||
|
- 대체가 필요하면 `계획 대비 변경 사항`에 이유와 대체 명령을 기록한다.
|
||||||
|
- `검증 결과`에는 실제 stdout/stderr를 붙여 넣는다.
|
||||||
|
|
||||||
|
### LAYOUT-1 중간 검증
|
||||||
|
```
|
||||||
|
$ cd packages/flutter/oto_console && flutter test
|
||||||
|
(output)
|
||||||
|
```
|
||||||
|
|
||||||
|
### LAYOUT-2 중간 검증
|
||||||
|
```
|
||||||
|
$ cd apps/client && flutter test
|
||||||
|
(output)
|
||||||
|
```
|
||||||
|
|
||||||
|
### LAYOUT-3 중간 검증
|
||||||
|
```
|
||||||
|
$ cd packages/flutter/oto_console && flutter test
|
||||||
|
(output)
|
||||||
|
```
|
||||||
|
|
||||||
|
### LAYOUT-4 중간 검증
|
||||||
|
```
|
||||||
|
$ cd apps/client && flutter test
|
||||||
|
(output)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 최종 검증
|
||||||
|
```
|
||||||
|
$ git diff --check
|
||||||
|
(output)
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
$ python3 - <<'PY'
|
||||||
|
from pathlib import Path
|
||||||
|
targets = [
|
||||||
|
'agent-ui/definition/views/overview/index.md',
|
||||||
|
'agent-ui/definition/views/runners/index.md',
|
||||||
|
'agent-ui/definition/views/pipelines/index.md',
|
||||||
|
'agent-ui/definition/views/executions/index.md',
|
||||||
|
'agent-ui/definition/views/artifacts/index.md',
|
||||||
|
'agent-ui/definition/views/settings/index.md',
|
||||||
|
'agent-ui/definition/components/record-list/index.md',
|
||||||
|
'agent-ui/definition/components/state-panel/index.md',
|
||||||
|
'agent-ui/definition/components/status-badge/index.md',
|
||||||
|
'agent-ui/definition/components/action-feedback/index.md',
|
||||||
|
'agent-ui/definition/components/execution-action-toolbar/index.md',
|
||||||
|
'agent-ui/definition/components/log-preview/index.md',
|
||||||
|
'agent-ui/definition/components/artifact-list/index.md',
|
||||||
|
]
|
||||||
|
for p in targets:
|
||||||
|
text = Path(p).read_text()
|
||||||
|
if 'status: 계획' not in text and 'Status: `계획`' not in text:
|
||||||
|
raise SystemExit(f'agent-ui status should remain 계획 until milestone completion review: {p}')
|
||||||
|
print('agent-ui implementation targets remain plan-state for milestone review')
|
||||||
|
PY
|
||||||
|
(output)
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
$ ssh -o BatchMode=yes -o ConnectTimeout=10 toki@toki-labs.com 'cd /Users/toki/agent-work/oto && printf "workdir=%s\n" "$PWD" && printf "branch=" && git rev-parse --abbrev-ref HEAD && printf "head=" && git rev-parse --short HEAD && printf "status-start\n" && git status --short && printf "status-end\n" && command -v flutter && flutter --version | head -n 1'
|
||||||
|
(output)
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
$ ssh -o BatchMode=yes -o ConnectTimeout=10 toki@toki-labs.com 'cd /Users/toki/agent-work/oto/packages/flutter/oto_console && flutter analyze && flutter test'
|
||||||
|
(output)
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
$ ssh -o BatchMode=yes -o ConnectTimeout=10 toki@toki-labs.com 'cd /Users/toki/agent-work/oto/apps/client && flutter analyze && flutter test'
|
||||||
|
(output)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
> **[IMPLEMENTING AGENT — BEFORE SAVING] Have you filled in every implementation-owned section: completion table, implementation checklist, changes from plan, design decisions, and verification output?**
|
||||||
|
> If anything is blank, go back and fill it in before saving this file.
|
||||||
|
> Leave review-agent-only sections unchanged.
|
||||||
|
|
||||||
|
## Ownership
|
||||||
|
|
||||||
|
| Section | Owner | Note |
|
||||||
|
|---------|-------|------|
|
||||||
|
| Header comment, 개요, 리뷰 에이전트 지시 | Fixed at stub creation | Implementing agent must not modify or execute archive/finalization steps |
|
||||||
|
| Roadmap Targets | Fixed at stub creation from plan | Implementing agent must not modify |
|
||||||
|
| 구현 항목별 완료 여부 | Implementing agent | Check `[ ]` to `[x]` only |
|
||||||
|
| 구현 체크리스트 | Implementing agent | Check `[ ]` to `[x]` only |
|
||||||
|
| 코드리뷰 전용 체크리스트 | Review agent only | Implementing agent must not modify |
|
||||||
|
| 계획 대비 변경 사항, 주요 설계 결정 | Implementing agent | Replace placeholder text with actual content |
|
||||||
|
| 사용자 리뷰 요청 | Implementing agent | Keep `상태: 없음` unless selected Milestone lock decision blocks implementation |
|
||||||
|
| 리뷰어를 위한 체크포인트 | Fixed at stub creation | Review focus |
|
||||||
|
| 검증 결과 | Implementing agent | Fill command output only |
|
||||||
|
|
@ -0,0 +1,396 @@
|
||||||
|
<!-- task=m-control-plane-jenkins-aligned-layout-pass/03+01,02_execution_artifact_views plan=0 tag=LAYOUT -->
|
||||||
|
|
||||||
|
# Plan - LAYOUT Execution And Artifact Views
|
||||||
|
|
||||||
|
## 이 파일을 읽는 구현 에이전트에게
|
||||||
|
|
||||||
|
`CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션 작성은 필수다. 구현 후 검증을 실행하고 실제 변경 내용, 설계 결정, 명령 출력, 체크리스트를 채운 뒤 active 파일을 그대로 둔 상태로 리뷰 준비를 보고한다. 최종 판정, log rename, `complete.log`, archive 이동은 code-review 전용이다.
|
||||||
|
|
||||||
|
선택된 Milestone `구현 잠금 > 결정 필요` 항목 때문에 막힌 경우에만 review stub의 `사용자 리뷰 요청` 섹션을 정확한 연결 근거와 함께 채우고 멈춘다. 구현 중 사용자에게 직접 묻거나, 선택지를 제시하거나, `request_user_input`을 호출하거나, `USER_REVIEW.md`/`complete.log`를 만들지 않는다. 환경/secret/service 차단, 일반 범위 변경, 검증 evidence 공백은 사용자 리뷰 요청이 아니라 검증 결과 또는 follow-up 대상이다.
|
||||||
|
|
||||||
|
## 배경
|
||||||
|
|
||||||
|
이 subtask는 shell foundation과 primary view rollout 후 남는 execution/artifact 중심 레이아웃을 코드에 반영한다. 현재 execution detail은 expandable card 내부에 actions/logs/artifacts가 섞여 있고, artifacts tab은 단순 icon/name/path row다. agent-ui는 Jenkins Build History + build page, Console Output, Pipeline Graph View, artifact browser 흐름을 러프 참조로 list/detail/pane 구조를 요구한다.
|
||||||
|
|
||||||
|
## 사용자 리뷰 요청 흐름
|
||||||
|
|
||||||
|
구현 중 직접 사용자에게 묻지 않는다. 선택된 Milestone의 `구현 잠금 > 결정 필요` 항목이 실구현을 차단할 때만 active review stub의 `사용자 리뷰 요청`에 기록하고, code-review가 검증 후 실제 `USER_REVIEW.md` 생성을 맡는다.
|
||||||
|
|
||||||
|
## Roadmap Targets
|
||||||
|
|
||||||
|
- Milestone: `agent-roadmap/phase/control-plane-product-surface/milestones/control-plane-jenkins-aligned-layout-pass.md`
|
||||||
|
- Task ids:
|
||||||
|
- `view-layout`: `overview`, `runners`, `pipelines`, `executions`, `artifacts`, `settings`를 Target Layout Delta에 맞춰 재배치
|
||||||
|
- `component-layout`: `record-list`, `state-panel`, `status-badge`, `action-feedback`, `execution-action-toolbar`, `log-preview`, `artifact-list`, create/update form의 reusable layout pattern 정리
|
||||||
|
- Completion mode: check-on-pass
|
||||||
|
|
||||||
|
## 분석 결과
|
||||||
|
|
||||||
|
### 읽은 파일
|
||||||
|
|
||||||
|
- `agent-ops/rules/project/rules.md`
|
||||||
|
- `agent-ops/rules/common/rules-roadmap.md`
|
||||||
|
- `agent-ops/skills/common/router.md`
|
||||||
|
- `agent-ops/skills/common/plan/SKILL.md`
|
||||||
|
- `agent-ops/skills/common/sync-agent-ui/SKILL.md`
|
||||||
|
- `agent-test/local/rules.md`
|
||||||
|
- `agent-test/local/framework-smoke.md`
|
||||||
|
- `agent-roadmap/current.md`
|
||||||
|
- `agent-roadmap/phase/control-plane-product-surface/PHASE.md`
|
||||||
|
- `agent-roadmap/phase/control-plane-product-surface/milestones/control-plane-jenkins-aligned-layout-pass.md`
|
||||||
|
- `agent-ui/definition/views/executions/index.md`
|
||||||
|
- `agent-ui/definition/views/artifacts/index.md`
|
||||||
|
- `agent-ui/definition/components/record-list/index.md`
|
||||||
|
- `agent-ui/definition/components/status-badge/index.md`
|
||||||
|
- `agent-ui/definition/components/state-panel/index.md`
|
||||||
|
- `agent-ui/definition/components/action-feedback/index.md`
|
||||||
|
- `agent-ui/definition/components/execution-action-toolbar/index.md`
|
||||||
|
- `agent-ui/definition/components/log-preview/index.md`
|
||||||
|
- `agent-ui/definition/components/artifact-list/index.md`
|
||||||
|
- `packages/flutter/oto_console/lib/src/oto_console_contract.dart`
|
||||||
|
- `packages/flutter/oto_console/lib/src/oto_executions_surface.dart`
|
||||||
|
- `packages/flutter/oto_console/lib/src/oto_artifacts_surface.dart`
|
||||||
|
- `apps/client/lib/src/app/oto_client_app.dart`
|
||||||
|
- `packages/flutter/oto_console/test/oto_console_test.dart`
|
||||||
|
- `apps/client/test/widget_test.dart`
|
||||||
|
|
||||||
|
### SDD 기준
|
||||||
|
|
||||||
|
선택 Milestone은 `SDD: 불필요`다. 이 plan은 UI layout, action toolbar 배치, log/artifact preview anatomy만 바꾸며 write API contract와 audit source of truth를 바꾸지 않는다. 기존 SDD에서 언급된 raw log/artifact path 민감도는 UI display-safe copy와 ellipsis 유지 기준으로만 반영한다.
|
||||||
|
|
||||||
|
### 테스트 환경 규칙
|
||||||
|
|
||||||
|
- `test_env`: local.
|
||||||
|
- `agent-test/local/rules.md`와 `framework-smoke.md`를 읽었다.
|
||||||
|
- Flutter package/app 변경이므로 원격 runner `/Users/toki/agent-work/oto`에서 `packages/flutter/oto_console`와 `apps/client`의 `flutter analyze`, `flutter test`가 필요하다.
|
||||||
|
- 원격 preflight에서 checkout은 접근되지만 `command -v flutter`가 실패했다. 구현자는 원격 Flutter PATH/source sync가 준비되지 않으면 해당 출력과 blocker를 review stub에 남긴다.
|
||||||
|
|
||||||
|
### 테스트 커버리지 공백
|
||||||
|
|
||||||
|
- Executions: 기존 tests가 loading/empty/error/data, expand detail, action callbacks, disabled unknown runner, success refresh, logs/artifacts empty/error를 커버한다. list/detail 재배치 후에도 tap target과 callbacks가 보존되는지 갱신 필요.
|
||||||
|
- Artifacts: 기존 tests가 loading/empty/error/data와 `Path: ...` 표시를 커버한다. artifact browser anatomy로 바꿔도 name/path assertion을 유지해야 한다.
|
||||||
|
- Component layout: 공통 public widget을 새로 만들지 않으면 private helper 수준이라 기존 widget tests가 behavior 회귀를 잡는다. reusable pattern이 문서와 충돌하지 않는지 code inspection이 필요하다.
|
||||||
|
|
||||||
|
### 심볼 참조
|
||||||
|
|
||||||
|
삭제/rename 예정 symbol은 없다. `OtoExecutionsSurface`, `OtoArtifactsSurface`, `OtoActionViewState`, `OtoExecution*Draft`, `OtoArtifactViewModel` public contract는 유지한다. 호출부는 `apps/client/lib/src/app/oto_client_app.dart`, package tests, app tests다.
|
||||||
|
|
||||||
|
### 분할 판단
|
||||||
|
|
||||||
|
multi-plan output이다. 공유 task group은 `m-control-plane-jenkins-aligned-layout-pass`.
|
||||||
|
|
||||||
|
- `01_definition_shell_foundation`: predecessor `01`, 현재 작성 시점 complete log missing.
|
||||||
|
- `02+01_primary_views`: predecessor `02`, 현재 작성 시점 complete log missing.
|
||||||
|
- `03+01,02_execution_artifact_views`: 현재 plan. directory dependency상 01과 02 둘 다 PASS 후 구현해야 한다.
|
||||||
|
|
||||||
|
### 범위 결정 근거
|
||||||
|
|
||||||
|
Stage graph 데이터 모델은 없으므로 Pipeline Graph View의 full stage graph 구현은 제외하고 selected execution summary placeholder까지만 허용한다. Artifact download/content preview, full console follow/search/copy도 제외한다. Core API, proto, auth/audit persistence는 변경하지 않는다. agent-ui `구현됨` status 전환은 milestone-required completion review로 남긴다.
|
||||||
|
|
||||||
|
### 빌드 등급
|
||||||
|
|
||||||
|
`local-G07`. Execution detail은 action toolbar, confirmation dialog, write callbacks, logs/artifacts detail loading을 함께 건드려 blast radius가 primary views보다 크다. 그래도 범위는 Flutter package/app 위젯과 기존 tests로 bounded된다.
|
||||||
|
|
||||||
|
## 구현 체크리스트
|
||||||
|
|
||||||
|
- [ ] `01_definition_shell_foundation`과 `02+01_primary_views`의 `complete.log`가 active/archive predecessor로 존재하는지 확인하고 없으면 구현하지 않고 dependency missing을 기록한다.
|
||||||
|
- [ ] `OtoExecutionsSurface`를 execution list + selected run detail 관계로 재배치하고, run header/action toolbar/summary placeholder/log pane/artifact pane 순서를 구현한다.
|
||||||
|
- [ ] execution action toolbar에서 cancel/report/log/artifact guard, confirmation dialog, callback payload, submitting/success/failed feedback을 유지한다.
|
||||||
|
- [ ] logs preview를 selected execution detail의 독립 bounded pane으로 재배치하고 loading/empty/error/data states를 유지한다.
|
||||||
|
- [ ] artifacts preview와 artifacts tab을 같은 artifact-list anatomy로 정리하고 name/path ellipsis, empty/error/data states를 유지한다.
|
||||||
|
- [ ] record-list/status-badge/state-panel/action-feedback private reusable pattern을 surface 간 충돌 없이 정리한다.
|
||||||
|
- [ ] package/app widget tests를 갱신해 executions/artifacts state, action, navigation, detail preview를 검증한다.
|
||||||
|
- [ ] 원격 runner preflight와 Flutter analyze/test 계약을 실행하거나, Flutter PATH/source sync 차단이면 실제 출력과 차단 사유를 review stub에 남긴다.
|
||||||
|
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.
|
||||||
|
|
||||||
|
## 의존 관계 및 구현 순서
|
||||||
|
|
||||||
|
디렉터리명 `03+01,02_execution_artifact_views`의 predecessors는 `01_definition_shell_foundation`, `02+01_primary_views`다. 구현 시작 전 같은 task group active/archive에서 각 predecessor `complete.log`를 확인한다. 현재 작성 시점에는 둘 다 missing이다.
|
||||||
|
|
||||||
|
### [LAYOUT-1] Execution List And Selected Detail
|
||||||
|
|
||||||
|
#### 문제
|
||||||
|
|
||||||
|
[packages/flutter/oto_console/lib/src/oto_executions_surface.dart](/config/workspace/oto/packages/flutter/oto_console/lib/src/oto_executions_surface.dart:185)는 execution별 card list를 만들고 [lines 277-288](/config/workspace/oto/packages/flutter/oto_console/lib/src/oto_executions_surface.dart:277)에서 expanded card 안에 actions/logs/artifacts를 순서대로 넣는다. agent-ui는 Jenkins Build History + build page처럼 list/detail 관계와 run detail panes를 요구한다.
|
||||||
|
|
||||||
|
#### 해결 방법
|
||||||
|
|
||||||
|
List row와 selected detail을 시각적으로 분리한다. stage graph 데이터가 없으므로 selected detail에 "Stage summary unavailable" 같은 짧은 placeholder region을 두고, action toolbar/log/artifact pane을 뒤에 배치한다.
|
||||||
|
|
||||||
|
Before:
|
||||||
|
|
||||||
|
```dart
|
||||||
|
// oto_executions_surface.dart:277
|
||||||
|
if (isExpanded) ...[
|
||||||
|
const Divider(height: 1, thickness: 1),
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.all(16),
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
_buildActionsSection(context, theme, exec),
|
||||||
|
_buildLogsSection(theme),
|
||||||
|
_buildArtifactsSection(theme),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
After:
|
||||||
|
|
||||||
|
```dart
|
||||||
|
return _ExecutionWorkspace(
|
||||||
|
list: _buildExecutionList(context, theme, executions),
|
||||||
|
detail: selected == null
|
||||||
|
? _RunDetailPlaceholder(theme: theme)
|
||||||
|
: _buildExecutionDetail(context, theme, selected),
|
||||||
|
);
|
||||||
|
```
|
||||||
|
|
||||||
|
`_buildExecutionDetail`은 run header, `_buildActionsSection`, stage summary placeholder, `_buildLogsSection`, `_buildArtifactsSection` 순서를 갖는다.
|
||||||
|
|
||||||
|
#### 수정 파일 및 체크리스트
|
||||||
|
|
||||||
|
- [ ] `packages/flutter/oto_console/lib/src/oto_executions_surface.dart`: list/detail workspace 구현.
|
||||||
|
- [ ] `packages/flutter/oto_console/test/oto_console_test.dart`: expand/detail assertions 갱신.
|
||||||
|
- [ ] `apps/client/test/widget_test.dart`: app execution detail tests 갱신.
|
||||||
|
|
||||||
|
#### 테스트 작성
|
||||||
|
|
||||||
|
기존 execution tests를 갱신한다. `Exec ID`, `Job ID`, `Runner ID`, status, `Actions`, `Logs Preview`, artifact name, empty/error detail strings를 검증한다.
|
||||||
|
|
||||||
|
#### 중간 검증
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd packages/flutter/oto_console && flutter test
|
||||||
|
```
|
||||||
|
|
||||||
|
예상: package execution widget tests PASS 또는 원격 Flutter blocker 기록.
|
||||||
|
|
||||||
|
### [LAYOUT-2] Execution Action Toolbar And Feedback
|
||||||
|
|
||||||
|
#### 문제
|
||||||
|
|
||||||
|
[packages/flutter/oto_console/lib/src/oto_executions_surface.dart](/config/workspace/oto/packages/flutter/oto_console/lib/src/oto_executions_surface.dart:300)의 `_buildActionsSection`은 expanded card 내부 `Wrap` button group이다. agent-ui는 destructive/report/append/navigation action grouping이 selected run detail header/action area에 붙는 구조를 요구한다.
|
||||||
|
|
||||||
|
#### 해결 방법
|
||||||
|
|
||||||
|
Button callback logic은 유지하고, toolbar layout만 group화한다. `canAct` guard, cancel confirmation, action state feedback 조건은 보존한다.
|
||||||
|
|
||||||
|
Before:
|
||||||
|
|
||||||
|
```dart
|
||||||
|
// oto_executions_surface.dart:317
|
||||||
|
Wrap(
|
||||||
|
spacing: 8,
|
||||||
|
runSpacing: 8,
|
||||||
|
children: [
|
||||||
|
_ActionButton(label: 'Cancel', ...),
|
||||||
|
_ActionButton(label: 'Report', ...),
|
||||||
|
_ActionButton(label: 'Log', ...),
|
||||||
|
_ActionButton(label: 'Artifact', ...),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
After:
|
||||||
|
|
||||||
|
```dart
|
||||||
|
_ExecutionActionToolbar(
|
||||||
|
destructive: [_ActionButton(label: 'Cancel', ...)],
|
||||||
|
reporting: [_ActionButton(label: 'Report', ...)],
|
||||||
|
append: [
|
||||||
|
_ActionButton(label: 'Log', ...),
|
||||||
|
_ActionButton(label: 'Artifact', ...),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 수정 파일 및 체크리스트
|
||||||
|
|
||||||
|
- [ ] `packages/flutter/oto_console/lib/src/oto_executions_surface.dart`: toolbar grouping.
|
||||||
|
- [ ] `packages/flutter/oto_console/test/oto_console_test.dart`: action callbacks/state tests 갱신.
|
||||||
|
- [ ] `apps/client/test/widget_test.dart`: action wiring tests 갱신.
|
||||||
|
|
||||||
|
#### 테스트 작성
|
||||||
|
|
||||||
|
Report/Log/Artifact callbacks, cancel dialog, disabled unknown runner, success refresh, failed no-refresh tests를 유지한다.
|
||||||
|
|
||||||
|
#### 중간 검증
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd apps/client && flutter test
|
||||||
|
```
|
||||||
|
|
||||||
|
예상: app execution action tests PASS 또는 원격 Flutter blocker 기록.
|
||||||
|
|
||||||
|
### [LAYOUT-3] Log And Artifact Panes
|
||||||
|
|
||||||
|
#### 문제
|
||||||
|
|
||||||
|
[packages/flutter/oto_console/lib/src/oto_executions_surface.dart](/config/workspace/oto/packages/flutter/oto_console/lib/src/oto_executions_surface.dart:459)의 log preview와 [artifacts preview](/config/workspace/oto/packages/flutter/oto_console/lib/src/oto_executions_surface.dart:533)는 card 내부 sections다. agent-ui는 selected execution detail의 독립 panes로 두고 future full console/action slot을 열어둘 것을 요구한다.
|
||||||
|
|
||||||
|
#### 해결 방법
|
||||||
|
|
||||||
|
Log preview는 bounded monospace pane으로 유지하되 header/action slot을 가진 helper로 감싼다. Artifact preview는 artifacts tab과 같은 row anatomy helper를 공유한다.
|
||||||
|
|
||||||
|
Before:
|
||||||
|
|
||||||
|
```dart
|
||||||
|
// oto_executions_surface.dart:477
|
||||||
|
Container(
|
||||||
|
width: double.infinity,
|
||||||
|
padding: const EdgeInsets.all(12),
|
||||||
|
decoration: BoxDecoration(color: Colors.black, ...),
|
||||||
|
constraints: const BoxConstraints(maxHeight: 180),
|
||||||
|
child: _buildLogsContent(theme),
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
After:
|
||||||
|
|
||||||
|
```dart
|
||||||
|
_DetailPane(
|
||||||
|
title: 'Logs Preview',
|
||||||
|
action: null,
|
||||||
|
child: _LogPreviewBox(theme: theme, child: _buildLogsContent(theme)),
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 수정 파일 및 체크리스트
|
||||||
|
|
||||||
|
- [ ] `packages/flutter/oto_console/lib/src/oto_executions_surface.dart`: `_DetailPane`, log preview layout, artifact preview layout.
|
||||||
|
- [ ] `packages/flutter/oto_console/test/oto_console_test.dart`: log/artifact detail tests 갱신.
|
||||||
|
- [ ] `apps/client/test/widget_test.dart`: expanded empty/error detail tests 갱신.
|
||||||
|
|
||||||
|
#### 테스트 작성
|
||||||
|
|
||||||
|
`Log is empty.`, `Error loading logs: ...`, `No artifacts produced.`, `Error loading artifacts: ...`, artifact row name/path assertions를 유지한다.
|
||||||
|
|
||||||
|
#### 중간 검증
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd packages/flutter/oto_console && flutter test
|
||||||
|
```
|
||||||
|
|
||||||
|
예상: package detail preview tests PASS 또는 원격 Flutter blocker 기록.
|
||||||
|
|
||||||
|
### [LAYOUT-4] Artifacts Browser Anatomy
|
||||||
|
|
||||||
|
#### 문제
|
||||||
|
|
||||||
|
[packages/flutter/oto_console/lib/src/oto_artifacts_surface.dart](/config/workspace/oto/packages/flutter/oto_console/lib/src/oto_artifacts_surface.dart:165)는 simple icon/name/path row만 렌더링한다. agent-ui는 Jenkins artifact browser처럼 file identity, path/location, future action slot을 분리한 anatomy를 요구한다.
|
||||||
|
|
||||||
|
#### 해결 방법
|
||||||
|
|
||||||
|
Artifacts tab row와 execution detail compact artifact row가 같은 private helper를 쓰게 한다. Full path는 ellipsis를 유지하고 download/content preview는 넣지 않는다.
|
||||||
|
|
||||||
|
Before:
|
||||||
|
|
||||||
|
```dart
|
||||||
|
// oto_artifacts_surface.dart:170
|
||||||
|
return Container(
|
||||||
|
padding: const EdgeInsets.all(16),
|
||||||
|
decoration: BoxDecoration(...),
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
Icon(Icons.insert_drive_file_outlined, ...),
|
||||||
|
Expanded(child: Column(children: [Text(artifact.name), Text('Path: ${artifact.path}')]))
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
```
|
||||||
|
|
||||||
|
After:
|
||||||
|
|
||||||
|
```dart
|
||||||
|
return _ArtifactRecordRow(
|
||||||
|
artifact: artifact,
|
||||||
|
theme: theme,
|
||||||
|
density: _ArtifactRowDensity.full,
|
||||||
|
);
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 수정 파일 및 체크리스트
|
||||||
|
|
||||||
|
- [ ] `packages/flutter/oto_console/lib/src/oto_artifacts_surface.dart`: artifact browser row anatomy.
|
||||||
|
- [ ] `packages/flutter/oto_console/lib/src/oto_executions_surface.dart`: compact preview helper alignment.
|
||||||
|
- [ ] `packages/flutter/oto_console/test/oto_console_test.dart`: artifact tab tests 갱신.
|
||||||
|
- [ ] `apps/client/test/widget_test.dart`: artifact app tests 갱신.
|
||||||
|
|
||||||
|
#### 테스트 작성
|
||||||
|
|
||||||
|
Existing artifact loading/empty/error/data tests를 유지한다. `release.tar.gz`, `Path: /out/release.tar.gz` 또는 새 label이 있다면 동일 의미의 path text assertion으로 갱신한다.
|
||||||
|
|
||||||
|
#### 중간 검증
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd apps/client && flutter test
|
||||||
|
```
|
||||||
|
|
||||||
|
예상: app artifact wiring tests PASS 또는 원격 Flutter blocker 기록.
|
||||||
|
|
||||||
|
## 수정 파일 요약
|
||||||
|
|
||||||
|
| 파일 | 항목 |
|
||||||
|
|------|------|
|
||||||
|
| `packages/flutter/oto_console/lib/src/oto_executions_surface.dart` | LAYOUT-1, LAYOUT-2, LAYOUT-3, LAYOUT-4 |
|
||||||
|
| `packages/flutter/oto_console/lib/src/oto_artifacts_surface.dart` | LAYOUT-4 |
|
||||||
|
| `packages/flutter/oto_console/test/oto_console_test.dart` | LAYOUT-1, LAYOUT-2, LAYOUT-3, LAYOUT-4 |
|
||||||
|
| `apps/client/test/widget_test.dart` | LAYOUT-1, LAYOUT-2, LAYOUT-3, LAYOUT-4 |
|
||||||
|
|
||||||
|
## 최종 검증
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git diff --check
|
||||||
|
```
|
||||||
|
|
||||||
|
예상: PASS.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python3 - <<'PY'
|
||||||
|
from pathlib import Path
|
||||||
|
targets = [
|
||||||
|
'agent-ui/definition/views/overview/index.md',
|
||||||
|
'agent-ui/definition/views/runners/index.md',
|
||||||
|
'agent-ui/definition/views/pipelines/index.md',
|
||||||
|
'agent-ui/definition/views/executions/index.md',
|
||||||
|
'agent-ui/definition/views/artifacts/index.md',
|
||||||
|
'agent-ui/definition/views/settings/index.md',
|
||||||
|
'agent-ui/definition/components/record-list/index.md',
|
||||||
|
'agent-ui/definition/components/state-panel/index.md',
|
||||||
|
'agent-ui/definition/components/status-badge/index.md',
|
||||||
|
'agent-ui/definition/components/action-feedback/index.md',
|
||||||
|
'agent-ui/definition/components/execution-action-toolbar/index.md',
|
||||||
|
'agent-ui/definition/components/log-preview/index.md',
|
||||||
|
'agent-ui/definition/components/artifact-list/index.md',
|
||||||
|
]
|
||||||
|
for p in targets:
|
||||||
|
text = Path(p).read_text()
|
||||||
|
if 'status: 계획' not in text and 'Status: `계획`' not in text:
|
||||||
|
raise SystemExit(f'agent-ui status should remain 계획 until milestone completion review: {p}')
|
||||||
|
print('agent-ui implementation targets remain plan-state for milestone review')
|
||||||
|
PY
|
||||||
|
```
|
||||||
|
|
||||||
|
예상: `agent-ui implementation targets remain plan-state for milestone review`.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ssh -o BatchMode=yes -o ConnectTimeout=10 toki@toki-labs.com 'cd /Users/toki/agent-work/oto && printf "workdir=%s\n" "$PWD" && printf "branch=" && git rev-parse --abbrev-ref HEAD && printf "head=" && git rev-parse --short HEAD && printf "status-start\n" && git status --short && printf "status-end\n" && command -v flutter && flutter --version | head -n 1'
|
||||||
|
```
|
||||||
|
|
||||||
|
예상: 원격 runner Flutter 경로와 source sync 상태 확인. 현재 사전 확인에서는 Flutter PATH 실패 상태다.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ssh -o BatchMode=yes -o ConnectTimeout=10 toki@toki-labs.com 'cd /Users/toki/agent-work/oto/packages/flutter/oto_console && flutter analyze && flutter test'
|
||||||
|
```
|
||||||
|
|
||||||
|
예상: 원격 runner Flutter 준비 및 source sync 후 PASS.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ssh -o BatchMode=yes -o ConnectTimeout=10 toki@toki-labs.com 'cd /Users/toki/agent-work/oto/apps/client && flutter analyze && flutter test'
|
||||||
|
```
|
||||||
|
|
||||||
|
예상: 원격 runner Flutter 준비 및 source sync 후 PASS.
|
||||||
|
|
||||||
|
모든 코드 변경 완료 후 반드시 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 채운다. 이 파일 작성이 구현의 마지막 단계다.
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
---
|
---
|
||||||
ui_doc_type: component
|
ui_doc_type: component
|
||||||
component_id: action-feedback
|
component_id: action-feedback
|
||||||
status: 구현됨
|
status: 계획
|
||||||
source_evidence:
|
source_evidence:
|
||||||
- type: code
|
- type: code
|
||||||
path: packages/flutter/oto_console/lib/src/oto_runners_surface.dart
|
path: packages/flutter/oto_console/lib/src/oto_runners_surface.dart
|
||||||
|
|
@ -21,7 +21,7 @@ source_evidence:
|
||||||
|
|
||||||
Component ID: `action-feedback`
|
Component ID: `action-feedback`
|
||||||
|
|
||||||
Status: `구현됨`
|
Status: `계획`
|
||||||
|
|
||||||
## Source Evidence
|
## Source Evidence
|
||||||
|
|
||||||
|
|
@ -49,6 +49,18 @@ write action 결과를 success, deferred, failed 상태로 짧게 표시한다.
|
||||||
- success/failure color
|
- success/failure color
|
||||||
- deferred prefix where available
|
- deferred prefix where available
|
||||||
|
|
||||||
|
## Jenkins Reference Alignment
|
||||||
|
|
||||||
|
- Jenkins build abort/config save/plugin action 이후의 immediate feedback과 task UI 결과를 러프 참조로 삼는다.
|
||||||
|
- deferred 결과는 Jenkins background task처럼 사용자가 action accepted 상태를 이해할 수 있게 짧은 message로 표현한다.
|
||||||
|
- auth/permission 실패가 들어오면 Jenkins permission-denied 화면처럼 원인은 짧게, 민감 payload는 숨긴다.
|
||||||
|
|
||||||
|
## Target Layout Delta
|
||||||
|
|
||||||
|
- action feedback은 inline row message와 page/banner message 양쪽으로 쓸 수 있는 anatomy를 목표로 둔다.
|
||||||
|
- success/deferred/failed 외에 permission-denied를 `authorization-state`와 연결하는 방향을 둔다.
|
||||||
|
- 현재 surface별 feedback container는 목표 reusable feedback pattern 전 단계이므로 코드 반영 전 상태는 `계획`이다.
|
||||||
|
|
||||||
## Variants
|
## Variants
|
||||||
|
|
||||||
- success
|
- success
|
||||||
|
|
@ -70,4 +82,3 @@ write action 결과를 success, deferred, failed 상태로 짧게 표시한다.
|
||||||
## Decision History
|
## Decision History
|
||||||
|
|
||||||
- 2026-06-24: write action 결과 표시를 `action-feedback` component로 정의했다.
|
- 2026-06-24: write action 결과 표시를 `action-feedback` component로 정의했다.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
---
|
---
|
||||||
ui_doc_type: component
|
ui_doc_type: component
|
||||||
component_id: artifact-list
|
component_id: artifact-list
|
||||||
status: 구현됨
|
status: 계획
|
||||||
source_evidence:
|
source_evidence:
|
||||||
- type: code
|
- type: code
|
||||||
path: packages/flutter/oto_console/lib/src/oto_artifacts_surface.dart
|
path: packages/flutter/oto_console/lib/src/oto_artifacts_surface.dart
|
||||||
|
|
@ -21,7 +21,7 @@ source_evidence:
|
||||||
|
|
||||||
Component ID: `artifact-list`
|
Component ID: `artifact-list`
|
||||||
|
|
||||||
Status: `구현됨`
|
Status: `계획`
|
||||||
|
|
||||||
## Source Evidence
|
## Source Evidence
|
||||||
|
|
||||||
|
|
@ -48,6 +48,18 @@ artifact name과 path를 row 목록으로 보여준다.
|
||||||
- artifact path
|
- artifact path
|
||||||
- compact card/list row
|
- compact card/list row
|
||||||
|
|
||||||
|
## Jenkins Reference Alignment
|
||||||
|
|
||||||
|
- Jenkins build artifacts와 workspace/artifact browser row를 러프 참조로 삼는다.
|
||||||
|
- 현재는 name/path 목록이며, artifact detail, download, browser navigation은 후속 후보로 둔다.
|
||||||
|
- path가 길거나 민감할 수 있으므로 ellipsis와 masking 기준을 우선한다.
|
||||||
|
|
||||||
|
## Target Layout Delta
|
||||||
|
|
||||||
|
- artifact list는 full tab과 execution detail preview에서 같은 row anatomy를 공유하는 것을 목표로 둔다.
|
||||||
|
- row는 name/path/context/action slot을 분리하고, content preview/download는 후속 확장 slot으로 남긴다.
|
||||||
|
- 현재 단순 row 구현은 목표 artifact browser anatomy 전 단계이므로 코드 반영 전 상태는 `계획`이다.
|
||||||
|
|
||||||
## Variants
|
## Variants
|
||||||
|
|
||||||
- full tab row
|
- full tab row
|
||||||
|
|
@ -69,4 +81,3 @@ artifact name과 path를 row 목록으로 보여준다.
|
||||||
## Decision History
|
## Decision History
|
||||||
|
|
||||||
- 2026-06-24: artifact tab과 execution detail preview를 `artifact-list` component로 묶었다.
|
- 2026-06-24: artifact tab과 execution detail preview를 `artifact-list` component로 묶었다.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
---
|
---
|
||||||
ui_doc_type: component
|
ui_doc_type: component
|
||||||
component_id: console-rail
|
component_id: console-rail
|
||||||
status: 구현됨
|
status: 계획
|
||||||
source_evidence:
|
source_evidence:
|
||||||
- type: code
|
- type: code
|
||||||
path: packages/flutter/oto_console/lib/src/oto_console_shell.dart
|
path: packages/flutter/oto_console/lib/src/oto_console_shell.dart
|
||||||
|
|
@ -18,7 +18,7 @@ source_evidence:
|
||||||
|
|
||||||
Component ID: `console-rail`
|
Component ID: `console-rail`
|
||||||
|
|
||||||
Status: `구현됨`
|
Status: `계획`
|
||||||
|
|
||||||
## Source Evidence
|
## Source Evidence
|
||||||
|
|
||||||
|
|
@ -50,6 +50,18 @@ Status: `구현됨`
|
||||||
- top main section group
|
- top main section group
|
||||||
- bottom agent/settings group
|
- bottom agent/settings group
|
||||||
|
|
||||||
|
## Jenkins Reference Alignment
|
||||||
|
|
||||||
|
- Jenkins classic left task list의 빠른 destination과 Blue Ocean top navigation의 section switching을 OTO rail로 축약한다.
|
||||||
|
- Jenkins `Manage Jenkins`, `Build History`, job/run destination에 해당하는 주요 운영 화면은 rail destination으로 노출한다.
|
||||||
|
- Jenkins와 달리 breadcrumb stack은 현재 제공하지 않는다. 세부 route가 늘어나면 shell/header 쪽 후속 후보로 분리한다.
|
||||||
|
|
||||||
|
## Target Layout Delta
|
||||||
|
|
||||||
|
- rail은 현재 60px icon-only 구조를 유지하되, Jenkins 운영 destination grouping에 맞춰 main/workflow/administration grouping을 더 명확히 한다.
|
||||||
|
- selected state와 tooltip은 유지하고, 필요하면 section ordering을 overview, pipelines, executions, runners, artifacts, settings, agent 순서 후보로 재검토한다.
|
||||||
|
- 현재 rail 구현은 목표 grouping 전 단계이므로 코드 반영 전 상태는 `계획`이다.
|
||||||
|
|
||||||
## Variants
|
## Variants
|
||||||
|
|
||||||
- default: 60px rail width, 56x48 button hit area
|
- default: 60px rail width, 56x48 button hit area
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
---
|
---
|
||||||
ui_doc_type: component
|
ui_doc_type: component
|
||||||
component_id: console-shell
|
component_id: console-shell
|
||||||
status: 구현됨
|
status: 계획
|
||||||
source_evidence:
|
source_evidence:
|
||||||
- type: code
|
- type: code
|
||||||
path: packages/flutter/oto_console/lib/src/oto_console_shell.dart
|
path: packages/flutter/oto_console/lib/src/oto_console_shell.dart
|
||||||
|
|
@ -18,7 +18,7 @@ source_evidence:
|
||||||
|
|
||||||
Component ID: `console-shell`
|
Component ID: `console-shell`
|
||||||
|
|
||||||
Status: `구현됨`
|
Status: `계획`
|
||||||
|
|
||||||
## Source Evidence
|
## Source Evidence
|
||||||
|
|
||||||
|
|
@ -50,6 +50,19 @@ Control Plane 콘솔의 전체 layout shell을 제공하고, rail navigation과
|
||||||
- selected section content area
|
- selected section content area
|
||||||
- optional fallback `section-surface`
|
- optional fallback `section-surface`
|
||||||
|
|
||||||
|
## Jenkins Reference Alignment
|
||||||
|
|
||||||
|
- Jenkins `2.516+`의 통합 header/breadcrumb/action 모델은 future shell header 후보로 둔다.
|
||||||
|
- 현재 구현은 rail 중심 shell이므로 Jenkins classic side task list와 Blue Ocean common navigation을 절충한 OTO 운영 콘솔 shell로 본다.
|
||||||
|
- view header와 action은 각 surface 내부에 있고, shell은 navigation과 content mounting 책임만 가진다.
|
||||||
|
- global search, command palette, account/theme picker는 이번 정의 범위에서 제외한다.
|
||||||
|
|
||||||
|
## Target Layout Delta
|
||||||
|
|
||||||
|
- shell은 rail + content만이 아니라 page header/action slot을 담을 수 있는 구조를 목표로 둔다.
|
||||||
|
- breadcrumb는 이번 범위에서 제외하지만, Jenkins refreshed header처럼 current view context와 primary action을 같은 상단 영역에 둘 수 있어야 한다.
|
||||||
|
- 현재 `OtoConsoleShell` 구현은 목표 shell layout 전 단계이므로 코드 반영 전 상태는 `계획`이다.
|
||||||
|
|
||||||
## Variants
|
## Variants
|
||||||
|
|
||||||
- default: host가 전용 surface를 모두 넘긴 상태
|
- default: host가 전용 surface를 모두 넘긴 상태
|
||||||
|
|
@ -70,4 +83,3 @@ Control Plane 콘솔의 전체 layout shell을 제공하고, rail navigation과
|
||||||
## Decision History
|
## Decision History
|
||||||
|
|
||||||
- 2026-06-24: 구현 후보 재검토 중 `OtoConsoleShell`을 별도 shell component로 보강했다.
|
- 2026-06-24: 구현 후보 재검토 중 `OtoConsoleShell`을 별도 shell component로 보강했다.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
---
|
---
|
||||||
ui_doc_type: component
|
ui_doc_type: component
|
||||||
component_id: execution-action-toolbar
|
component_id: execution-action-toolbar
|
||||||
status: 구현됨
|
status: 계획
|
||||||
source_evidence:
|
source_evidence:
|
||||||
- type: code
|
- type: code
|
||||||
path: packages/flutter/oto_console/lib/src/oto_executions_surface.dart
|
path: packages/flutter/oto_console/lib/src/oto_executions_surface.dart
|
||||||
|
|
@ -18,7 +18,7 @@ source_evidence:
|
||||||
|
|
||||||
Component ID: `execution-action-toolbar`
|
Component ID: `execution-action-toolbar`
|
||||||
|
|
||||||
Status: `구현됨`
|
Status: `계획`
|
||||||
|
|
||||||
## Source Evidence
|
## Source Evidence
|
||||||
|
|
||||||
|
|
@ -45,6 +45,18 @@ Status: `구현됨`
|
||||||
- per-button submitting/success/failure indicator
|
- per-button submitting/success/failure indicator
|
||||||
- cancel confirmation dialog
|
- cancel confirmation dialog
|
||||||
|
|
||||||
|
## Jenkins Reference Alignment
|
||||||
|
|
||||||
|
- Jenkins build page의 Abort/Restart/Console/Artifacts action 영역을 러프 참조로 삼는다.
|
||||||
|
- Pipeline Graph View처럼 run detail에서 stage/log/artifact context를 벗어나지 않고 action을 수행하는 흐름을 후속 조정 기준으로 둔다.
|
||||||
|
- Jenkins stage restart/replay와 OTO report/log/artifact append는 의미가 다르므로 button vocabulary는 OTO contract를 우선한다.
|
||||||
|
|
||||||
|
## Target Layout Delta
|
||||||
|
|
||||||
|
- toolbar는 expanded card 내부 button row가 아니라 selected execution detail header/action area에 붙는 구조를 목표로 둔다.
|
||||||
|
- destructive action, append/report action, navigation action을 group으로 나눈다.
|
||||||
|
- 현재 toolbar 구현은 목표 run detail action layout 전 단계이므로 코드 반영 전 상태는 `계획`이다.
|
||||||
|
|
||||||
## Variants
|
## Variants
|
||||||
|
|
||||||
- enabled: runner id가 있고 cancel 상태가 아니며 submitting 중이 아님
|
- enabled: runner id가 있고 cancel 상태가 아니며 submitting 중이 아님
|
||||||
|
|
@ -67,4 +79,3 @@ Status: `구현됨`
|
||||||
## Decision History
|
## Decision History
|
||||||
|
|
||||||
- 2026-06-24: execution write action button group을 `execution-action-toolbar` component로 정의했다.
|
- 2026-06-24: execution write action button group을 `execution-action-toolbar` component로 정의했다.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -27,23 +27,23 @@ components:
|
||||||
|
|
||||||
| Component ID | Status | Evidence | Description |
|
| Component ID | Status | Evidence | Description |
|
||||||
|--------------|--------|----------|-------------|
|
|--------------|--------|----------|-------------|
|
||||||
| `console-shell` | 구현됨 | `oto_console_shell.dart` | overall console scaffold with rail and selected section content |
|
| `console-shell` | 계획 | `oto_console_shell.dart` + Jenkins reference baseline | overall console scaffold with rail and selected section content. Jenkins-style header/action layout 재정렬 대상 |
|
||||||
| `console-rail` | 구현됨 | `oto_console_shell.dart` | section navigation rail |
|
| `console-rail` | 계획 | `oto_console_shell.dart` + Jenkins reference baseline | section navigation rail. Jenkins navigation grouping 재정렬 대상 |
|
||||||
| `section-surface` | 구현됨 | `oto_console_shell.dart` | generic titled empty/detail section shell |
|
| `section-surface` | 계획 | `oto_console_shell.dart` + Jenkins reference baseline | generic titled empty/detail section shell. Manage Jenkins-style fallback grouping 재정렬 대상 |
|
||||||
| `state-panel` | 구현됨 | surface files | loading, empty, error state blocks |
|
| `state-panel` | 계획 | surface files + Jenkins reference baseline | loading, empty, error state blocks. Jenkins monitor/banner-style state 재정렬 대상 |
|
||||||
| `status-badge` | 구현됨 | overview/runners/jobs/executions surface files | compact status label badge |
|
| `status-badge` | 계획 | overview/runners/jobs/executions surface files + Jenkins reference baseline | compact status label badge. Jenkins result/severity vocabulary 정렬 대상 |
|
||||||
| `endpoint-tile` | 구현됨 | `oto_console_overview.dart` | endpoint or config value tile |
|
| `endpoint-tile` | 구현됨 | `oto_console_overview.dart` | endpoint or config value tile |
|
||||||
| `connection-status-grid` | 구현됨 | `oto_console_overview.dart` | health/readiness status grid |
|
| `connection-status-grid` | 구현됨 | `oto_console_overview.dart` | health/readiness status grid |
|
||||||
| `auth-token-reference` | 구현됨 | `oto_console_overview.dart` | display-only auth token reference |
|
| `auth-token-reference` | 구현됨 | `oto_console_overview.dart` | display-only auth token reference |
|
||||||
| `record-list` | 구현됨 | runners/jobs/executions/artifacts surface files | repeated entity list rows |
|
| `record-list` | 계획 | runners/jobs/executions/artifacts surface files + Jenkins reference baseline | repeated entity list rows. Jenkins job/build/node row density 정렬 대상 |
|
||||||
| `action-feedback` | 구현됨 | runners/jobs/executions surface files | success/deferred/failed action message |
|
| `action-feedback` | 계획 | runners/jobs/executions surface files + Jenkins reference baseline | success/deferred/failed action message. Jenkins action outcome 정렬 대상 |
|
||||||
| `runner-self-update-form` | 구현됨 | `oto_runners_surface.dart` | runner self-update draft form |
|
| `runner-self-update-form` | 계획 | `oto_runners_surface.dart` + Jenkins reference baseline | runner self-update draft form. Jenkins update action density 정렬 대상 |
|
||||||
| `job-create-form` | 구현됨 | `oto_jobs_surface.dart` | job create draft form |
|
| `job-create-form` | 계획 | `oto_jobs_surface.dart` + Jenkins reference baseline | job create draft form. Jenkins New Item flow 정렬 대상 |
|
||||||
| `execution-action-toolbar` | 구현됨 | `oto_executions_surface.dart` | cancel/report/log/artifact execution actions |
|
| `execution-action-toolbar` | 계획 | `oto_executions_surface.dart` + Jenkins reference baseline | cancel/report/log/artifact execution actions. Jenkins run action area 정렬 대상 |
|
||||||
| `authorization-state` | 계획 | security/audit SDD | operator/admin allow/deny, disabled, and error state rules for write actions |
|
| `authorization-state` | 계획 | security/audit SDD | operator/admin allow/deny, disabled, and error state rules for write actions |
|
||||||
| `audit-action-summary` | 계획 | security/audit SDD | display-safe action metadata summary for audit-oriented UI exposure |
|
| `audit-action-summary` | 계획 | security/audit SDD | display-safe action metadata summary for audit-oriented UI exposure |
|
||||||
| `log-preview` | 구현됨 | `oto_executions_surface.dart` | bounded execution log preview |
|
| `log-preview` | 계획 | `oto_executions_surface.dart` + Jenkins reference baseline | bounded execution log preview. Jenkins Console Output/live log pane 정렬 대상 |
|
||||||
| `artifact-list` | 구현됨 | `oto_artifacts_surface.dart`, `oto_executions_surface.dart` | artifact records in tab and execution detail |
|
| `artifact-list` | 계획 | `oto_artifacts_surface.dart`, `oto_executions_surface.dart` + Jenkins reference baseline | artifact records in tab and execution detail. Jenkins artifact browser 정렬 대상 |
|
||||||
| `agent-chat-panel` | 구현됨 | `oto_agent_panel.dart` | agent-shell backed OTO assistant panel |
|
| `agent-chat-panel` | 구현됨 | `oto_agent_panel.dart` | agent-shell backed OTO assistant panel |
|
||||||
|
|
||||||
## Rules
|
## Rules
|
||||||
|
|
@ -51,3 +51,13 @@ components:
|
||||||
- component 정의는 구현 API가 아니라 UI 사용 규칙을 다룬다.
|
- component 정의는 구현 API가 아니라 UI 사용 규칙을 다룬다.
|
||||||
- view별 변형이 필요하면 `<component-id>/<variant>.md` 또는 하위 디렉터리를 사용한다.
|
- view별 변형이 필요하면 `<component-id>/<variant>.md` 또는 하위 디렉터리를 사용한다.
|
||||||
- 실제 구현체 이름과 다를 수 있지만, view 정의서에서 참조하는 component id는 이 목록에 있어야 한다.
|
- 실제 구현체 이름과 다를 수 있지만, view 정의서에서 참조하는 component id는 이 목록에 있어야 한다.
|
||||||
|
|
||||||
|
## Jenkins Reference Patterns
|
||||||
|
|
||||||
|
| Pattern | OTO Components | Notes |
|
||||||
|
|---------|----------------|-------|
|
||||||
|
| Navigation and app context | `console-shell`, `console-rail`, `section-surface` | Jenkins `2.516+` header/breadcrumb/action과 classic side task list를 러프 참조로 삼되, 현재 구현의 rail shell은 유지한다. |
|
||||||
|
| Entity status scanning | `record-list`, `status-badge`, `state-panel` | Jenkins dashboard job rows, build history, node status, administrative monitors처럼 상태와 primary id를 빠르게 읽게 한다. |
|
||||||
|
| Write action outcome | `action-feedback`, `authorization-state`, `audit-action-summary` | Jenkins build/abort/config action 이후 결과와 권한 실패를 display-safe message로 표현한다. |
|
||||||
|
| Pipeline/run detail | `execution-action-toolbar`, `log-preview`, `artifact-list` | Pipeline Graph View의 graph/stage/log 통합 흐름을 후속 조정 기준으로 삼는다. |
|
||||||
|
| Creation/config forms | `job-create-form`, `runner-self-update-form`, `endpoint-tile`, `auth-token-reference` | Jenkins New Item/Manage Jenkins류 form density를 참고하되 OTO runtime 계약에 맞춘다. |
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
---
|
---
|
||||||
ui_doc_type: component
|
ui_doc_type: component
|
||||||
component_id: job-create-form
|
component_id: job-create-form
|
||||||
status: 구현됨
|
status: 계획
|
||||||
source_evidence:
|
source_evidence:
|
||||||
- type: code
|
- type: code
|
||||||
path: packages/flutter/oto_console/lib/src/oto_jobs_surface.dart
|
path: packages/flutter/oto_console/lib/src/oto_jobs_surface.dart
|
||||||
|
|
@ -18,7 +18,7 @@ source_evidence:
|
||||||
|
|
||||||
Component ID: `job-create-form`
|
Component ID: `job-create-form`
|
||||||
|
|
||||||
Status: `구현됨`
|
Status: `계획`
|
||||||
|
|
||||||
## Source Evidence
|
## Source Evidence
|
||||||
|
|
||||||
|
|
@ -44,6 +44,18 @@ operator가 job id와 job name으로 새 pipeline/job record 생성을 요청하
|
||||||
- submitting spinner
|
- submitting spinner
|
||||||
- action feedback
|
- action feedback
|
||||||
|
|
||||||
|
## Jenkins Reference Alignment
|
||||||
|
|
||||||
|
- Jenkins New Item flow를 러프 참조로 삼되, 현재 OTO는 job id/name만 받는 얇은 create form으로 유지한다.
|
||||||
|
- item type 선택, folder, multibranch, SCM 연결은 현재 범위 밖이며 후속 pipeline authoring 후보로 둔다.
|
||||||
|
- create 결과는 Jenkins item creation처럼 즉시 목록과 execution navigation에 반영되는 흐름을 목표로 한다.
|
||||||
|
|
||||||
|
## Target Layout Delta
|
||||||
|
|
||||||
|
- create form은 pipelines list 상단에 항상 넓게 노출되는 구조보다 compact create panel/action slot을 목표로 둔다.
|
||||||
|
- submit feedback은 list context를 밀어내지 않도록 action-feedback pattern에 맞춘다.
|
||||||
|
- 현재 inline wide form은 목표 create flow 전 단계이므로 코드 반영 전 상태는 `계획`이다.
|
||||||
|
|
||||||
## Variants
|
## Variants
|
||||||
|
|
||||||
- enabled: id/name이 모두 있고 not submitting
|
- enabled: id/name이 모두 있고 not submitting
|
||||||
|
|
@ -65,4 +77,3 @@ operator가 job id와 job name으로 새 pipeline/job record 생성을 요청하
|
||||||
## Decision History
|
## Decision History
|
||||||
|
|
||||||
- 2026-06-24: jobs surface의 create form을 `job-create-form` component로 정의했다.
|
- 2026-06-24: jobs surface의 create form을 `job-create-form` component로 정의했다.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
---
|
---
|
||||||
ui_doc_type: component
|
ui_doc_type: component
|
||||||
component_id: log-preview
|
component_id: log-preview
|
||||||
status: 구현됨
|
status: 계획
|
||||||
source_evidence:
|
source_evidence:
|
||||||
- type: code
|
- type: code
|
||||||
path: packages/flutter/oto_console/lib/src/oto_executions_surface.dart
|
path: packages/flutter/oto_console/lib/src/oto_executions_surface.dart
|
||||||
|
|
@ -18,7 +18,7 @@ source_evidence:
|
||||||
|
|
||||||
Component ID: `log-preview`
|
Component ID: `log-preview`
|
||||||
|
|
||||||
Status: `구현됨`
|
Status: `계획`
|
||||||
|
|
||||||
## Source Evidence
|
## Source Evidence
|
||||||
|
|
||||||
|
|
@ -43,6 +43,18 @@ Status: `구현됨`
|
||||||
- timestamped log lines
|
- timestamped log lines
|
||||||
- loading/empty/error text
|
- loading/empty/error text
|
||||||
|
|
||||||
|
## Jenkins Reference Alignment
|
||||||
|
|
||||||
|
- Jenkins Console Output와 Pipeline Graph View의 live log pane을 러프 참조로 삼는다.
|
||||||
|
- 현재는 bounded preview이며, full console follow, search, copy, download는 후속 후보로 둔다.
|
||||||
|
- tailing/partial line 처리처럼 Jenkins에서 자주 보정되는 log UX는 후속 implementation 검증 항목으로 둔다.
|
||||||
|
|
||||||
|
## Target Layout Delta
|
||||||
|
|
||||||
|
- log preview는 selected execution detail의 독립 pane으로 이동하는 것을 목표로 둔다.
|
||||||
|
- bounded preview는 유지하되, future full console action을 추가할 수 있는 header/action slot을 둔다.
|
||||||
|
- 현재 card 내부 raw preview는 목표 log pane layout 전 단계이므로 코드 반영 전 상태는 `계획`이다.
|
||||||
|
|
||||||
## Variants
|
## Variants
|
||||||
|
|
||||||
- no logs loaded
|
- no logs loaded
|
||||||
|
|
@ -67,4 +79,3 @@ Status: `구현됨`
|
||||||
## Decision History
|
## Decision History
|
||||||
|
|
||||||
- 2026-06-24: execution detail log preview를 `log-preview` component로 정의했다.
|
- 2026-06-24: execution detail log preview를 `log-preview` component로 정의했다.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
---
|
---
|
||||||
ui_doc_type: component
|
ui_doc_type: component
|
||||||
component_id: record-list
|
component_id: record-list
|
||||||
status: 구현됨
|
status: 계획
|
||||||
source_evidence:
|
source_evidence:
|
||||||
- type: code
|
- type: code
|
||||||
path: packages/flutter/oto_console/lib/src/oto_runners_surface.dart
|
path: packages/flutter/oto_console/lib/src/oto_runners_surface.dart
|
||||||
|
|
@ -21,7 +21,7 @@ source_evidence:
|
||||||
|
|
||||||
Component ID: `record-list`
|
Component ID: `record-list`
|
||||||
|
|
||||||
Status: `구현됨`
|
Status: `계획`
|
||||||
|
|
||||||
## Source Evidence
|
## Source Evidence
|
||||||
|
|
||||||
|
|
@ -51,6 +51,19 @@ runner, job, execution, artifact 같은 운영 record를 카드형 row 목록으
|
||||||
- optional inline action/link
|
- optional inline action/link
|
||||||
- optional expanded detail
|
- optional expanded detail
|
||||||
|
|
||||||
|
## Jenkins Reference Alignment
|
||||||
|
|
||||||
|
- Jenkins dashboard job rows, Build History rows, Nodes/Agents rows를 공통 reference로 삼는다.
|
||||||
|
- primary name/id, status, recent execution/context, quick action/link가 한눈에 보이는 밀도를 유지한다.
|
||||||
|
- 현재 OTO는 table 대신 card row를 사용한다. 많은 record가 생기면 Jenkins job/build history처럼 더 dense한 table/list variant를 후속 후보로 둔다.
|
||||||
|
|
||||||
|
## Target Layout Delta
|
||||||
|
|
||||||
|
- repeated record는 large card보다 dense list row를 우선한다.
|
||||||
|
- primary identity, status, context metadata, action/link 영역이 같은 row 안에서 예측 가능하게 배치되어야 한다.
|
||||||
|
- expanded detail은 executions에만 허용하고, runners/pipelines/artifacts는 row action 또는 detail pane 후보로 분리한다.
|
||||||
|
- 현재 row 구현은 목표 density 전 단계이므로 코드 반영 전 상태는 `계획`이다.
|
||||||
|
|
||||||
## Variants
|
## Variants
|
||||||
|
|
||||||
- runner row
|
- runner row
|
||||||
|
|
@ -73,4 +86,3 @@ runner, job, execution, artifact 같은 운영 record를 카드형 row 목록으
|
||||||
## Decision History
|
## Decision History
|
||||||
|
|
||||||
- 2026-06-24: 반복 row 목록을 `record-list` component로 정의했다.
|
- 2026-06-24: 반복 row 목록을 `record-list` component로 정의했다.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
---
|
---
|
||||||
ui_doc_type: component
|
ui_doc_type: component
|
||||||
component_id: runner-self-update-form
|
component_id: runner-self-update-form
|
||||||
status: 구현됨
|
status: 계획
|
||||||
source_evidence:
|
source_evidence:
|
||||||
- type: code
|
- type: code
|
||||||
path: packages/flutter/oto_console/lib/src/oto_runners_surface.dart
|
path: packages/flutter/oto_console/lib/src/oto_runners_surface.dart
|
||||||
|
|
@ -18,7 +18,7 @@ source_evidence:
|
||||||
|
|
||||||
Component ID: `runner-self-update-form`
|
Component ID: `runner-self-update-form`
|
||||||
|
|
||||||
Status: `구현됨`
|
Status: `계획`
|
||||||
|
|
||||||
## Source Evidence
|
## Source Evidence
|
||||||
|
|
||||||
|
|
@ -44,6 +44,18 @@ runner별 target version과 HTTPS download URL을 받아 self-update action을
|
||||||
- inline submitting spinner
|
- inline submitting spinner
|
||||||
- action feedback
|
- action feedback
|
||||||
|
|
||||||
|
## Jenkins Reference Alignment
|
||||||
|
|
||||||
|
- Jenkins plugin/core update action의 운영 밀도를 참고하되, runner self-update는 OTO 고유 action으로 정의한다.
|
||||||
|
- HTTPS URL guard는 Jenkins update center처럼 신뢰 가능한 artifact source를 요구하는 UX 신호로 둔다.
|
||||||
|
- update accepted/deferred/failed 결과는 같은 runner row 안에서 확인할 수 있어야 한다.
|
||||||
|
|
||||||
|
## Target Layout Delta
|
||||||
|
|
||||||
|
- self-update form은 runner row의 always-open 입력 영역이 아니라 action panel 또는 inline expanded action으로 제한한다.
|
||||||
|
- version/URL validation은 유지하고, failed/deferred feedback은 같은 runner context에 묶는다.
|
||||||
|
- 현재 row 내부 form은 목표 management action layout 전 단계이므로 코드 반영 전 상태는 `계획`이다.
|
||||||
|
|
||||||
## Variants
|
## Variants
|
||||||
|
|
||||||
- enabled: version과 HTTPS URL이 유효하고 handler가 있음
|
- enabled: version과 HTTPS URL이 유효하고 handler가 있음
|
||||||
|
|
@ -65,4 +77,3 @@ runner별 target version과 HTTPS download URL을 받아 self-update action을
|
||||||
## Decision History
|
## Decision History
|
||||||
|
|
||||||
- 2026-06-24: runner self-update form을 독립 component로 정의했다.
|
- 2026-06-24: runner self-update form을 독립 component로 정의했다.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
---
|
---
|
||||||
ui_doc_type: component
|
ui_doc_type: component
|
||||||
component_id: section-surface
|
component_id: section-surface
|
||||||
status: 구현됨
|
status: 계획
|
||||||
source_evidence:
|
source_evidence:
|
||||||
- type: code
|
- type: code
|
||||||
path: packages/flutter/oto_console/lib/src/oto_console_shell.dart
|
path: packages/flutter/oto_console/lib/src/oto_console_shell.dart
|
||||||
|
|
@ -18,7 +18,7 @@ source_evidence:
|
||||||
|
|
||||||
Component ID: `section-surface`
|
Component ID: `section-surface`
|
||||||
|
|
||||||
Status: `구현됨`
|
Status: `계획`
|
||||||
|
|
||||||
## Source Evidence
|
## Source Evidence
|
||||||
|
|
||||||
|
|
@ -44,6 +44,18 @@ Status: `구현됨`
|
||||||
- empty state panel
|
- empty state panel
|
||||||
- optional detail tiles
|
- optional detail tiles
|
||||||
|
|
||||||
|
## Jenkins Reference Alignment
|
||||||
|
|
||||||
|
- Jenkins Manage Jenkins tile/detail page와 classic empty content panel을 fallback reference로 삼는다.
|
||||||
|
- 전용 surface가 없는 section도 제목, 상태, detail rows를 같은 밀도로 보여줘야 한다.
|
||||||
|
- settings fallback은 Jenkins Manage Jenkins 전체가 아니라 OTO runtime endpoint summary에만 대응한다.
|
||||||
|
|
||||||
|
## Target Layout Delta
|
||||||
|
|
||||||
|
- section surface는 fallback empty state보다 settings/runtime summary group을 담는 reusable surface로 확장하는 것을 목표로 둔다.
|
||||||
|
- title, detail rows, empty/error panel이 Jenkins 관리 화면처럼 분리되어야 한다.
|
||||||
|
- 현재 fallback component는 목표 grouped settings layout 전 단계이므로 코드 반영 전 상태는 `계획`이다.
|
||||||
|
|
||||||
## Variants
|
## Variants
|
||||||
|
|
||||||
- default: empty panel only
|
- default: empty panel only
|
||||||
|
|
@ -65,4 +77,3 @@ Status: `구현됨`
|
||||||
## Decision History
|
## Decision History
|
||||||
|
|
||||||
- 2026-06-24: shell fallback surface를 `section-surface` component로 정의했다.
|
- 2026-06-24: shell fallback surface를 `section-surface` component로 정의했다.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
---
|
---
|
||||||
ui_doc_type: component
|
ui_doc_type: component
|
||||||
component_id: state-panel
|
component_id: state-panel
|
||||||
status: 구현됨
|
status: 계획
|
||||||
source_evidence:
|
source_evidence:
|
||||||
- type: code
|
- type: code
|
||||||
path: packages/flutter/oto_console/lib/src/oto_runners_surface.dart
|
path: packages/flutter/oto_console/lib/src/oto_runners_surface.dart
|
||||||
|
|
@ -21,7 +21,7 @@ source_evidence:
|
||||||
|
|
||||||
Component ID: `state-panel`
|
Component ID: `state-panel`
|
||||||
|
|
||||||
Status: `구현됨`
|
Status: `계획`
|
||||||
|
|
||||||
## Source Evidence
|
## Source Evidence
|
||||||
|
|
||||||
|
|
@ -51,6 +51,18 @@ surface snapshot의 loading, empty, error 상태를 같은 밀도와 테두리
|
||||||
- message
|
- message
|
||||||
- optional progress indicator for loading
|
- optional progress indicator for loading
|
||||||
|
|
||||||
|
## Jenkins Reference Alignment
|
||||||
|
|
||||||
|
- Jenkins administrative monitors, empty dashboard/job list, error banners를 러프 참조로 삼는다.
|
||||||
|
- empty/error/permission denied는 작업자가 다음 action을 판단할 수 있는 짧은 title과 message를 제공해야 한다.
|
||||||
|
- Jenkins warning/monitor처럼 민감 payload를 그대로 복제하지 않고 display-safe summary를 우선한다.
|
||||||
|
|
||||||
|
## Target Layout Delta
|
||||||
|
|
||||||
|
- state panel은 list 영역을 통째로 대신하는 card가 아니라 page/list context 안의 monitor/banner로도 쓸 수 있어야 한다.
|
||||||
|
- error/permission denied는 status severity, summary, optional next action slot을 분리한다.
|
||||||
|
- 현재 surface별 개별 panel 구현은 목표 reusable state pattern 전 단계이므로 코드 반영 전 상태는 `계획`이다.
|
||||||
|
|
||||||
## Variants
|
## Variants
|
||||||
|
|
||||||
- loading: centered progress indicator
|
- loading: centered progress indicator
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
---
|
---
|
||||||
ui_doc_type: component
|
ui_doc_type: component
|
||||||
component_id: status-badge
|
component_id: status-badge
|
||||||
status: 구현됨
|
status: 계획
|
||||||
source_evidence:
|
source_evidence:
|
||||||
- type: code
|
- type: code
|
||||||
path: packages/flutter/oto_console/lib/src/oto_console_overview.dart
|
path: packages/flutter/oto_console/lib/src/oto_console_overview.dart
|
||||||
|
|
@ -21,7 +21,7 @@ source_evidence:
|
||||||
|
|
||||||
Component ID: `status-badge`
|
Component ID: `status-badge`
|
||||||
|
|
||||||
Status: `구현됨`
|
Status: `계획`
|
||||||
|
|
||||||
## Source Evidence
|
## Source Evidence
|
||||||
|
|
||||||
|
|
@ -49,6 +49,18 @@ Status: `구현됨`
|
||||||
- colored container
|
- colored container
|
||||||
- optional dot in overview variant
|
- optional dot in overview variant
|
||||||
|
|
||||||
|
## Jenkins Reference Alignment
|
||||||
|
|
||||||
|
- Jenkins build result icons, node online/offline 상태, controller monitor severity를 OTO badge color/label의 러프 참조로 삼는다.
|
||||||
|
- 색만으로 의미를 전달하지 않고 uppercase label을 함께 제공한다.
|
||||||
|
- Jenkins의 success/unstable/failure/aborted 같은 build result vocabulary와 OTO queued/running/succeeded/failed/canceled vocabulary는 1:1로 강제하지 않는다.
|
||||||
|
|
||||||
|
## Target Layout Delta
|
||||||
|
|
||||||
|
- badge는 entity status와 action result severity를 구분할 수 있게 variant를 명확히 한다.
|
||||||
|
- build/run status는 Jenkins result semantics에 가까운 success/warning/failure/neutral mapping을 제공한다.
|
||||||
|
- 현재 surface별 private badge 구현은 목표 variant 정리 전 단계이므로 코드 반영 전 상태는 `계획`이다.
|
||||||
|
|
||||||
## Variants
|
## Variants
|
||||||
|
|
||||||
- connection: checking/online/degraded/offline
|
- connection: checking/online/degraded/offline
|
||||||
|
|
@ -71,4 +83,3 @@ Status: `구현됨`
|
||||||
## Decision History
|
## Decision History
|
||||||
|
|
||||||
- 2026-06-24: surface별 private badge 구현을 공통 UI component로 문서화했다.
|
- 2026-06-24: surface별 private badge 구현을 공통 UI component로 문서화했다.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -40,6 +40,25 @@ OTO Control Plane Flutter 콘솔의 운영 화면, 반복 component, 상태 표
|
||||||
| docs | `agent-roadmap/sdd/control-plane-product-surface/control-plane-security-audit-surface/SDD.md` | auth token reference와 audit metadata 노출/마스킹 기준 |
|
| docs | `agent-roadmap/sdd/control-plane-product-surface/control-plane-security-audit-surface/SDD.md` | auth token reference와 audit metadata 노출/마스킹 기준 |
|
||||||
| user | 없음 | agent-ui 생성 요청 |
|
| user | 없음 | agent-ui 생성 요청 |
|
||||||
|
|
||||||
|
## External Reference Baseline
|
||||||
|
|
||||||
|
이 화면정의서는 pixel parity가 아니라 정보 구조와 러프한 운영 화면 배치를 맞추는 기준으로 Jenkins 최신 UI를 참조한다.
|
||||||
|
|
||||||
|
| Reference | 확인일 | 적용 기준 |
|
||||||
|
|-----------|--------|-----------|
|
||||||
|
| Jenkins weekly `2.571` changelog | 2026-07-02 | 최신 weekly 기준. breadcrumb, System Log, task UI, dialog/apply animation 같은 운영 UI 보정이 계속 반영되는 기준으로 본다. URL: https://www.jenkins.io/changelog/ |
|
||||||
|
| Jenkins LTS `2.555.3` changelog | 2026-07-02 | 안정 배포 기준. Java 21+, permission/API token/security UI 변화와 LTS 호환 범위를 확인하는 기준으로 본다. URL: https://www.jenkins.io/changelog-stable/ |
|
||||||
|
| Jenkins refreshed design `2.516.1+` | 2026-07-02 | 통합 header/breadcrumb/action, 접근성 대비, 테마, responsive action 배치를 러프 레이아웃 참조로 삼는다. URL: https://www.jenkins.io/blog/2025/07/24/redesigning-jenkins-part-two/ |
|
||||||
|
| Pipeline Graph View | 2026-07-02 | Pipeline/run 상세의 active reference. stage graph, stage list, logs를 한 화면에서 다루는 구조를 executions view의 후속 조정 후보로 둔다. URL: https://plugins.jenkins.io/pipeline-graph-view/ |
|
||||||
|
| Blue Ocean | 2026-07-02 | 2026년 7월 deprecation 예정이므로 신규 기준이 아니라 legacy comparison으로만 사용한다. URL: https://www.jenkins.io/doc/book/blueocean/getting-started/ |
|
||||||
|
|
||||||
|
## Target Layout Status
|
||||||
|
|
||||||
|
- 현재 Flutter 구현은 기존 OTO console layout의 code evidence다.
|
||||||
|
- Jenkins 정렬 목표가 들어간 view/component는 코드 반영 전 재작업 대상이므로 `계획` 상태로 둔다.
|
||||||
|
- 목표는 pixel parity가 아니라 header/action/status/list/detail/log/artifact의 정보 배치와 운영 밀도를 Jenkins 최신 UI 흐름에 맞추는 것이다.
|
||||||
|
- 코드 반영은 agent-ui 검증 후 `sync-agent-ui`에서 직접 구현, plan, milestone 중 하나로 라우팅한다.
|
||||||
|
|
||||||
## Structure
|
## Structure
|
||||||
|
|
||||||
- `views/`: 화면 또는 업무 단위 정의
|
- `views/`: 화면 또는 업무 단위 정의
|
||||||
|
|
@ -63,3 +82,4 @@ OTO Control Plane Flutter 콘솔의 운영 화면, 반복 component, 상태 표
|
||||||
## Decision History
|
## Decision History
|
||||||
|
|
||||||
- 2026-06-24: Flutter 콘솔 구현을 기준으로 `code-first` agent-ui scaffold를 생성했다.
|
- 2026-06-24: Flutter 콘솔 구현을 기준으로 `code-first` agent-ui scaffold를 생성했다.
|
||||||
|
- 2026-07-02: Jenkins 최신 weekly/LTS와 `2.516+` refreshed UI를 러프 레이아웃 참조 기준선으로 추가했다.
|
||||||
|
|
|
||||||
|
|
@ -60,6 +60,12 @@ OTO capability context를 agent-shell 대화 표면에 연결한다.
|
||||||
2. registered capabilities
|
2. registered capabilities
|
||||||
3. prompt input
|
3. prompt input
|
||||||
|
|
||||||
|
## Jenkins Reference Alignment
|
||||||
|
|
||||||
|
- Jenkins classic/modern UI에 직접 대응되는 화면은 아니다.
|
||||||
|
- OTO agent-shell 확장 표면으로 유지하며, Jenkins parity 기준에서는 navigation destination과 permission/state consistency만 맞춘다.
|
||||||
|
- Jenkins command palette나 global search 같은 power-user affordance가 필요해지면 agent view가 아니라 shell-level component 후보로 분리한다.
|
||||||
|
|
||||||
## Regions
|
## Regions
|
||||||
|
|
||||||
| Region ID | Purpose | Component | Priority | Notes |
|
| Region ID | Purpose | Component | Priority | Notes |
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
---
|
---
|
||||||
ui_doc_type: view
|
ui_doc_type: view
|
||||||
view_id: artifacts
|
view_id: artifacts
|
||||||
status: 구현됨
|
status: 계획
|
||||||
frame: null
|
frame: null
|
||||||
source_evidence:
|
source_evidence:
|
||||||
- type: code
|
- type: code
|
||||||
|
|
@ -29,7 +29,7 @@ View ID: `artifacts`
|
||||||
Frame:
|
Frame:
|
||||||
- 없음
|
- 없음
|
||||||
|
|
||||||
Status: `구현됨`
|
Status: `계획`
|
||||||
|
|
||||||
## Source Evidence
|
## Source Evidence
|
||||||
|
|
||||||
|
|
@ -61,6 +61,19 @@ Control Plane에 수집된 artifact event를 목록으로 확인한다.
|
||||||
2. artifact path
|
2. artifact path
|
||||||
3. snapshot state
|
3. snapshot state
|
||||||
|
|
||||||
|
## Jenkins Reference Alignment
|
||||||
|
|
||||||
|
- Jenkins build artifacts와 artifact/workspace browser를 OTO artifact event list의 러프 참조로 삼는다.
|
||||||
|
- 현재 범위는 name/path scan에 한정하고, Jenkins처럼 directory browsing, file download, content preview를 제공하는 것은 후속 후보로 둔다.
|
||||||
|
- artifact path는 SDD 기준에 따라 민감한 full path나 content를 복제 노출하지 않는 방향을 우선한다.
|
||||||
|
|
||||||
|
## Target Layout Delta
|
||||||
|
|
||||||
|
- artifact row는 Jenkins artifact browser처럼 file identity, path/location, execution context 후보를 분리해서 스캔하게 한다.
|
||||||
|
- download/content preview가 없더라도 artifact browser로 확장 가능한 list anatomy를 먼저 정의한다.
|
||||||
|
- path는 ellipsis/masking을 유지하고, full path 노출은 별도 permission/audit 기준이 생기기 전까지 보수적으로 둔다.
|
||||||
|
- 현재 코드의 단순 icon/name/path row는 목표 layout 전 단계이므로 코드 반영 전 상태는 `계획`이다.
|
||||||
|
|
||||||
## Regions
|
## Regions
|
||||||
|
|
||||||
| Region ID | Purpose | Component | Priority | Notes |
|
| Region ID | Purpose | Component | Priority | Notes |
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
---
|
---
|
||||||
ui_doc_type: view
|
ui_doc_type: view
|
||||||
view_id: executions
|
view_id: executions
|
||||||
status: 구현됨
|
status: 계획
|
||||||
frame: null
|
frame: null
|
||||||
source_evidence:
|
source_evidence:
|
||||||
- type: code
|
- type: code
|
||||||
|
|
@ -34,7 +34,7 @@ View ID: `executions`
|
||||||
Frame:
|
Frame:
|
||||||
- 없음
|
- 없음
|
||||||
|
|
||||||
Status: `구현됨`
|
Status: `계획`
|
||||||
|
|
||||||
## Source Evidence
|
## Source Evidence
|
||||||
|
|
||||||
|
|
@ -68,6 +68,21 @@ execution 상태를 확인하고, 상세 영역에서 cancel/report/log/artifact
|
||||||
2. action toolbar와 결과 feedback
|
2. action toolbar와 결과 feedback
|
||||||
3. logs/artifacts preview
|
3. logs/artifacts preview
|
||||||
|
|
||||||
|
## Jenkins Reference Alignment
|
||||||
|
|
||||||
|
- Jenkins Build History, build/run detail, Console Output, Pipeline Graph View를 OTO `executions` view의 active reference로 삼는다.
|
||||||
|
- 현재 구현은 execution list row를 tap해서 detail을 확장하는 구조이며, Jenkins build page의 run header, action list, console/artifact 영역을 한 row detail 안으로 압축한다.
|
||||||
|
- Pipeline Graph View의 stage graph, collapsible stage list, live log pane은 후속 조정 후보다. 현재 정의에서는 `executions.logs-preview`와 `executions.artifacts-preview`가 우선 대응한다.
|
||||||
|
- Blue Ocean restart/stage UI는 deprecated legacy reference로만 두고, 신규 정의 기준은 Pipeline Graph View로 맞춘다.
|
||||||
|
- cancel/report/log/artifact action은 Jenkins Abort/Restart/Console/Artifacts 흐름을 참고하되 OTO write action contract와 audit masking 기준을 우선한다.
|
||||||
|
|
||||||
|
## Target Layout Delta
|
||||||
|
|
||||||
|
- execution list와 selected run detail을 Jenkins Build History + build page처럼 list/detail 관계로 재정렬한다.
|
||||||
|
- selected detail은 run header, action toolbar, stage/step summary placeholder, log pane, artifact pane 순서로 구성한다.
|
||||||
|
- Pipeline Graph View의 graph/stage/log 통합 layout을 후속 구현 기준으로 두되, OTO에 stage graph 데이터가 없으면 summary placeholder를 먼저 둔다.
|
||||||
|
- 현재 코드의 expandable card 안 action/log/artifact preview는 목표 layout 전 단계이므로 코드 반영 전 상태는 `계획`이다.
|
||||||
|
|
||||||
## Regions
|
## Regions
|
||||||
|
|
||||||
| Region ID | Purpose | Component | Priority | Notes |
|
| Region ID | Purpose | Component | Priority | Notes |
|
||||||
|
|
|
||||||
|
|
@ -16,13 +16,13 @@ views:
|
||||||
|
|
||||||
| View ID | Status | Evidence | Description |
|
| View ID | Status | Evidence | Description |
|
||||||
|---------|--------|----------|-------------|
|
|---------|--------|----------|-------------|
|
||||||
| `overview` | 구현됨 | `OtoConsoleOverview` | Control Plane endpoint, connection, authentication reference overview |
|
| `overview` | 계획 | `OtoConsoleOverview` + Jenkins reference baseline | Control Plane endpoint, connection, authentication reference overview. Jenkins-style header/status layout 재정렬 대상 |
|
||||||
| `runners` | 구현됨 | `OtoRunnersSurface` | runner registry state and self-update action surface |
|
| `runners` | 계획 | `OtoRunnersSurface` + Jenkins reference baseline | runner registry state and self-update action surface. Jenkins Nodes/Agents-style list 재정렬 대상 |
|
||||||
| `pipelines` | 구현됨 | `OtoJobsSurface` | pipeline/job queue list and create job action surface |
|
| `pipelines` | 계획 | `OtoJobsSurface` + Jenkins reference baseline | pipeline/job queue list and create job action surface. Jenkins Dashboard/New Item-style flow 재정렬 대상 |
|
||||||
| `executions` | 구현됨 | `OtoExecutionsSurface` | execution list, detail expansion, write actions, log/artifact preview |
|
| `executions` | 계획 | `OtoExecutionsSurface` + Jenkins reference baseline | execution list, detail expansion, write actions, log/artifact preview. Pipeline Graph View-style run detail 재정렬 대상 |
|
||||||
| `artifacts` | 구현됨 | `OtoArtifactsSurface` | artifact event list |
|
| `artifacts` | 계획 | `OtoArtifactsSurface` + Jenkins reference baseline | artifact event list. Jenkins artifact browser-style list 재정렬 대상 |
|
||||||
| `agent` | 구현됨 | `OtoAgentPanel` | embeddable agent-shell panel for OTO capabilities |
|
| `agent` | 구현됨 | `OtoAgentPanel` | embeddable agent-shell panel for OTO capabilities |
|
||||||
| `settings` | 구현됨 | `OtoConsoleShell` fallback section | runtime endpoint and browser policy details |
|
| `settings` | 계획 | `OtoConsoleShell` fallback section + Jenkins reference baseline | runtime endpoint and browser policy details. Manage Jenkins-style grouping 재정렬 대상 |
|
||||||
|
|
||||||
## Navigation
|
## Navigation
|
||||||
|
|
||||||
|
|
@ -46,7 +46,26 @@ views:
|
||||||
|
|
||||||
- operator/admin: write action submit 가능 여부를 제어하는 최소 역할 후보. 현재 SDD 기준은 단일 역할과 표시 가능한 token reference다.
|
- operator/admin: write action submit 가능 여부를 제어하는 최소 역할 후보. 현재 SDD 기준은 단일 역할과 표시 가능한 token reference다.
|
||||||
|
|
||||||
|
## Jenkins Reference Mapping
|
||||||
|
|
||||||
|
| OTO View | Jenkins Reference | Rough Alignment |
|
||||||
|
|----------|-------------------|-----------------|
|
||||||
|
| `overview` | Dashboard, controller monitors, header status | Core/API 상태와 주요 진입점을 한 화면 상단에서 스캔한다. |
|
||||||
|
| `runners` | Nodes and Clouds, agents list | runner를 Jenkins agent/node처럼 상태, 현재 작업, 연결 메시지 중심으로 목록화한다. |
|
||||||
|
| `pipelines` | Dashboard jobs, New Item, job page | pipeline/job 목록, create action, 연결된 execution 이동을 Jenkins job 흐름과 맞춘다. |
|
||||||
|
| `executions` | Build/run detail, Build History, Console Output, Pipeline Graph View | 실행 목록에서 run detail로 확장하고 action, log, artifact preview를 함께 둔다. Stage graph는 후속 조정 후보로 둔다. |
|
||||||
|
| `artifacts` | Build artifacts, workspace/artifact browser | artifact name/path를 빌드 산출물 목록처럼 스캔한다. 다운로드/브라우징은 후속 후보로 둔다. |
|
||||||
|
| `settings` | Manage Jenkins | endpoint, policy, local runtime preference를 운영 설정 요약으로 둔다. |
|
||||||
|
| `agent` | 없음 | OTO 전용 agent-shell 확장 표면이며 Jenkins parity 대상에서 제외한다. |
|
||||||
|
|
||||||
|
## Rough Layout Rules
|
||||||
|
|
||||||
|
- Jenkins `2.516+`의 통합 header/breadcrumb/action 모델은 OTO의 view header와 action 영역을 정리하는 참조로 삼는다.
|
||||||
|
- 현재 OTO 구현의 60px rail은 유지하며, Jenkins classic side task list와 Blue Ocean top navigation을 절충한 운영 콘솔 navigation으로 본다.
|
||||||
|
- Pipeline execution 상세는 Blue Ocean보다 Pipeline Graph View를 active reference로 삼는다.
|
||||||
|
- pixel, spacing, color token, exact component parity는 이번 화면정의서 범위에서 제외한다.
|
||||||
|
- 위 레이아웃 재정렬은 코드 반영 전이므로 대상 view status는 `계획`으로 둔다.
|
||||||
|
|
||||||
## Open Questions
|
## Open Questions
|
||||||
|
|
||||||
- 없음
|
- 없음
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
---
|
---
|
||||||
ui_doc_type: view
|
ui_doc_type: view
|
||||||
view_id: overview
|
view_id: overview
|
||||||
status: 구현됨
|
status: 계획
|
||||||
frame: null
|
frame: null
|
||||||
source_evidence:
|
source_evidence:
|
||||||
- type: code
|
- type: code
|
||||||
|
|
@ -31,7 +31,7 @@ View ID: `overview`
|
||||||
Frame:
|
Frame:
|
||||||
- 없음
|
- 없음
|
||||||
|
|
||||||
Status: `구현됨`
|
Status: `계획`
|
||||||
|
|
||||||
## Source Evidence
|
## Source Evidence
|
||||||
|
|
||||||
|
|
@ -64,6 +64,20 @@ Control Plane의 API endpoint, Core 연결 상태, authentication reference를
|
||||||
2. HTTP/Wire endpoint와 browser API policy
|
2. HTTP/Wire endpoint와 browser API policy
|
||||||
3. auth token reference와 refresh action
|
3. auth token reference와 refresh action
|
||||||
|
|
||||||
|
## Jenkins Reference Alignment
|
||||||
|
|
||||||
|
- Jenkins Dashboard와 administrative monitor의 역할을 OTO Core status summary로 축약한다.
|
||||||
|
- Jenkins `2.516+` header/breadcrumb/action 모델은 `overview.header`의 제목, 상태 badge, refresh action 배치 참조로 둔다.
|
||||||
|
- Jenkins controller URL, system health, security notice에 해당하는 정보는 OTO의 HTTP/Wire endpoint, health/readiness, auth token reference로 대응한다.
|
||||||
|
- 이번 단계에서는 global search, breadcrumb overflow, theme picker 같은 Jenkins shell 기능은 scope에서 제외한다.
|
||||||
|
|
||||||
|
## Target Layout Delta
|
||||||
|
|
||||||
|
- page header는 Jenkins refreshed header처럼 제목, connection status, primary refresh action을 한 줄 우선순위로 정렬한다.
|
||||||
|
- content는 controller monitor summary, endpoint detail, authentication/policy detail 순서의 운영 dashboard layout으로 재정렬한다.
|
||||||
|
- endpoint tile과 connection grid는 유지하되, Jenkins dashboard처럼 status first scan이 가능하도록 상단 density를 높인다.
|
||||||
|
- 현재 코드의 단순 centered list layout은 목표 layout이 아니므로 코드 반영 전 상태는 `계획`이다.
|
||||||
|
|
||||||
## Regions
|
## Regions
|
||||||
|
|
||||||
| Region ID | Purpose | Component | Priority | Notes |
|
| Region ID | Purpose | Component | Priority | Notes |
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
---
|
---
|
||||||
ui_doc_type: view
|
ui_doc_type: view
|
||||||
view_id: pipelines
|
view_id: pipelines
|
||||||
status: 구현됨
|
status: 계획
|
||||||
frame: null
|
frame: null
|
||||||
source_evidence:
|
source_evidence:
|
||||||
- type: code
|
- type: code
|
||||||
|
|
@ -32,7 +32,7 @@ View ID: `pipelines`
|
||||||
Frame:
|
Frame:
|
||||||
- 없음
|
- 없음
|
||||||
|
|
||||||
Status: `구현됨`
|
Status: `계획`
|
||||||
|
|
||||||
## Source Evidence
|
## Source Evidence
|
||||||
|
|
||||||
|
|
@ -64,6 +64,20 @@ pipeline/job queue를 확인하고, 새 job을 만들며, 연결된 execution으
|
||||||
2. job list와 상태 badge
|
2. job list와 상태 badge
|
||||||
3. execution link
|
3. execution link
|
||||||
|
|
||||||
|
## Jenkins Reference Alignment
|
||||||
|
|
||||||
|
- Jenkins Dashboard job list와 New Item 흐름을 OTO `pipelines` view의 러프 참조로 삼는다.
|
||||||
|
- `Pipelines / Jobs` 명명은 유지하되, row 구조는 Jenkins job page처럼 name/id/state와 최근 실행 링크를 먼저 스캔하게 한다.
|
||||||
|
- create form은 Jenkins New Item보다 훨씬 얇은 OTO job draft form으로 한정한다.
|
||||||
|
- Jenkins folder/multibranch/organization folder 같은 job taxonomy는 현재 OTO 범위에서 제외하고 후속 확장 후보로 둔다.
|
||||||
|
|
||||||
|
## Target Layout Delta
|
||||||
|
|
||||||
|
- header에는 Jenkins Dashboard/New Item처럼 job create entry point와 list context를 분리해서 배치한다.
|
||||||
|
- create form은 상단 고정 입력폼보다 primary action 또는 compact create panel로 정리하는 방향을 목표로 둔다.
|
||||||
|
- job list는 name/id/state/execution link를 Jenkins job row처럼 더 빠르게 비교할 수 있는 dense row layout으로 재정렬한다.
|
||||||
|
- 현재 코드의 wide form + card list 조합은 목표 layout 전 단계이므로 코드 반영 전 상태는 `계획`이다.
|
||||||
|
|
||||||
## Regions
|
## Regions
|
||||||
|
|
||||||
| Region ID | Purpose | Component | Priority | Notes |
|
| Region ID | Purpose | Component | Priority | Notes |
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
---
|
---
|
||||||
ui_doc_type: view
|
ui_doc_type: view
|
||||||
view_id: runners
|
view_id: runners
|
||||||
status: 구현됨
|
status: 계획
|
||||||
frame: null
|
frame: null
|
||||||
source_evidence:
|
source_evidence:
|
||||||
- type: code
|
- type: code
|
||||||
|
|
@ -31,7 +31,7 @@ View ID: `runners`
|
||||||
Frame:
|
Frame:
|
||||||
- 없음
|
- 없음
|
||||||
|
|
||||||
Status: `구현됨`
|
Status: `계획`
|
||||||
|
|
||||||
## Source Evidence
|
## Source Evidence
|
||||||
|
|
||||||
|
|
@ -64,6 +64,20 @@ Status: `구현됨`
|
||||||
2. active job/execution context
|
2. active job/execution context
|
||||||
3. self-update form과 action feedback
|
3. self-update form과 action feedback
|
||||||
|
|
||||||
|
## Jenkins Reference Alignment
|
||||||
|
|
||||||
|
- Jenkins Nodes and Clouds/agent list를 OTO runner registry의 러프 참조로 삼는다.
|
||||||
|
- row는 agent/node처럼 id, alias, status, offline/online message, 현재 job/execution context를 우선 보여준다.
|
||||||
|
- Jenkins changelog의 "temporarily offline" 같은 agent 상태 혼동 방지 흐름을 참고해, runner 상태 label과 message는 분리해서 읽히게 유지한다.
|
||||||
|
- self-update는 Jenkins core plugin action과 동일시하지 않고 OTO 고유 write action으로 둔다. 다만 결과 feedback은 Jenkins 관리 action처럼 즉시 확인 가능해야 한다.
|
||||||
|
|
||||||
|
## Target Layout Delta
|
||||||
|
|
||||||
|
- runner list는 Jenkins Nodes/Agents처럼 status, executor/work context, message를 먼저 스캔하는 dense row layout으로 재정렬한다.
|
||||||
|
- self-update form은 row 하단에 항상 펼쳐진 form이 아니라 관리 action 영역으로 묶는 방향을 목표로 둔다.
|
||||||
|
- empty/error state는 Jenkins monitor/banner 흐름처럼 다음 확인 지점을 드러내는 상태 panel로 정리한다.
|
||||||
|
- 현재 코드의 card row와 inline form은 목표 layout 전 단계이므로 코드 반영 전 상태는 `계획`이다.
|
||||||
|
|
||||||
## Regions
|
## Regions
|
||||||
|
|
||||||
| Region ID | Purpose | Component | Priority | Notes |
|
| Region ID | Purpose | Component | Priority | Notes |
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
---
|
---
|
||||||
ui_doc_type: view
|
ui_doc_type: view
|
||||||
view_id: settings
|
view_id: settings
|
||||||
status: 구현됨
|
status: 계획
|
||||||
frame: null
|
frame: null
|
||||||
source_evidence:
|
source_evidence:
|
||||||
- type: code
|
- type: code
|
||||||
|
|
@ -29,7 +29,7 @@ View ID: `settings`
|
||||||
Frame:
|
Frame:
|
||||||
- 없음
|
- 없음
|
||||||
|
|
||||||
Status: `구현됨`
|
Status: `계획`
|
||||||
|
|
||||||
## Source Evidence
|
## Source Evidence
|
||||||
|
|
||||||
|
|
@ -61,6 +61,20 @@ Status: `구현됨`
|
||||||
2. Wire URL
|
2. Wire URL
|
||||||
3. browser API policy
|
3. browser API policy
|
||||||
|
|
||||||
|
## Jenkins Reference Alignment
|
||||||
|
|
||||||
|
- Jenkins Manage Jenkins를 OTO `settings` view의 러프 참조로 삼는다.
|
||||||
|
- 현재 구현은 local runtime endpoint와 browser policy만 보여주는 fallback surface다.
|
||||||
|
- Jenkins Manage Jenkins의 System Configuration, Security, Status Information, Troubleshooting, Tools and Actions grouping은 후속 설정 화면 확장 시 grouping 후보로 둔다.
|
||||||
|
- OTO runner/server runtime 설정과 Jenkins controller administration을 같은 정보 구조로 강제하지 않는다.
|
||||||
|
|
||||||
|
## Target Layout Delta
|
||||||
|
|
||||||
|
- settings는 fallback empty panel이 아니라 Manage Jenkins처럼 runtime, security/policy, connectivity 그룹으로 나누는 layout을 목표로 둔다.
|
||||||
|
- 현재 표시 항목은 HTTP API, Wire URL, Browser API policy로 제한하되 group label을 명확히 한다.
|
||||||
|
- future setting이 생기면 같은 group system 아래에 tile을 추가한다.
|
||||||
|
- 현재 코드의 generic fallback section은 목표 layout 전 단계이므로 코드 반영 전 상태는 `계획`이다.
|
||||||
|
|
||||||
## Regions
|
## Regions
|
||||||
|
|
||||||
| Region ID | Purpose | Component | Priority | Notes |
|
| Region ID | Purpose | Component | Priority | Notes |
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,12 @@ frames: []
|
||||||
- `views/<view-id>/index.md`: visual source가 있는 view의 frame 연결 문서
|
- `views/<view-id>/index.md`: visual source가 있는 view의 frame 연결 문서
|
||||||
- `views/<view-id>/wire.excalidraw`: 선택 visual source
|
- `views/<view-id>/wire.excalidraw`: 선택 visual source
|
||||||
|
|
||||||
|
## Current Visual Scope
|
||||||
|
|
||||||
|
- Jenkins reference alignment는 현재 `definition/**`의 정보 구조와 러프 layout rule로만 반영한다.
|
||||||
|
- pixel-level wireframe 또는 visual source는 아직 만들지 않는다.
|
||||||
|
- visual source가 생기기 전까지 `frames: []`와 view `frame: null` 상태를 유지한다.
|
||||||
|
|
||||||
## Rules
|
## Rules
|
||||||
|
|
||||||
- frame은 definition을 대체하지 않는다.
|
- frame은 definition을 대체하지 않는다.
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue