diff --git a/agent-roadmap/phase/control-plane-product-surface/PHASE.md b/agent-roadmap/phase/control-plane-product-surface/PHASE.md index 461e23b..fa94b3e 100644 --- a/agent-roadmap/phase/control-plane-product-surface/PHASE.md +++ b/agent-roadmap/phase/control-plane-product-surface/PHASE.md @@ -33,6 +33,9 @@ - [진행중] Control Plane 운영 보안·감사 표면 - 경로: `agent-roadmap/phase/control-plane-product-surface/milestones/control-plane-security-audit-surface.md` - 요약: 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 경계 diff --git a/agent-roadmap/phase/control-plane-product-surface/milestones/control-plane-jenkins-aligned-layout-pass.md b/agent-roadmap/phase/control-plane-product-surface/milestones/control-plane-jenkins-aligned-layout-pass.md new file mode 100644 index 0000000..d01c87a --- /dev/null +++ b/agent-roadmap/phase/control-plane-product-surface/milestones/control-plane-jenkins-aligned-layout-pass.md @@ -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를 입력으로 작성한다. diff --git a/agent-task/m-control-plane-jenkins-aligned-layout-pass/01_definition_shell_foundation/CODE_REVIEW-local-G06.md b/agent-task/m-control-plane-jenkins-aligned-layout-pass/01_definition_shell_foundation/CODE_REVIEW-local-G06.md new file mode 100644 index 0000000..dcf7109 --- /dev/null +++ b/agent-task/m-control-plane-jenkins-aligned-layout-pass/01_definition_shell_foundation/CODE_REVIEW-local-G06.md @@ -0,0 +1,201 @@ + + +# 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-`이면 완료 이벤트 메타데이터를 보고한다. 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-`이면 런타임이 읽을 완료 이벤트 메타데이터를 보고하고, 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 | diff --git a/agent-task/m-control-plane-jenkins-aligned-layout-pass/01_definition_shell_foundation/PLAN-local-G06.md b/agent-task/m-control-plane-jenkins-aligned-layout-pass/01_definition_shell_foundation/PLAN-local-G06.md new file mode 100644 index 0000000..e910c89 --- /dev/null +++ b/agent-task/m-control-plane-jenkins-aligned-layout-pass/01_definition_shell_foundation/PLAN-local-G06.md @@ -0,0 +1,407 @@ + + +# 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`의 구현 에이전트 소유 섹션을 채운다. 이 파일 작성이 구현의 마지막 단계다. diff --git a/agent-task/m-control-plane-jenkins-aligned-layout-pass/02+01_primary_views/CODE_REVIEW-local-G06.md b/agent-task/m-control-plane-jenkins-aligned-layout-pass/02+01_primary_views/CODE_REVIEW-local-G06.md new file mode 100644 index 0000000..369de4d --- /dev/null +++ b/agent-task/m-control-plane-jenkins-aligned-layout-pass/02+01_primary_views/CODE_REVIEW-local-G06.md @@ -0,0 +1,173 @@ + + +# 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-`이면 완료 이벤트 메타데이터를 보고한다. 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-`이면 런타임이 읽을 완료 이벤트 메타데이터를 보고하고, 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 | diff --git a/agent-task/m-control-plane-jenkins-aligned-layout-pass/02+01_primary_views/PLAN-local-G06.md b/agent-task/m-control-plane-jenkins-aligned-layout-pass/02+01_primary_views/PLAN-local-G06.md new file mode 100644 index 0000000..4204c93 --- /dev/null +++ b/agent-task/m-control-plane-jenkins-aligned-layout-pass/02+01_primary_views/PLAN-local-G06.md @@ -0,0 +1,369 @@ + + +# 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: ` 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`의 구현 에이전트 소유 섹션을 채운다. 이 파일 작성이 구현의 마지막 단계다. diff --git a/agent-task/m-control-plane-jenkins-aligned-layout-pass/03+01,02_execution_artifact_views/CODE_REVIEW-local-G07.md b/agent-task/m-control-plane-jenkins-aligned-layout-pass/03+01,02_execution_artifact_views/CODE_REVIEW-local-G07.md new file mode 100644 index 0000000..40ad5e2 --- /dev/null +++ b/agent-task/m-control-plane-jenkins-aligned-layout-pass/03+01,02_execution_artifact_views/CODE_REVIEW-local-G07.md @@ -0,0 +1,210 @@ + + +# 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-`이면 완료 이벤트 메타데이터를 보고한다. 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-`이면 런타임이 읽을 완료 이벤트 메타데이터를 보고하고, 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 | diff --git a/agent-task/m-control-plane-jenkins-aligned-layout-pass/03+01,02_execution_artifact_views/PLAN-local-G07.md b/agent-task/m-control-plane-jenkins-aligned-layout-pass/03+01,02_execution_artifact_views/PLAN-local-G07.md new file mode 100644 index 0000000..6293fef --- /dev/null +++ b/agent-task/m-control-plane-jenkins-aligned-layout-pass/03+01,02_execution_artifact_views/PLAN-local-G07.md @@ -0,0 +1,396 @@ + + +# 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`의 구현 에이전트 소유 섹션을 채운다. 이 파일 작성이 구현의 마지막 단계다. diff --git a/agent-ui/definition/components/action-feedback/index.md b/agent-ui/definition/components/action-feedback/index.md index fe7e125..318a85e 100644 --- a/agent-ui/definition/components/action-feedback/index.md +++ b/agent-ui/definition/components/action-feedback/index.md @@ -1,7 +1,7 @@ --- ui_doc_type: component component_id: action-feedback -status: 구현됨 +status: 계획 source_evidence: - type: code path: packages/flutter/oto_console/lib/src/oto_runners_surface.dart @@ -21,7 +21,7 @@ source_evidence: Component ID: `action-feedback` -Status: `구현됨` +Status: `계획` ## Source Evidence @@ -49,6 +49,18 @@ write action 결과를 success, deferred, failed 상태로 짧게 표시한다. - success/failure color - 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 - success @@ -70,4 +82,3 @@ write action 결과를 success, deferred, failed 상태로 짧게 표시한다. ## Decision History - 2026-06-24: write action 결과 표시를 `action-feedback` component로 정의했다. - diff --git a/agent-ui/definition/components/artifact-list/index.md b/agent-ui/definition/components/artifact-list/index.md index 249a735..7c7c2cf 100644 --- a/agent-ui/definition/components/artifact-list/index.md +++ b/agent-ui/definition/components/artifact-list/index.md @@ -1,7 +1,7 @@ --- ui_doc_type: component component_id: artifact-list -status: 구현됨 +status: 계획 source_evidence: - type: code path: packages/flutter/oto_console/lib/src/oto_artifacts_surface.dart @@ -21,7 +21,7 @@ source_evidence: Component ID: `artifact-list` -Status: `구현됨` +Status: `계획` ## Source Evidence @@ -48,6 +48,18 @@ artifact name과 path를 row 목록으로 보여준다. - artifact path - 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 - full tab row @@ -69,4 +81,3 @@ artifact name과 path를 row 목록으로 보여준다. ## Decision History - 2026-06-24: artifact tab과 execution detail preview를 `artifact-list` component로 묶었다. - diff --git a/agent-ui/definition/components/console-rail/index.md b/agent-ui/definition/components/console-rail/index.md index fd74f83..9d03596 100644 --- a/agent-ui/definition/components/console-rail/index.md +++ b/agent-ui/definition/components/console-rail/index.md @@ -1,7 +1,7 @@ --- ui_doc_type: component component_id: console-rail -status: 구현됨 +status: 계획 source_evidence: - type: code path: packages/flutter/oto_console/lib/src/oto_console_shell.dart @@ -18,7 +18,7 @@ source_evidence: Component ID: `console-rail` -Status: `구현됨` +Status: `계획` ## Source Evidence @@ -50,6 +50,18 @@ Status: `구현됨` - top main section 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 - default: 60px rail width, 56x48 button hit area diff --git a/agent-ui/definition/components/console-shell/index.md b/agent-ui/definition/components/console-shell/index.md index 2d6e416..b41a08b 100644 --- a/agent-ui/definition/components/console-shell/index.md +++ b/agent-ui/definition/components/console-shell/index.md @@ -1,7 +1,7 @@ --- ui_doc_type: component component_id: console-shell -status: 구현됨 +status: 계획 source_evidence: - type: code path: packages/flutter/oto_console/lib/src/oto_console_shell.dart @@ -18,7 +18,7 @@ source_evidence: Component ID: `console-shell` -Status: `구현됨` +Status: `계획` ## Source Evidence @@ -50,6 +50,19 @@ Control Plane 콘솔의 전체 layout shell을 제공하고, rail navigation과 - selected section content area - 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 - default: host가 전용 surface를 모두 넘긴 상태 @@ -70,4 +83,3 @@ Control Plane 콘솔의 전체 layout shell을 제공하고, rail navigation과 ## Decision History - 2026-06-24: 구현 후보 재검토 중 `OtoConsoleShell`을 별도 shell component로 보강했다. - diff --git a/agent-ui/definition/components/execution-action-toolbar/index.md b/agent-ui/definition/components/execution-action-toolbar/index.md index 85ae2e9..1125662 100644 --- a/agent-ui/definition/components/execution-action-toolbar/index.md +++ b/agent-ui/definition/components/execution-action-toolbar/index.md @@ -1,7 +1,7 @@ --- ui_doc_type: component component_id: execution-action-toolbar -status: 구현됨 +status: 계획 source_evidence: - type: code path: packages/flutter/oto_console/lib/src/oto_executions_surface.dart @@ -18,7 +18,7 @@ source_evidence: Component ID: `execution-action-toolbar` -Status: `구현됨` +Status: `계획` ## Source Evidence @@ -45,6 +45,18 @@ Status: `구현됨` - per-button submitting/success/failure indicator - 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 - enabled: runner id가 있고 cancel 상태가 아니며 submitting 중이 아님 @@ -67,4 +79,3 @@ Status: `구현됨` ## Decision History - 2026-06-24: execution write action button group을 `execution-action-toolbar` component로 정의했다. - diff --git a/agent-ui/definition/components/index.md b/agent-ui/definition/components/index.md index 465161d..aa22d69 100644 --- a/agent-ui/definition/components/index.md +++ b/agent-ui/definition/components/index.md @@ -27,23 +27,23 @@ components: | Component ID | Status | Evidence | Description | |--------------|--------|----------|-------------| -| `console-shell` | 구현됨 | `oto_console_shell.dart` | overall console scaffold with rail and selected section content | -| `console-rail` | 구현됨 | `oto_console_shell.dart` | section navigation rail | -| `section-surface` | 구현됨 | `oto_console_shell.dart` | generic titled empty/detail section shell | -| `state-panel` | 구현됨 | surface files | loading, empty, error state blocks | -| `status-badge` | 구현됨 | overview/runners/jobs/executions surface files | compact status label badge | +| `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` + Jenkins reference baseline | section navigation rail. Jenkins navigation grouping 재정렬 대상 | +| `section-surface` | 계획 | `oto_console_shell.dart` + Jenkins reference baseline | generic titled empty/detail section shell. Manage Jenkins-style fallback grouping 재정렬 대상 | +| `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 + Jenkins reference baseline | compact status label badge. Jenkins result/severity vocabulary 정렬 대상 | | `endpoint-tile` | 구현됨 | `oto_console_overview.dart` | endpoint or config value tile | | `connection-status-grid` | 구현됨 | `oto_console_overview.dart` | health/readiness status grid | | `auth-token-reference` | 구현됨 | `oto_console_overview.dart` | display-only auth token reference | -| `record-list` | 구현됨 | runners/jobs/executions/artifacts surface files | repeated entity list rows | -| `action-feedback` | 구현됨 | runners/jobs/executions surface files | success/deferred/failed action message | -| `runner-self-update-form` | 구현됨 | `oto_runners_surface.dart` | runner self-update draft form | -| `job-create-form` | 구현됨 | `oto_jobs_surface.dart` | job create draft form | -| `execution-action-toolbar` | 구현됨 | `oto_executions_surface.dart` | cancel/report/log/artifact execution actions | +| `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 + Jenkins reference baseline | success/deferred/failed action message. Jenkins action outcome 정렬 대상 | +| `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` + Jenkins reference baseline | job create draft form. Jenkins New Item flow 정렬 대상 | +| `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 | | `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 | -| `artifact-list` | 구현됨 | `oto_artifacts_surface.dart`, `oto_executions_surface.dart` | artifact records in tab and execution detail | +| `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` + 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 | ## Rules @@ -51,3 +51,13 @@ components: - component 정의는 구현 API가 아니라 UI 사용 규칙을 다룬다. - view별 변형이 필요하면 `/.md` 또는 하위 디렉터리를 사용한다. - 실제 구현체 이름과 다를 수 있지만, 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 계약에 맞춘다. | diff --git a/agent-ui/definition/components/job-create-form/index.md b/agent-ui/definition/components/job-create-form/index.md index 567ca9f..8e195bc 100644 --- a/agent-ui/definition/components/job-create-form/index.md +++ b/agent-ui/definition/components/job-create-form/index.md @@ -1,7 +1,7 @@ --- ui_doc_type: component component_id: job-create-form -status: 구현됨 +status: 계획 source_evidence: - type: code path: packages/flutter/oto_console/lib/src/oto_jobs_surface.dart @@ -18,7 +18,7 @@ source_evidence: Component ID: `job-create-form` -Status: `구현됨` +Status: `계획` ## Source Evidence @@ -44,6 +44,18 @@ operator가 job id와 job name으로 새 pipeline/job record 생성을 요청하 - submitting spinner - 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 - enabled: id/name이 모두 있고 not submitting @@ -65,4 +77,3 @@ operator가 job id와 job name으로 새 pipeline/job record 생성을 요청하 ## Decision History - 2026-06-24: jobs surface의 create form을 `job-create-form` component로 정의했다. - diff --git a/agent-ui/definition/components/log-preview/index.md b/agent-ui/definition/components/log-preview/index.md index 65389a7..ea653e6 100644 --- a/agent-ui/definition/components/log-preview/index.md +++ b/agent-ui/definition/components/log-preview/index.md @@ -1,7 +1,7 @@ --- ui_doc_type: component component_id: log-preview -status: 구현됨 +status: 계획 source_evidence: - type: code path: packages/flutter/oto_console/lib/src/oto_executions_surface.dart @@ -18,7 +18,7 @@ source_evidence: Component ID: `log-preview` -Status: `구현됨` +Status: `계획` ## Source Evidence @@ -43,6 +43,18 @@ Status: `구현됨` - timestamped log lines - 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 - no logs loaded @@ -67,4 +79,3 @@ Status: `구현됨` ## Decision History - 2026-06-24: execution detail log preview를 `log-preview` component로 정의했다. - diff --git a/agent-ui/definition/components/record-list/index.md b/agent-ui/definition/components/record-list/index.md index 27477a5..a1a230b 100644 --- a/agent-ui/definition/components/record-list/index.md +++ b/agent-ui/definition/components/record-list/index.md @@ -1,7 +1,7 @@ --- ui_doc_type: component component_id: record-list -status: 구현됨 +status: 계획 source_evidence: - type: code path: packages/flutter/oto_console/lib/src/oto_runners_surface.dart @@ -21,7 +21,7 @@ source_evidence: Component ID: `record-list` -Status: `구현됨` +Status: `계획` ## Source Evidence @@ -51,6 +51,19 @@ runner, job, execution, artifact 같은 운영 record를 카드형 row 목록으 - optional inline action/link - 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 - runner row @@ -73,4 +86,3 @@ runner, job, execution, artifact 같은 운영 record를 카드형 row 목록으 ## Decision History - 2026-06-24: 반복 row 목록을 `record-list` component로 정의했다. - diff --git a/agent-ui/definition/components/runner-self-update-form/index.md b/agent-ui/definition/components/runner-self-update-form/index.md index 3e93fb0..70a8801 100644 --- a/agent-ui/definition/components/runner-self-update-form/index.md +++ b/agent-ui/definition/components/runner-self-update-form/index.md @@ -1,7 +1,7 @@ --- ui_doc_type: component component_id: runner-self-update-form -status: 구현됨 +status: 계획 source_evidence: - type: code path: packages/flutter/oto_console/lib/src/oto_runners_surface.dart @@ -18,7 +18,7 @@ source_evidence: Component ID: `runner-self-update-form` -Status: `구현됨` +Status: `계획` ## Source Evidence @@ -44,6 +44,18 @@ runner별 target version과 HTTPS download URL을 받아 self-update action을 - inline submitting spinner - 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 - enabled: version과 HTTPS URL이 유효하고 handler가 있음 @@ -65,4 +77,3 @@ runner별 target version과 HTTPS download URL을 받아 self-update action을 ## Decision History - 2026-06-24: runner self-update form을 독립 component로 정의했다. - diff --git a/agent-ui/definition/components/section-surface/index.md b/agent-ui/definition/components/section-surface/index.md index e7909f2..f21d0df 100644 --- a/agent-ui/definition/components/section-surface/index.md +++ b/agent-ui/definition/components/section-surface/index.md @@ -1,7 +1,7 @@ --- ui_doc_type: component component_id: section-surface -status: 구현됨 +status: 계획 source_evidence: - type: code path: packages/flutter/oto_console/lib/src/oto_console_shell.dart @@ -18,7 +18,7 @@ source_evidence: Component ID: `section-surface` -Status: `구현됨` +Status: `계획` ## Source Evidence @@ -44,6 +44,18 @@ Status: `구현됨` - empty state panel - 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 - default: empty panel only @@ -65,4 +77,3 @@ Status: `구현됨` ## Decision History - 2026-06-24: shell fallback surface를 `section-surface` component로 정의했다. - diff --git a/agent-ui/definition/components/state-panel/index.md b/agent-ui/definition/components/state-panel/index.md index 4b01a56..916efc1 100644 --- a/agent-ui/definition/components/state-panel/index.md +++ b/agent-ui/definition/components/state-panel/index.md @@ -1,7 +1,7 @@ --- ui_doc_type: component component_id: state-panel -status: 구현됨 +status: 계획 source_evidence: - type: code path: packages/flutter/oto_console/lib/src/oto_runners_surface.dart @@ -21,7 +21,7 @@ source_evidence: Component ID: `state-panel` -Status: `구현됨` +Status: `계획` ## Source Evidence @@ -51,6 +51,18 @@ surface snapshot의 loading, empty, error 상태를 같은 밀도와 테두리 - message - 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 - loading: centered progress indicator diff --git a/agent-ui/definition/components/status-badge/index.md b/agent-ui/definition/components/status-badge/index.md index 60402bb..1f5b862 100644 --- a/agent-ui/definition/components/status-badge/index.md +++ b/agent-ui/definition/components/status-badge/index.md @@ -1,7 +1,7 @@ --- ui_doc_type: component component_id: status-badge -status: 구현됨 +status: 계획 source_evidence: - type: code path: packages/flutter/oto_console/lib/src/oto_console_overview.dart @@ -21,7 +21,7 @@ source_evidence: Component ID: `status-badge` -Status: `구현됨` +Status: `계획` ## Source Evidence @@ -49,6 +49,18 @@ Status: `구현됨` - colored container - 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 - connection: checking/online/degraded/offline @@ -71,4 +83,3 @@ Status: `구현됨` ## Decision History - 2026-06-24: surface별 private badge 구현을 공통 UI component로 문서화했다. - diff --git a/agent-ui/definition/index.md b/agent-ui/definition/index.md index 6382b48..c107da5 100644 --- a/agent-ui/definition/index.md +++ b/agent-ui/definition/index.md @@ -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 노출/마스킹 기준 | | 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 - `views/`: 화면 또는 업무 단위 정의 @@ -63,3 +82,4 @@ OTO Control Plane Flutter 콘솔의 운영 화면, 반복 component, 상태 표 ## Decision History - 2026-06-24: Flutter 콘솔 구현을 기준으로 `code-first` agent-ui scaffold를 생성했다. +- 2026-07-02: Jenkins 최신 weekly/LTS와 `2.516+` refreshed UI를 러프 레이아웃 참조 기준선으로 추가했다. diff --git a/agent-ui/definition/views/agent/index.md b/agent-ui/definition/views/agent/index.md index dee1657..d6c396e 100644 --- a/agent-ui/definition/views/agent/index.md +++ b/agent-ui/definition/views/agent/index.md @@ -60,6 +60,12 @@ OTO capability context를 agent-shell 대화 표면에 연결한다. 2. registered capabilities 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 | Region ID | Purpose | Component | Priority | Notes | diff --git a/agent-ui/definition/views/artifacts/index.md b/agent-ui/definition/views/artifacts/index.md index a9402c7..b09c827 100644 --- a/agent-ui/definition/views/artifacts/index.md +++ b/agent-ui/definition/views/artifacts/index.md @@ -1,7 +1,7 @@ --- ui_doc_type: view view_id: artifacts -status: 구현됨 +status: 계획 frame: null source_evidence: - type: code @@ -29,7 +29,7 @@ View ID: `artifacts` Frame: - 없음 -Status: `구현됨` +Status: `계획` ## Source Evidence @@ -61,6 +61,19 @@ Control Plane에 수집된 artifact event를 목록으로 확인한다. 2. artifact path 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 | Region ID | Purpose | Component | Priority | Notes | diff --git a/agent-ui/definition/views/executions/index.md b/agent-ui/definition/views/executions/index.md index b813f6e..99b1a3c 100644 --- a/agent-ui/definition/views/executions/index.md +++ b/agent-ui/definition/views/executions/index.md @@ -1,7 +1,7 @@ --- ui_doc_type: view view_id: executions -status: 구현됨 +status: 계획 frame: null source_evidence: - type: code @@ -34,7 +34,7 @@ View ID: `executions` Frame: - 없음 -Status: `구현됨` +Status: `계획` ## Source Evidence @@ -68,6 +68,21 @@ execution 상태를 확인하고, 상세 영역에서 cancel/report/log/artifact 2. action toolbar와 결과 feedback 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 | Region ID | Purpose | Component | Priority | Notes | diff --git a/agent-ui/definition/views/index.md b/agent-ui/definition/views/index.md index 65b84f0..cf72bf7 100644 --- a/agent-ui/definition/views/index.md +++ b/agent-ui/definition/views/index.md @@ -16,13 +16,13 @@ views: | View ID | Status | Evidence | Description | |---------|--------|----------|-------------| -| `overview` | 구현됨 | `OtoConsoleOverview` | Control Plane endpoint, connection, authentication reference overview | -| `runners` | 구현됨 | `OtoRunnersSurface` | runner registry state and self-update action surface | -| `pipelines` | 구현됨 | `OtoJobsSurface` | pipeline/job queue list and create job action surface | -| `executions` | 구현됨 | `OtoExecutionsSurface` | execution list, detail expansion, write actions, log/artifact preview | -| `artifacts` | 구현됨 | `OtoArtifactsSurface` | artifact event list | +| `overview` | 계획 | `OtoConsoleOverview` + Jenkins reference baseline | Control Plane endpoint, connection, authentication reference overview. Jenkins-style header/status layout 재정렬 대상 | +| `runners` | 계획 | `OtoRunnersSurface` + Jenkins reference baseline | runner registry state and self-update action surface. Jenkins Nodes/Agents-style list 재정렬 대상 | +| `pipelines` | 계획 | `OtoJobsSurface` + Jenkins reference baseline | pipeline/job queue list and create job action surface. Jenkins Dashboard/New Item-style flow 재정렬 대상 | +| `executions` | 계획 | `OtoExecutionsSurface` + Jenkins reference baseline | execution list, detail expansion, write actions, log/artifact preview. Pipeline Graph View-style run detail 재정렬 대상 | +| `artifacts` | 계획 | `OtoArtifactsSurface` + Jenkins reference baseline | artifact event list. Jenkins artifact browser-style list 재정렬 대상 | | `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 @@ -46,7 +46,26 @@ views: - 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 - 없음 - diff --git a/agent-ui/definition/views/overview/index.md b/agent-ui/definition/views/overview/index.md index 82cade4..519c5ad 100644 --- a/agent-ui/definition/views/overview/index.md +++ b/agent-ui/definition/views/overview/index.md @@ -1,7 +1,7 @@ --- ui_doc_type: view view_id: overview -status: 구현됨 +status: 계획 frame: null source_evidence: - type: code @@ -31,7 +31,7 @@ View ID: `overview` Frame: - 없음 -Status: `구현됨` +Status: `계획` ## Source Evidence @@ -64,6 +64,20 @@ Control Plane의 API endpoint, Core 연결 상태, authentication reference를 2. HTTP/Wire endpoint와 browser API policy 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 | Region ID | Purpose | Component | Priority | Notes | diff --git a/agent-ui/definition/views/pipelines/index.md b/agent-ui/definition/views/pipelines/index.md index 2d5b4d1..be3434f 100644 --- a/agent-ui/definition/views/pipelines/index.md +++ b/agent-ui/definition/views/pipelines/index.md @@ -1,7 +1,7 @@ --- ui_doc_type: view view_id: pipelines -status: 구현됨 +status: 계획 frame: null source_evidence: - type: code @@ -32,7 +32,7 @@ View ID: `pipelines` Frame: - 없음 -Status: `구현됨` +Status: `계획` ## Source Evidence @@ -64,6 +64,20 @@ pipeline/job queue를 확인하고, 새 job을 만들며, 연결된 execution으 2. job list와 상태 badge 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 | Region ID | Purpose | Component | Priority | Notes | diff --git a/agent-ui/definition/views/runners/index.md b/agent-ui/definition/views/runners/index.md index 1de224c..5a03e24 100644 --- a/agent-ui/definition/views/runners/index.md +++ b/agent-ui/definition/views/runners/index.md @@ -1,7 +1,7 @@ --- ui_doc_type: view view_id: runners -status: 구현됨 +status: 계획 frame: null source_evidence: - type: code @@ -31,7 +31,7 @@ View ID: `runners` Frame: - 없음 -Status: `구현됨` +Status: `계획` ## Source Evidence @@ -64,6 +64,20 @@ Status: `구현됨` 2. active job/execution context 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 | Region ID | Purpose | Component | Priority | Notes | diff --git a/agent-ui/definition/views/settings/index.md b/agent-ui/definition/views/settings/index.md index af5d086..78562fc 100644 --- a/agent-ui/definition/views/settings/index.md +++ b/agent-ui/definition/views/settings/index.md @@ -1,7 +1,7 @@ --- ui_doc_type: view view_id: settings -status: 구현됨 +status: 계획 frame: null source_evidence: - type: code @@ -29,7 +29,7 @@ View ID: `settings` Frame: - 없음 -Status: `구현됨` +Status: `계획` ## Source Evidence @@ -61,6 +61,20 @@ Status: `구현됨` 2. Wire URL 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 | Region ID | Purpose | Component | Priority | Notes | diff --git a/agent-ui/frame/index.md b/agent-ui/frame/index.md index d63f9ce..7c7dc19 100644 --- a/agent-ui/frame/index.md +++ b/agent-ui/frame/index.md @@ -15,6 +15,12 @@ frames: [] - `views//index.md`: visual source가 있는 view의 frame 연결 문서 - `views//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 - frame은 definition을 대체하지 않는다.