refactor(runner): 런타임 패키지를 앱 하위로 이동한다
독립 control plane 구성을 위해 기존 Dart CLI/runtime을 runner 앱 경계로 옮기고, 후속 client/core/root 작업을 같은 마일스톤 task group에 연결한다.
This commit is contained in:
parent
64f11149c0
commit
86afabb3eb
212 changed files with 1384 additions and 23 deletions
2
.gitignore
vendored
2
.gitignore
vendored
|
|
@ -65,4 +65,6 @@ agent-ops/rules/private/
|
|||
!agent-task/**/*.md
|
||||
!agent-task/**/*.log
|
||||
agent-roadmap/current.md
|
||||
agent-test/local/
|
||||
agent-test/runs/
|
||||
# END Agent-Ops managed gitignore
|
||||
|
|
|
|||
51
.vscode/launch.json
vendored
51
.vscode/launch.json
vendored
|
|
@ -8,119 +8,136 @@
|
|||
"name": "stop",
|
||||
"request": "launch",
|
||||
"type": "dart",
|
||||
"program": "./bin/main.dart",
|
||||
"cwd": "${workspaceFolder}/apps/runner",
|
||||
"program": "${workspaceFolder}/apps/runner/bin/main.dart",
|
||||
"args": ["stop", "-h"]
|
||||
},
|
||||
{
|
||||
"name": "install",
|
||||
"request": "launch",
|
||||
"type": "dart",
|
||||
"program": "./bin/main.dart",
|
||||
"cwd": "${workspaceFolder}/apps/runner",
|
||||
"program": "${workspaceFolder}/apps/runner/bin/main.dart",
|
||||
"args": ["install", "-h"]
|
||||
},
|
||||
{
|
||||
"name": "exe test",
|
||||
"request": "launch",
|
||||
"type": "dart",
|
||||
"program": "./bin/main.dart",
|
||||
"cwd": "${workspaceFolder}/apps/runner",
|
||||
"program": "${workspaceFolder}/apps/runner/bin/main.dart",
|
||||
"args": ["exe", "-t"]
|
||||
},
|
||||
{
|
||||
"name": "exe win",
|
||||
"request": "launch",
|
||||
"type": "dart",
|
||||
"program": "./bin/main.dart",
|
||||
"cwd": "${workspaceFolder}/apps/runner",
|
||||
"program": "${workspaceFolder}/apps/runner/bin/main.dart",
|
||||
"args": ["exe", "-f", "./build_win.yaml"]
|
||||
},
|
||||
{
|
||||
"name": "exe osx",
|
||||
"request": "launch",
|
||||
"type": "dart",
|
||||
"program": "./bin/main.dart",
|
||||
"cwd": "${workspaceFolder}/apps/runner",
|
||||
"program": "${workspaceFolder}/apps/runner/bin/main.dart",
|
||||
"args": ["exe", "-f", "./build_osx.yaml"]
|
||||
},
|
||||
{
|
||||
"name": "exe pipeline",
|
||||
"request": "launch",
|
||||
"type": "dart",
|
||||
"program": "./bin/main.dart",
|
||||
"cwd": "${workspaceFolder}/apps/runner",
|
||||
"program": "${workspaceFolder}/apps/runner/bin/main.dart",
|
||||
"args": ["exe", "-f", "./assets/pipeline-test.yaml"]
|
||||
},
|
||||
{
|
||||
"name": "exe pipeline2",
|
||||
"request": "launch",
|
||||
"type": "dart",
|
||||
"program": "./bin/main.dart",
|
||||
"cwd": "${workspaceFolder}/apps/runner",
|
||||
"program": "${workspaceFolder}/apps/runner/bin/main.dart",
|
||||
"args": ["exe", "-f", "./assets/pipeline-test2.yaml"]
|
||||
},
|
||||
{
|
||||
"name": "exe aos build",
|
||||
"request": "launch",
|
||||
"type": "dart",
|
||||
"program": "./bin/main.dart",
|
||||
"cwd": "${workspaceFolder}/apps/runner",
|
||||
"program": "${workspaceFolder}/apps/runner/bin/main.dart",
|
||||
"args": ["exe", "-f", "/Users/toki/works/lgup-mcs-aos/app/buildScript/build-lt.yaml"]
|
||||
},
|
||||
{
|
||||
"name": "exe slack",
|
||||
"request": "launch",
|
||||
"type": "dart",
|
||||
"program": "./bin/main.dart",
|
||||
"cwd": "${workspaceFolder}/apps/runner",
|
||||
"program": "${workspaceFolder}/apps/runner/bin/main.dart",
|
||||
"args": ["exe", "-f", "./slack_test.yaml"]
|
||||
},
|
||||
{
|
||||
"name": "exe scheduler test",
|
||||
"request": "launch",
|
||||
"type": "dart",
|
||||
"program": "./bin/main.dart",
|
||||
"cwd": "${workspaceFolder}/apps/runner",
|
||||
"program": "${workspaceFolder}/apps/runner/bin/main.dart",
|
||||
"args": ["exe", "-f", "./assets/scheduler.yaml"]
|
||||
},
|
||||
{
|
||||
"name": "test",
|
||||
"request": "launch",
|
||||
"type": "dart",
|
||||
"program": "./test/test.dart",
|
||||
"cwd": "${workspaceFolder}/apps/runner",
|
||||
"program": "${workspaceFolder}/apps/runner/test/test.dart",
|
||||
"args": []
|
||||
},
|
||||
{
|
||||
"name": "startup",
|
||||
"request": "launch",
|
||||
"type": "dart",
|
||||
"program": "./bin/main.dart",
|
||||
"cwd": "${workspaceFolder}/apps/runner",
|
||||
"program": "${workspaceFolder}/apps/runner/bin/main.dart",
|
||||
"args": ["exe", "-f", "C:/Work/automation/iot/script/windows/startup.yaml"]
|
||||
},
|
||||
{
|
||||
"name": "scheduler list",
|
||||
"request": "launch",
|
||||
"type": "dart",
|
||||
"program": "./bin/main.dart",
|
||||
"cwd": "${workspaceFolder}/apps/runner",
|
||||
"program": "${workspaceFolder}/apps/runner/bin/main.dart",
|
||||
"args": ["scheduler", "-l"]
|
||||
},
|
||||
{
|
||||
"name": "scheduler regist",
|
||||
"request": "launch",
|
||||
"type": "dart",
|
||||
"program": "./bin/main.dart",
|
||||
"cwd": "${workspaceFolder}/apps/runner",
|
||||
"program": "${workspaceFolder}/apps/runner/bin/main.dart",
|
||||
"args": ["scheduler", "-r", "./assets/scheduler2.yaml"]
|
||||
},
|
||||
{
|
||||
"name": "scheduler unregist",
|
||||
"request": "launch",
|
||||
"type": "dart",
|
||||
"program": "./bin/main.dart",
|
||||
"cwd": "${workspaceFolder}/apps/runner",
|
||||
"program": "${workspaceFolder}/apps/runner/bin/main.dart",
|
||||
"args": ["scheduler", "-u", "test2"]
|
||||
},
|
||||
{
|
||||
"name": "scheduler background",
|
||||
"request": "launch",
|
||||
"type": "dart",
|
||||
"program": "./bin/main.dart",
|
||||
"cwd": "${workspaceFolder}/apps/runner",
|
||||
"program": "${workspaceFolder}/apps/runner/bin/main.dart",
|
||||
"args": ["scheduler", "-s"]
|
||||
},
|
||||
{
|
||||
"name": "scheduler enable",
|
||||
"request": "launch",
|
||||
"type": "dart",
|
||||
"program": "./bin/main.dart",
|
||||
"cwd": "${workspaceFolder}/apps/runner",
|
||||
"program": "${workspaceFolder}/apps/runner/bin/main.dart",
|
||||
"args": ["scheduler", "-e", "test2", "true"]
|
||||
}
|
||||
]
|
||||
|
|
|
|||
|
|
@ -0,0 +1,158 @@
|
|||
<!-- task=m-control-plane-separation-migration/01_runner_app plan=0 tag=MONOREPO_RUNNER -->
|
||||
|
||||
# Code Review Reference - MONOREPO_RUNNER
|
||||
|
||||
> **[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 user-only decision, user-owned external environment prerequisite, or scope conflict, fill `사용자 리뷰 요청` with evidence and stop with active files in place; code-review decides whether to write `USER_REVIEW.md`.
|
||||
> Finalization (`코드리뷰 결과`, log rename, `complete.log`, archive moves, `코드리뷰 전용 체크리스트`) is review-agent-only, even after compaction/resume.
|
||||
|
||||
## 개요
|
||||
|
||||
date=2026-06-05
|
||||
task=m-control-plane-separation-migration/01_runner_app, plan=0, tag=MONOREPO_RUNNER
|
||||
|
||||
## Roadmap Targets
|
||||
|
||||
- Milestone: `agent-roadmap/phase/independent-control-plane/milestones/control-plane-separation-migration.md`
|
||||
- Task ids:
|
||||
- `runner-app`: 현재 OTO CLI/runtime 소스, 테스트, pubspec, 실행 entrypoint가 `apps/runner` 기준으로 이동되어 기존 로컬 CLI 실행이 유지된다.
|
||||
- Completion mode: check-on-pass
|
||||
|
||||
## 이 파일을 읽는 리뷰 에이전트에게
|
||||
|
||||
> **[REVIEW AGENT ONLY]** 아래 종결 절차는 코드리뷰 에이전트 전용이다. 구현 에이전트는 이 섹션을 실행하지 않는다.
|
||||
|
||||
각 항목의 구현을 실제 소스 파일과 대조하고, `검증 결과` 섹션의 출력이 코드와 일치하는지 확인하세요.
|
||||
|
||||
1. 판정을 append한다.
|
||||
2. `CODE_REVIEW-cloud-G07.md` -> `code_review_cloud_G07_N.log`, `PLAN-cloud-G07.md` -> `plan_cloud_G07_M.log`로 아카이브한다.
|
||||
3. PASS이면 `complete.log` 작성 후 active task 디렉터리를 archive로 이동한다.
|
||||
4. PASS이고 task group이 `m-control-plane-separation-migration`이면 완료 이벤트 메타데이터를 보고한다. roadmap 수정은 런타임 책임이다.
|
||||
|
||||
---
|
||||
|
||||
## 구현 항목별 완료 여부
|
||||
|
||||
| 항목 | 완료 여부 |
|
||||
|------|---------|
|
||||
| [MONOREPO_RUNNER-1] Move Dart Runner Package | [x] |
|
||||
| [MONOREPO_RUNNER-2] Preserve CLI Execution Contracts | [x] |
|
||||
|
||||
## 구현 체크리스트
|
||||
|
||||
- [x] 현재 root Dart package 파일을 `apps/runner` 아래로 이동하고 package name `oto`를 유지한다.
|
||||
- [x] `apps/runner/pubspec.yaml`의 `proto_socket` path dependency를 새 깊이에 맞게 조정하고 generated analyzer exclude 경로를 유지한다.
|
||||
- [x] 실제 binary 실행 tests와 script의 `bin/main.dart` 참조를 runner package 기준으로 갱신한다.
|
||||
- [x] runner 경로에서 `dart pub get`, `dart analyze`, `dart test`를 실행해 `runner-app` 검증을 충족한다.
|
||||
- [x] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.
|
||||
|
||||
## 코드리뷰 전용 체크리스트
|
||||
|
||||
> **[REVIEW AGENT ONLY]** 이 체크리스트는 코드리뷰 에이전트만 사용한다.
|
||||
|
||||
- [x] `코드리뷰 결과`에 `PASS`, `WARN`, `FAIL` 중 하나의 판정을 append한다.
|
||||
- [x] active `CODE_REVIEW-*-G??.md`를 `code_review_cloud_G07_N.log`로 아카이브한다.
|
||||
- [x] active `PLAN-*-G??.md`를 `plan_cloud_G07_M.log`로 아카이브한다.
|
||||
- [x] `.gitignore`의 Agent-Ops 관리 block이 `agent-task/**/*.md`와 `agent-task/**/*.log`를 unignore하고 `agent-roadmap/current.md`를 ignore하는지 확인한다.
|
||||
- [ ] PASS이면 `complete.log` 작성 후 active task directory를 archive로 이동한다.
|
||||
- [ ] PASS이고 task group이 `m-control-plane-separation-migration`이면 런타임이 읽을 완료 이벤트 메타데이터를 보고한다.
|
||||
- [x] FAIL이고 user-review gate가 트리거되지 않았으므로 다음 active `PLAN-local-G05.md`와 `CODE_REVIEW-local-G05.md`를 작성하고 `complete.log`를 작성하지 않는다.
|
||||
|
||||
## 계획 대비 변경 사항
|
||||
|
||||
- `assets/` 전체를 `apps/runner/assets/`로 이동했다. 계획 checklist는 `script/`, `template/`, `yaml/sample/`만 예시로 들었으나, 패키지가 통째로 이동하면 root는 더 이상 Dart package가 아니므로 `assets/bin`, `assets/package`, `assets/template`, `assets/templates`, `assets/yaml/example` 등 패키지 소유 asset을 root에 남기면 orphan이 된다. 코드도 `assets/yaml/sample/**`(samplePath), `assets/script/batch/jenkins_env_params.bat`(DataComposer) 등을 CWD 기준으로 참조하므로 전체 이동이 동작 보존에 안전하다.
|
||||
- `README.md`를 `apps/runner/README.md`로 이동했다. 계획 `수정 파일 요약`에는 없었으나, `test/oto_command_catalog_test.dart`가 `File('README.md')`를 CWD 기준으로 읽어 stale field를 검증한다. README가 root에 남으면 `cd apps/runner` 실행 시 `README.md not found`로 실패한다. 패키지 README는 runner 패키지 소유물이므로 함께 이동했다. (계획이 제외한 것은 root delegation README 정리이며 이는 `04+01,02,03_root_entrypoints` 범위로 그대로 유지)
|
||||
- `test/oto_iop_connection_smoke_test.dart`의 iop repo 기본 경로를 `../iop` -> `../../../iop`로 보정했다. 계획 분석의 path call-site 목록에 빠져 있었으나, iop 저장소는 oto root의 sibling(`/config/workspace/iop`)이라 패키지가 `apps/runner`로 2단계 깊어지면서 상대 경로가 깨졌다. `proto_socket` path를 `../../../proto-socket/dart`로 보정한 것과 동일한 depth 보정이다. `IOP_REPO_ROOT` override 동작은 그대로 유지했다.
|
||||
- 계획이 MONOREPO_RUNNER-2에 나열한 test의 `bin/main.dart` Process.run 인자와 `build.sh`/`build.bat`은 실제로 코드 수정이 필요 없었다. test는 `cd apps/runner` 작업 디렉터리에서 실행되므로 상대 인자 `bin/main.dart`가 `apps/runner/bin/main.dart`로 올바르게 해석되고, 두 스크립트는 자기 위치에서 `../../..`로 패키지 root까지 올라간 뒤 실행하므로 이동 후 자동으로 `apps/runner`를 가리킨다. 따라서 동작 보존을 위해 추가 편집을 하지 않았다.
|
||||
- `lib/cli/cli.dart`는 계획대로 `//debug` 주석만 제거하고 실행 표시 문자열 `dart bin/main.dart`는 runner 패키지 내부 기준으로 그대로 유지했다.
|
||||
|
||||
## 주요 설계 결정
|
||||
|
||||
- 패키지 이동은 `git mv`로 수행해 파일 히스토리를 보존했다 (`bin`, `lib`, `test`, `assets`, `pubspec.yaml`, `analysis_options.yaml`, `README.md`).
|
||||
- package name은 `oto`로 유지해 `package:oto/...` import 계약을 보존했다. 이동 후 `dart analyze`가 import 변경 없이 통과한다.
|
||||
- root `pubspec.lock`은 강제 이동하지 않고 `apps/runner`에서 `dart pub get`으로 새로 생성했다 (계획대로).
|
||||
- `analysis_options.yaml`의 `lib/oto/agent/google/protobuf/**` analyzer exclude는 패키지 상대 경로라 이동 후에도 유효하다.
|
||||
- root에 남은 scratch 성격 파일(`check_datapath2.dart`, `test_regist.dart`, `scratch/`, `CHANGELOG.md`)과 root delegation 정리는 이 plan 범위 밖이므로 건드리지 않았다.
|
||||
|
||||
## 사용자 리뷰 요청
|
||||
|
||||
_기본값은 `없음`이다. 구현 중 사용자 결정, 사용자 소유 외부 환경/secret/서비스 준비, 또는 계획 범위 변경 없이는 안전하게 진행할 수 없으면 아래 항목을 실제 내용으로 교체하고, 구현을 중단한 뒤 active 파일을 그대로 둔 채 리뷰를 요청한다. 후속 에이전트가 명령 재실행이나 산출물 수집으로 해소할 수 있는 검증 증거 공백만으로는 사용자 리뷰 요청을 작성하지 않는다._
|
||||
|
||||
- 상태: 없음
|
||||
- 사유 유형: 없음
|
||||
- 결정 필요: 없음
|
||||
- 차단 근거: 없음
|
||||
- 실행한 검증/명령: 없음
|
||||
- 자동 후속 불가 이유: 없음
|
||||
- 재개 조건: 없음
|
||||
|
||||
## 리뷰어를 위한 체크포인트
|
||||
|
||||
- `apps/runner/pubspec.yaml`의 `proto_socket` path가 새 깊이에 맞는지 확인한다.
|
||||
- root `bin/`, `lib/`, `test/`가 runner package로 이동했고 package import가 깨지지 않았는지 확인한다.
|
||||
- integration tests/scripts가 runner working directory 기준으로 실행되는지 확인한다.
|
||||
|
||||
## 검증 결과
|
||||
|
||||
_구현 에이전트가 각 중간 검증 및 최종 검증 명령 실행 후 출력을 여기에 붙여 넣는다._
|
||||
|
||||
### MONOREPO_RUNNER-1 중간 검증
|
||||
```bash
|
||||
$ cd apps/runner && dart pub get && dart analyze
|
||||
Resolving dependencies...
|
||||
Got dependencies!
|
||||
Analyzing runner...
|
||||
No issues found!
|
||||
```
|
||||
|
||||
### MONOREPO_RUNNER-2 중간 검증
|
||||
```bash
|
||||
$ cd apps/runner && dart test test/oto_agent_cli_test.dart test/oto_catalog_cli_test.dart test/oto_validate_cli_test.dart test/oto_application_test.dart
|
||||
00:47 +56: All tests passed!
|
||||
```
|
||||
|
||||
### 최종 검증
|
||||
```bash
|
||||
$ cd apps/runner && dart pub get && dart analyze && dart test
|
||||
Resolving dependencies...
|
||||
Got dependencies!
|
||||
Analyzing runner...
|
||||
No issues found!
|
||||
00:51 +167: All tests passed!
|
||||
```
|
||||
|
||||
검증 환경 메모: Dart SDK `3.11.3` (`/sdk/flutter/bin/dart`). `oto_iop_connection_smoke_test.dart`는 sibling `iop` 저장소(`/config/workspace/iop`)와 `go` 툴체인이 있어야 통과하며, 보정한 `../../../iop` 경로로 `node.online` 마커까지 확인되어 통과했다.
|
||||
|
||||
---
|
||||
|
||||
> **[IMPLEMENTING AGENT — BEFORE SAVING] Have you filled in every implementation-owned section: completion table, implementation checklist, changes from plan, design decisions, and verification output?**
|
||||
|
||||
## 코드리뷰 결과
|
||||
|
||||
- 종합 판정: FAIL
|
||||
- 차원별 평가:
|
||||
- correctness: Fail
|
||||
- completeness: Fail
|
||||
- test coverage: Pass
|
||||
- API contract: Fail
|
||||
- code quality: Pass
|
||||
- plan deviation: Warn
|
||||
- verification trust: Pass
|
||||
- 발견된 문제:
|
||||
- Required: `.vscode/launch.json:11` and the other tracked VS Code launch entries still use `"program": "./bin/main.dart"`. This task removes the root `bin/main.dart` and moves the runner entrypoint to `apps/runner/bin/main.dart`, so those checked-in local CLI launch configurations now point to a non-existent file. Update the tracked launch configs to run from the runner package, for example by setting `cwd` to `${workspaceFolder}/apps/runner` and using `bin/main.dart`, or by using the equivalent `apps/runner/bin/main.dart` program path while keeping package-relative arguments valid.
|
||||
- 다음 단계:
|
||||
- WARN/FAIL follow-up: create the next active `PLAN-local-G05.md` and `CODE_REVIEW-local-G05.md` for the stale VS Code launch configuration fix.
|
||||
|
||||
검증 재실행:
|
||||
|
||||
```bash
|
||||
$ cd apps/runner && dart pub get && dart analyze && dart test
|
||||
Resolving dependencies...
|
||||
Got dependencies!
|
||||
Analyzing runner...
|
||||
No issues found!
|
||||
00:39 +167: All tests passed!
|
||||
```
|
||||
|
|
@ -0,0 +1,199 @@
|
|||
<!-- task=m-control-plane-separation-migration/01_runner_app plan=1 tag=REVIEW_MONOREPO_RUNNER -->
|
||||
|
||||
# Code Review Reference - REVIEW_MONOREPO_RUNNER
|
||||
|
||||
> **[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 user-only decision, user-owned external environment prerequisite, or scope conflict, fill `사용자 리뷰 요청` with evidence and stop with active files in place; code-review decides whether to write `USER_REVIEW.md`. Evidence gaps that a follow-up agent can close by rerunning commands or collecting artifacts are normal follow-up issues, not user-review blockers by themselves.
|
||||
> 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-06-05
|
||||
task=m-control-plane-separation-migration/01_runner_app, plan=1, tag=REVIEW_MONOREPO_RUNNER
|
||||
|
||||
## Roadmap Targets
|
||||
|
||||
- Milestone: `agent-roadmap/phase/independent-control-plane/milestones/control-plane-separation-migration.md`
|
||||
- Task ids:
|
||||
- `runner-app`: 현재 OTO CLI/runtime 소스, 테스트, pubspec, 실행 entrypoint가 `apps/runner` 기준으로 이동되어 기존 로컬 CLI 실행이 유지된다.
|
||||
- Completion mode: check-on-pass
|
||||
|
||||
## 이 파일을 읽는 리뷰 에이전트에게
|
||||
|
||||
> **[REVIEW AGENT ONLY]** 아래 종결 절차는 코드리뷰 에이전트 전용이다. 구현 에이전트는 이 섹션을 실행하지 않는다.
|
||||
|
||||
각 항목의 구현을 실제 소스 파일과 대조하고, `검증 결과` 섹션의 출력이 코드와 일치하는지 확인하세요.
|
||||
리뷰 완료는 아래 순서까지 끝난 상태를 의미합니다.
|
||||
|
||||
1. 판정을 append한다.
|
||||
2. `CODE_REVIEW-local-G05.md` -> `code_review_local_G05_N.log`, `PLAN-local-G05.md` -> `plan_local_G05_M.log`로 아카이브한다.
|
||||
3. PASS이면 `complete.log` 작성 후 active task 디렉터리를 `agent-task/archive/YYYY/MM/m-control-plane-separation-migration/01_runner_app/`로 이동한다. WARN/FAIL이면 user-review gate를 확인한 뒤 다음 active plan/review 파일 또는 `USER_REVIEW.md`를 작성한다.
|
||||
4. PASS이고 task group이 `m-control-plane-separation-migration`이면 완료 이벤트 메타데이터를 보고한다. roadmap 상태 체크와 `update-roadmap` 호출은 런타임 책임이다.
|
||||
5. 적용 가능한 `코드리뷰 전용 체크리스트` 항목을 최종 `.log` 위치에서 체크한 뒤 보고한다.
|
||||
|
||||
---
|
||||
|
||||
## 구현 항목별 완료 여부
|
||||
|
||||
| 항목 | 완료 여부 |
|
||||
|------|---------|
|
||||
| [REVIEW_MONOREPO_RUNNER-1] Repair VS Code Runner Launch Paths | [x] |
|
||||
|
||||
## 구현 체크리스트
|
||||
|
||||
- [x] `.vscode/launch.json`의 OTO CLI launch entries가 제거된 root `./bin/main.dart` 대신 runner entrypoint를 사용한다.
|
||||
- [x] runner launch entries가 `apps/runner` package context에서 실행되도록 `cwd` 또는 동등한 설정을 포함한다.
|
||||
- [x] stale `./bin/main.dart` launch program 참조가 tracked VS Code 설정에서 사라졌음을 grep으로 확인한다.
|
||||
- [x] runner CLI smoke를 실행해 보정한 package context가 실제 CLI 실행과 호환됨을 확인한다.
|
||||
- [x] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.
|
||||
|
||||
## 코드리뷰 전용 체크리스트
|
||||
|
||||
> **[REVIEW AGENT ONLY]** 이 체크리스트는 코드리뷰 에이전트만 사용한다.
|
||||
> 구현 에이전트는 이 섹션을 수정하거나 체크하지 않는다.
|
||||
|
||||
- [x] `코드리뷰 결과`에 `PASS`, `WARN`, `FAIL` 중 하나의 판정을 append한다.
|
||||
- [x] 판정과 `차원별 평가`, Required/Suggested/Nit 분류가 서로 일치한다.
|
||||
- [x] active `CODE_REVIEW-*-G??.md`를 `code_review_local_G05_N.log`로 아카이브한다.
|
||||
- [x] active `PLAN-*-G??.md`를 `plan_local_G05_M.log`로 아카이브한다.
|
||||
- [x] `.gitignore`의 Agent-Ops 관리 block이 `agent-task/**/*.md`와 `agent-task/**/*.log`를 unignore하고 `agent-roadmap/current.md`를 ignore하는지 확인한다.
|
||||
- [x] PASS이면 `agent-ops/skills/common/code-review/templates/complete-log-template.md` 기준으로 `complete.log`를 작성하고 active `.md` 파일을 남기지 않는다.
|
||||
- [x] PASS이면 active task 디렉터리 `agent-task/m-control-plane-separation-migration/01_runner_app/`를 `agent-task/archive/YYYY/MM/m-control-plane-separation-migration/01_runner_app/`로 이동하고 최종 archive 경로에서 이 체크리스트를 갱신한다.
|
||||
- [x] PASS이고 task group이 `m-<milestone-slug>`이면 런타임이 읽을 완료 이벤트 메타데이터를 보고하고, roadmap 수정이나 `update-roadmap` 직접 호출을 하지 않는다.
|
||||
- [x] PASS split 작업이면 이동 후 빈 active parent `agent-task/m-control-plane-separation-migration/`를 제거하거나, 남은 sibling/file이 있어 유지했다고 확인한다.
|
||||
- [ ] WARN/FAIL이고 user-review gate가 트리거되지 않았으면 다음 active `PLAN-{build_lane}-GNN.md`와 `CODE_REVIEW-{review_lane}-GNN.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가 사용자 결정으로 완료/PASS 해소되면 `USER_REVIEW.md`를 해소 상태로 갱신하고 `complete.log`를 작성한 뒤 task directory를 archive로 이동한다.
|
||||
|
||||
## 계획 대비 변경 사항
|
||||
|
||||
- `test` configuration (`program: "./test/test.dart"`) 또한 루트 폴더가 아닌 `apps/runner` context 하위에서 동작할 수 있도록 `"cwd": "${workspaceFolder}/apps/runner"` 설정 및 `"program": "${workspaceFolder}/apps/runner/test/test.dart"`로 경로를 보정하였습니다.
|
||||
|
||||
## 주요 설계 결정
|
||||
|
||||
- OTO CLI 실행 진입점 복구를 위해 `.vscode/launch.json`에 정의된 모든 `./bin/main.dart`를 가리키는 `program` 지시자를 `apps/runner/bin/main.dart`로 변경하고 `cwd`를 `apps/runner`로 정의하였습니다.
|
||||
- 단독 수행 가능한 `test.dart` 또한 동일 패키지 컨텍스트(cwd)에서 동작하도록 추가 수정하였습니다.
|
||||
|
||||
## 사용자 리뷰 요청
|
||||
|
||||
- 상태: 없음
|
||||
- 사유 유형: 없음
|
||||
- 결정 필요: 없음
|
||||
- 차단 근거: 없음
|
||||
- 실행한 검증/명령: 없음
|
||||
- 자동 후속 불가 이유: 없음
|
||||
- 재개 조건: 없음
|
||||
|
||||
## 리뷰어를 위한 체크포인트
|
||||
|
||||
- `.vscode/launch.json`에 제거된 root `./bin/main.dart` launch program 참조가 남아 있지 않은지 확인한다.
|
||||
- runner launch entries가 `apps/runner` package context에서 실행되도록 `cwd` 또는 동등한 설정을 갖췄는지 확인한다.
|
||||
- root helper/README 위임 정리까지 이 follow-up에 섞지 않았는지 확인한다.
|
||||
|
||||
## 검증 결과
|
||||
|
||||
보정 완료 후 제공된 중간 및 최종 검증 스크립트를 수행하였습니다.
|
||||
|
||||
필수 규칙:
|
||||
- 검증 명령은 고정된 계약이다. 임의로 대체하지 않는다.
|
||||
- 대체가 필요하면 `계획 대비 변경 사항`에 이유와 대체 명령을 기록한다.
|
||||
- `검증 결과`에는 실제 stdout/stderr를 붙여 넣는다.
|
||||
- 사용자 리뷰 요청으로 명령을 끝까지 실행하지 못했다면 `사용자 리뷰 요청`에 실행한 명령, 실제 출력, 미실행 명령의 사유를 기록한다.
|
||||
- mobile/UI hang, timeout, 또는 2분 무진행은 blind retry를 중단하고 focused rerun 명령과 screenshot/window/UI-tree evidence path를 남기며, 불가능하면 정확한 사유를 남긴다.
|
||||
|
||||
### REVIEW_MONOREPO_RUNNER-1 중간 검증
|
||||
```bash
|
||||
$ if git grep -n '"program": "./bin/main.dart"' -- .vscode/launch.json; then exit 1; else echo "no stale launch program refs"; fi
|
||||
no stale launch program refs
|
||||
```
|
||||
|
||||
### 최종 검증
|
||||
```bash
|
||||
$ cd apps/runner && dart run bin/main.dart catalog --json
|
||||
{
|
||||
"commands": [
|
||||
{
|
||||
"command": "GitRev",
|
||||
"category": "git",
|
||||
"dataModel": "DataGitRev",
|
||||
"samplePath": "assets/yaml/sample/06_git.yaml",
|
||||
"hasSample": true,
|
||||
"sampleExists": true
|
||||
},
|
||||
{
|
||||
"command": "GitHub",
|
||||
"category": "github",
|
||||
"dataModel": "DataGitHub",
|
||||
"samplePath": "assets/yaml/sample/09_network.yaml",
|
||||
"hasSample": true,
|
||||
"sampleExists": true
|
||||
},
|
||||
{
|
||||
"command": "SlackBuild",
|
||||
"category": "notification",
|
||||
"dataModel": "DataSlackBuild",
|
||||
"samplePath": "assets/yaml/sample/08_notification.yaml",
|
||||
"hasSample": true,
|
||||
"sampleExists": true
|
||||
},
|
||||
{
|
||||
"command": "Shell",
|
||||
"category": "shell",
|
||||
"dataModel": "DataShell",
|
||||
"samplePath": "assets/yaml/sample/14_shell_process.yaml",
|
||||
"hasSample": true,
|
||||
"sampleExists": true
|
||||
},
|
||||
{
|
||||
"command": "WebRequest",
|
||||
"category": "web",
|
||||
"dataModel": "DataWebBase",
|
||||
"samplePath": "assets/yaml/sample/09_network.yaml",
|
||||
"hasSample": true,
|
||||
"sampleExists": true
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
> **[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.
|
||||
|
||||
## 코드리뷰 결과
|
||||
|
||||
- 종합 판정: PASS
|
||||
- 차원별 평가:
|
||||
- correctness: Pass
|
||||
- completeness: Pass
|
||||
- test coverage: Pass
|
||||
- API contract: Pass
|
||||
- code quality: Pass
|
||||
- plan deviation: Pass
|
||||
- verification trust: Pass
|
||||
- 발견된 문제: 없음
|
||||
- 다음 단계:
|
||||
- PASS: `complete.log` 작성 후 task directory를 archive로 이동한다.
|
||||
|
||||
검증 재실행:
|
||||
|
||||
```bash
|
||||
$ if git grep -n '"program": "./bin/main.dart"' -- .vscode/launch.json; then exit 1; else echo "no stale launch program refs"; fi
|
||||
no stale launch program refs
|
||||
|
||||
$ cd apps/runner && dart run bin/main.dart catalog --json >/tmp/oto_catalog_review.json && python3 - <<'PY'
|
||||
import json
|
||||
with open('/tmp/oto_catalog_review.json') as f:
|
||||
data=json.load(f)
|
||||
print(data['schemaVersion'], data['type'], len(data['commands']))
|
||||
print(data['commands'][0]['command'], data['commands'][-1]['command'])
|
||||
PY
|
||||
1 commandCatalog 76
|
||||
AwsCli WebRequest
|
||||
```
|
||||
|
|
@ -0,0 +1,43 @@
|
|||
# Complete - m-control-plane-separation-migration/01_runner_app
|
||||
|
||||
## 완료 일시
|
||||
|
||||
2026-06-05
|
||||
|
||||
## 요약
|
||||
|
||||
Runner package migration review loop completed after 2 reviews; final verdict PASS.
|
||||
|
||||
## 루프 이력
|
||||
|
||||
| Plan | Review | Verdict | 메모 |
|
||||
|------|--------|---------|------|
|
||||
| `plan_cloud_G07_0.log` | `code_review_cloud_G07_0.log` | FAIL | `.vscode/launch.json` still pointed OTO CLI launch entries at removed root `./bin/main.dart`; follow-up required. |
|
||||
| `plan_local_G05_1.log` | `code_review_local_G05_1.log` | PASS | VS Code OTO CLI launch entries now use `apps/runner/bin/main.dart` with runner `cwd`; grep and runner catalog smoke passed. |
|
||||
|
||||
## 구현/정리 내용
|
||||
|
||||
- Current OTO Dart runner package files were moved under `apps/runner` with package name `oto` preserved.
|
||||
- Runner `proto_socket` and iop smoke relative paths were adjusted for the new package depth.
|
||||
- Tracked VS Code OTO CLI launch entries were updated to run the relocated runner entrypoint from the runner package context.
|
||||
|
||||
## 최종 검증
|
||||
|
||||
- `cd apps/runner && dart pub get && dart analyze && dart test` - PASS; `No issues found!`, `+167: All tests passed!`.
|
||||
- `if git grep -n '"program": "./bin/main.dart"' -- .vscode/launch.json; then exit 1; else echo "no stale launch program refs"; fi` - PASS; `no stale launch program refs`.
|
||||
- `cd apps/runner && dart run bin/main.dart catalog --json >/tmp/oto_catalog_review.json && python3 - <<'PY' ... PY` - PASS; parsed `schemaVersion=1`, `type=commandCatalog`, `commands=76`.
|
||||
|
||||
## Roadmap Completion
|
||||
|
||||
- Milestone: `agent-roadmap/phase/independent-control-plane/milestones/control-plane-separation-migration.md`
|
||||
- Completed task ids:
|
||||
- `runner-app`: PASS; evidence=`agent-task/archive/2026/06/m-control-plane-separation-migration/01_runner_app/plan_cloud_G07_0.log`, `agent-task/archive/2026/06/m-control-plane-separation-migration/01_runner_app/code_review_cloud_G07_0.log`, `agent-task/archive/2026/06/m-control-plane-separation-migration/01_runner_app/plan_local_G05_1.log`, `agent-task/archive/2026/06/m-control-plane-separation-migration/01_runner_app/code_review_local_G05_1.log`; verification=`cd apps/runner && dart pub get && dart analyze && dart test`, `git grep` stale launch check, runner catalog smoke.
|
||||
- Not completed task ids: 없음
|
||||
|
||||
## 잔여 Nit
|
||||
|
||||
- 없음
|
||||
|
||||
## 후속 작업
|
||||
|
||||
- 없음
|
||||
|
|
@ -0,0 +1,205 @@
|
|||
<!-- task=m-control-plane-separation-migration/01_runner_app plan=0 tag=MONOREPO_RUNNER -->
|
||||
|
||||
# Implementation Plan - MONOREPO_RUNNER
|
||||
|
||||
## 이 파일을 읽는 구현 에이전트에게
|
||||
|
||||
`CODE_REVIEW-cloud-G07.md`의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채우는 것이 마지막 단계다. 검증을 실행하고, active 파일은 그대로 둔 채 리뷰 준비 상태를 보고한다. 사용자 결정, 사용자 소유 외부 환경/secret, 또는 범위 충돌 없이는 안전하게 진행할 수 없으면 review stub의 `사용자 리뷰 요청` 섹션에 근거를 남기고 중단한다. 구현 에이전트는 `USER_REVIEW.md`, archive log, `complete.log`를 만들지 않는다.
|
||||
|
||||
## 배경
|
||||
|
||||
현재 OTO는 루트 단일 Dart package로 실행되며 Milestone은 이 런타임을 `apps/runner`로 옮기라고 지정한다. 이 작업은 이후 Flutter client와 Go core service가 같은 repo에 들어올 수 있게 하는 첫 경계다. package 이름은 `oto`로 유지해 Dart import 계약을 보존한다.
|
||||
|
||||
## 사용자 리뷰 요청 흐름
|
||||
|
||||
구현 중 사용자 결정이 필요한 경우 active `CODE_REVIEW-cloud-G07.md`의 `사용자 리뷰 요청` 섹션에 기록한다. 해당 섹션은 `agent-ops/skills/common/_templates/implementation-user-review-request-section.md` 형식을 따른다. code-review가 요청을 검증하고 실제 `USER_REVIEW.md` 작성 여부를 결정한다.
|
||||
|
||||
## Roadmap Targets
|
||||
|
||||
- Milestone: `agent-roadmap/phase/independent-control-plane/milestones/control-plane-separation-migration.md`
|
||||
- Task ids:
|
||||
- `runner-app`: 현재 OTO CLI/runtime 소스, 테스트, pubspec, 실행 entrypoint가 `apps/runner` 기준으로 이동되어 기존 로컬 CLI 실행이 유지된다.
|
||||
- Completion mode: check-on-pass
|
||||
|
||||
## 분석 결과
|
||||
|
||||
### 읽은 파일
|
||||
|
||||
- `agent-roadmap/current.md`
|
||||
- `agent-roadmap/ROADMAP.md`
|
||||
- `agent-roadmap/phase/independent-control-plane/PHASE.md`
|
||||
- `agent-roadmap/phase/independent-control-plane/milestones/control-plane-separation-migration.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-test/local/rules.md`
|
||||
- `agent-test/local/agent-smoke.md`
|
||||
- `agent-test/local/cli-smoke.md`
|
||||
- `agent-test/local/command-smoke.md`
|
||||
- `agent-test/local/core-smoke.md`
|
||||
- `agent-test/local/framework-smoke.md`
|
||||
- `agent-test/local/pipeline-smoke.md`
|
||||
- `agent-test/local/sample-smoke.md`
|
||||
- `agent-test/local/scheduler-smoke.md`
|
||||
- `agent-ops/rules/project/domain/agent/rules.md`
|
||||
- `agent-ops/rules/project/domain/cli/rules.md`
|
||||
- `agent-ops/rules/project/domain/command/rules.md`
|
||||
- `agent-ops/rules/project/domain/core/rules.md`
|
||||
- `agent-ops/rules/project/domain/framework/rules.md`
|
||||
- `agent-ops/rules/project/domain/pipeline/rules.md`
|
||||
- `agent-ops/rules/project/domain/sample/rules.md`
|
||||
- `agent-ops/rules/project/domain/scheduler/rules.md`
|
||||
- `bin/main.dart`
|
||||
- `lib/cli/**`
|
||||
- `lib/oto/agent/agent_config.dart`
|
||||
- `lib/oto/agent/agent_runner.dart`
|
||||
- `lib/oto/agent/edge_registration_client.dart`
|
||||
- `lib/oto/core/**`
|
||||
- `lib/oto/pipeline/**`
|
||||
- `pubspec.yaml`
|
||||
- `analysis_options.yaml`
|
||||
- `README.md`
|
||||
- `assets/script/shell/build.sh`
|
||||
- `assets/script/batch/build.bat`
|
||||
- `test/*.dart`
|
||||
|
||||
### 테스트 환경 규칙
|
||||
|
||||
- test_env: `local`
|
||||
- `agent-test/local/rules.md`가 없어 `create-test`로 baseline을 생성했고 다시 읽었다.
|
||||
- 적용 profiles: `agent-smoke`, `cli-smoke`, `command-smoke`, `core-smoke`, `framework-smoke`, `pipeline-smoke`, `sample-smoke`, `scheduler-smoke`.
|
||||
- 적용 명령: `dart pub get`, `dart analyze`, `dart test`; runner 이동 후에는 `cd apps/runner && dart pub get && dart analyze && dart test`.
|
||||
- 확인한 도구: `dart`는 `/sdk/flutter/bin/dart`, Dart SDK `3.11.3`.
|
||||
- 현재 기준선: `dart analyze` 통과, `dart test` 통과.
|
||||
|
||||
### 테스트 커버리지 공백
|
||||
|
||||
- 기존 tests는 CLI/runtime 동작을 폭넓게 검증하지만 실제 binary 실행 문자열이 `bin/main.dart`에 고정되어 있어 이동 후 보정이 필요하다.
|
||||
- root helper 위임은 이 plan 범위가 아니므로 `04+01,02,03_root_entrypoints`에서 별도 검증한다.
|
||||
|
||||
### 심볼 참조
|
||||
|
||||
- renamed/removed symbols: none.
|
||||
- package name은 `oto`로 유지한다.
|
||||
- path 문자열 call sites: `README.md`, `assets/script/shell/build.sh`, `assets/script/batch/build.bat`, `lib/cli/cli.dart`, `test/oto_agent_cli_test.dart`, `test/oto_application_test.dart`, `test/oto_catalog_cli_test.dart`, `test/oto_validate_cli_test.dart`.
|
||||
|
||||
### 분할 판단
|
||||
|
||||
- split decision policy를 먼저 적용했다.
|
||||
- 공유 task group: `m-control-plane-separation-migration`.
|
||||
- siblings: `01_runner_app` 독립 선행, `02_client_app` 독립, `03_core_service` 독립, `04+01,02,03_root_entrypoints`는 세 앱/서비스 scaffold 완료 후 실행.
|
||||
- runner 이동은 Dart package 경계와 기존 source/test 이동을 함께 다루므로 단일 subtask로 유지한다. client/core/root helper는 다른 toolchain과 검증 전략이라 분리했다.
|
||||
|
||||
### 범위 결정 근거
|
||||
|
||||
- 이 plan은 `apps/runner` 이동만 수행한다.
|
||||
- `apps/client`, `services/core`, root `Makefile`/README 위임 정리는 제외한다.
|
||||
- `packages/` 공유 패키지는 만들지 않는다.
|
||||
- generated `*.g.dart`, protobuf 산출물은 이동만 하고 수동 수정하지 않는다.
|
||||
|
||||
### 빌드 등급
|
||||
|
||||
- `cloud-G07`: CLI 실행 경로, package root, path dependency, tests/scripts/README를 함께 바꾸는 repo 구조 전환이며 터미널 검증 신뢰도가 중요하다.
|
||||
|
||||
## 구현 체크리스트
|
||||
|
||||
- [ ] 현재 root Dart package 파일을 `apps/runner` 아래로 이동하고 package name `oto`를 유지한다.
|
||||
- [ ] `apps/runner/pubspec.yaml`의 `proto_socket` path dependency를 새 깊이에 맞게 조정하고 generated analyzer exclude 경로를 유지한다.
|
||||
- [ ] 실제 binary 실행 tests와 script의 `bin/main.dart` 참조를 runner package 기준으로 갱신한다.
|
||||
- [ ] runner 경로에서 `dart pub get`, `dart analyze`, `dart test`를 실행해 `runner-app` 검증을 충족한다.
|
||||
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.
|
||||
|
||||
### [MONOREPO_RUNNER-1] Move Dart Runner Package
|
||||
|
||||
문제: Milestone은 현재 root runtime을 `apps/runner`로 옮기라고 지정하지만 현재 package files는 root에 있다. `agent-roadmap/phase/independent-control-plane/milestones/control-plane-separation-migration.md:28`와 `:40`이 target이다.
|
||||
|
||||
해결 방법:
|
||||
|
||||
Before (`pubspec.yaml:23`):
|
||||
```yaml
|
||||
proto_socket:
|
||||
path: ../proto-socket/dart
|
||||
```
|
||||
|
||||
After (`apps/runner/pubspec.yaml`):
|
||||
```yaml
|
||||
proto_socket:
|
||||
path: ../../../proto-socket/dart
|
||||
```
|
||||
|
||||
수정 파일 및 체크리스트:
|
||||
- [ ] `bin/` -> `apps/runner/bin/`
|
||||
- [ ] `lib/` -> `apps/runner/lib/`
|
||||
- [ ] `test/` -> `apps/runner/test/`
|
||||
- [ ] `assets/` 중 runner runtime이 소비하는 `script/`, `template/`, `yaml/sample/` -> `apps/runner/assets/`
|
||||
- [ ] `pubspec.yaml` -> `apps/runner/pubspec.yaml`
|
||||
- [ ] `analysis_options.yaml` -> `apps/runner/analysis_options.yaml`
|
||||
- [ ] root ignored `pubspec.lock`는 강제 이동하지 않고 `apps/runner`에서 `dart pub get`으로 재생성한다.
|
||||
|
||||
테스트 작성: 새 테스트보다 기존 runner test suite를 이동/보정한다. 파일 이동 자체의 신규 unit test는 만들지 않는다.
|
||||
|
||||
중간 검증:
|
||||
```bash
|
||||
cd apps/runner && dart pub get && dart analyze
|
||||
```
|
||||
예상 결과: dependency resolution 성공, `No issues found!`.
|
||||
|
||||
### [MONOREPO_RUNNER-2] Preserve CLI Execution Contracts
|
||||
|
||||
문제: debug executable name과 integration tests/scripts가 root `bin/main.dart`를 전제로 한다. 예: `lib/cli/cli.dart:23-26`, `test/oto_catalog_cli_test.dart:97-113`, `test/oto_validate_cli_test.dart:176-179`, `assets/script/shell/build.sh:24-28`, `assets/script/batch/build.bat:22-25`.
|
||||
|
||||
해결 방법:
|
||||
|
||||
Before (`lib/cli/cli.dart:23`):
|
||||
```dart
|
||||
if (fileName == 'dart') {
|
||||
//debug
|
||||
fileName = 'dart bin/main.dart';
|
||||
}
|
||||
```
|
||||
|
||||
After:
|
||||
```dart
|
||||
if (fileName == 'dart') {
|
||||
fileName = 'dart bin/main.dart';
|
||||
}
|
||||
```
|
||||
|
||||
실행 표시 문자열은 runner package 내부에서는 그대로 `bin/main.dart`가 맞다. root에서 실행하는 tests/scripts는 `workingDirectory: apps/runner` 또는 `cd apps/runner` 기준으로 보정한다.
|
||||
|
||||
수정 파일 및 체크리스트:
|
||||
- [ ] `apps/runner/test/oto_agent_cli_test.dart`
|
||||
- [ ] `apps/runner/test/oto_catalog_cli_test.dart`
|
||||
- [ ] `apps/runner/test/oto_validate_cli_test.dart`
|
||||
- [ ] `apps/runner/test/oto_application_test.dart`
|
||||
- [ ] `apps/runner/assets/script/shell/build.sh`
|
||||
- [ ] `apps/runner/assets/script/batch/build.bat`
|
||||
|
||||
테스트 작성: 기존 integration tests를 유지하고 working directory/path만 runner 기준으로 고친다.
|
||||
|
||||
중간 검증:
|
||||
```bash
|
||||
cd apps/runner && dart test test/oto_agent_cli_test.dart test/oto_catalog_cli_test.dart test/oto_validate_cli_test.dart test/oto_application_test.dart
|
||||
```
|
||||
예상 결과: 지정 테스트 통과.
|
||||
|
||||
## 수정 파일 요약
|
||||
|
||||
| 파일 | 항목 |
|
||||
|------|------|
|
||||
| `apps/runner/bin/**` | MONOREPO_RUNNER-1 |
|
||||
| `apps/runner/lib/**` | MONOREPO_RUNNER-1 |
|
||||
| `apps/runner/test/**` | MONOREPO_RUNNER-1, MONOREPO_RUNNER-2 |
|
||||
| `apps/runner/assets/**` | MONOREPO_RUNNER-1, MONOREPO_RUNNER-2 |
|
||||
| `apps/runner/pubspec.yaml` | MONOREPO_RUNNER-1 |
|
||||
| `apps/runner/analysis_options.yaml` | MONOREPO_RUNNER-1 |
|
||||
|
||||
## 최종 검증
|
||||
|
||||
```bash
|
||||
cd apps/runner && dart pub get && dart analyze && dart test
|
||||
```
|
||||
예상 결과: dependency resolution 성공, analyzer issue 없음, 모든 runner tests 통과.
|
||||
|
||||
모든 코드 변경 완료 후 반드시 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 채운다. 이 파일 작성이 구현의 마지막 단계다.
|
||||
|
|
@ -0,0 +1,94 @@
|
|||
<!-- task=m-control-plane-separation-migration/01_runner_app plan=1 tag=REVIEW_MONOREPO_RUNNER -->
|
||||
|
||||
# Implementation Plan - REVIEW_MONOREPO_RUNNER
|
||||
|
||||
## 이 파일을 읽는 구현 에이전트에게
|
||||
|
||||
`CODE_REVIEW-local-G05.md`의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채우는 것이 마지막 단계다. 검증을 실행하고, active 파일은 그대로 둔 채 리뷰 준비 상태를 보고한다. 사용자 결정, 사용자 소유 외부 환경/secret, 또는 범위 충돌 없이는 안전하게 진행할 수 없으면 review stub의 `사용자 리뷰 요청` 섹션에 근거를 남기고 중단한다. 구현 에이전트는 `USER_REVIEW.md`, archive log, `complete.log`를 만들지 않는다.
|
||||
|
||||
## 배경
|
||||
|
||||
이 후속 작업은 `code_review_cloud_G07_0.log`의 Required finding을 해결한다. runner package는 `apps/runner`로 이동했지만, tracked VS Code launch 설정은 여전히 제거된 root `./bin/main.dart`를 실행 대상으로 가리킨다.
|
||||
|
||||
## 사용자 리뷰 요청 흐름
|
||||
|
||||
구현 중 사용자 결정이 필요한 경우 active `CODE_REVIEW-local-G05.md`의 `사용자 리뷰 요청` 섹션에 기록한다. 해당 섹션은 `agent-ops/skills/common/_templates/implementation-user-review-request-section.md` 형식을 따른다. code-review가 요청을 검증하고 실제 `USER_REVIEW.md` 작성 여부를 결정한다.
|
||||
|
||||
## Roadmap Targets
|
||||
|
||||
- Milestone: `agent-roadmap/phase/independent-control-plane/milestones/control-plane-separation-migration.md`
|
||||
- Task ids:
|
||||
- `runner-app`: 현재 OTO CLI/runtime 소스, 테스트, pubspec, 실행 entrypoint가 `apps/runner` 기준으로 이동되어 기존 로컬 CLI 실행이 유지된다.
|
||||
- Completion mode: check-on-pass
|
||||
|
||||
## 분석 결과
|
||||
|
||||
### 읽은 파일
|
||||
|
||||
- `agent-task/m-control-plane-separation-migration/01_runner_app/plan_cloud_G07_0.log`
|
||||
- `agent-task/m-control-plane-separation-migration/01_runner_app/code_review_cloud_G07_0.log`
|
||||
- `.vscode/launch.json`
|
||||
- `apps/runner/bin/main.dart`
|
||||
|
||||
### 범위 결정 근거
|
||||
|
||||
- 이 plan은 `.vscode/launch.json`의 stale runner entrypoint 참조만 수정한다.
|
||||
- root helper, root README, Makefile, root-level delegation은 `04+01,02,03_root_entrypoints` 범위이므로 여기서 만들지 않는다.
|
||||
- 코드, package manifest, Dart tests는 수정하지 않는다.
|
||||
|
||||
### 빌드 등급
|
||||
|
||||
- `local-G05`: tracked JSON launch 설정의 deterministic path 보정이며 grep과 runner CLI smoke로 검증 가능하다.
|
||||
|
||||
## 구현 체크리스트
|
||||
|
||||
- [ ] `.vscode/launch.json`의 OTO CLI launch entries가 제거된 root `./bin/main.dart` 대신 runner entrypoint를 사용한다.
|
||||
- [ ] runner launch entries가 `apps/runner` package context에서 실행되도록 `cwd` 또는 동등한 설정을 포함한다.
|
||||
- [ ] stale `./bin/main.dart` launch program 참조가 tracked VS Code 설정에서 사라졌음을 grep으로 확인한다.
|
||||
- [ ] runner CLI smoke를 실행해 보정한 package context가 실제 CLI 실행과 호환됨을 확인한다.
|
||||
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.
|
||||
|
||||
### [REVIEW_MONOREPO_RUNNER-1] Repair VS Code Runner Launch Paths
|
||||
|
||||
문제: `.vscode/launch.json`의 여러 launch entry가 `"program": "./bin/main.dart"`를 사용한다. `01_runner_app` 구현은 root `bin/main.dart`를 `apps/runner/bin/main.dart`로 이동했기 때문에, tracked launch 설정이 제거된 파일을 가리킨다.
|
||||
|
||||
해결 방법:
|
||||
|
||||
Before (`.vscode/launch.json:11`):
|
||||
```json
|
||||
"program": "./bin/main.dart"
|
||||
```
|
||||
|
||||
After example:
|
||||
```json
|
||||
"cwd": "${workspaceFolder}/apps/runner",
|
||||
"program": "${workspaceFolder}/apps/runner/bin/main.dart"
|
||||
```
|
||||
|
||||
수정 지침:
|
||||
- [ ] `.vscode/launch.json`에서 OTO CLI를 실행하는 모든 `"program": "./bin/main.dart"` entry를 runner entrypoint로 갱신한다.
|
||||
- [ ] 각 entry가 runner package 기준으로 실행되도록 `cwd`를 `${workspaceFolder}/apps/runner`로 둔다. 동등하게 안전한 VS Code Dart launch 설정을 쓰는 경우 `계획 대비 변경 사항`에 이유를 남긴다.
|
||||
- [ ] 기존 args는 이 후속 작업에서 새 root helper semantics로 재설계하지 않는다. 명백히 package-relative로만 해석되어야 하는 값은 runner `cwd` 기준을 유지한다.
|
||||
|
||||
테스트 작성: JSON launch 설정 보정이라 신규 Dart test는 만들지 않는다.
|
||||
|
||||
중간 검증:
|
||||
```bash
|
||||
if git grep -n '"program": "./bin/main.dart"' -- .vscode/launch.json; then exit 1; else echo "no stale launch program refs"; fi
|
||||
```
|
||||
예상 결과: `no stale launch program refs`.
|
||||
|
||||
## 수정 파일 요약
|
||||
|
||||
| 파일 | 항목 |
|
||||
|------|------|
|
||||
| `.vscode/launch.json` | REVIEW_MONOREPO_RUNNER-1 |
|
||||
|
||||
## 최종 검증
|
||||
|
||||
```bash
|
||||
cd apps/runner && dart run bin/main.dart catalog --json
|
||||
```
|
||||
예상 결과: command catalog JSON이 stdout에 출력되고 exit code 0으로 종료한다.
|
||||
|
||||
모든 코드 변경 완료 후 반드시 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 채운다. 이 파일 작성이 구현의 마지막 단계다.
|
||||
|
|
@ -0,0 +1,88 @@
|
|||
<!-- task=m-control-plane-separation-migration/02_client_app plan=0 tag=MONOREPO_CLIENT -->
|
||||
|
||||
# Code Review Reference - MONOREPO_CLIENT
|
||||
|
||||
> **[IMPLEMENTING AGENT — READ FIRST] Filling in this file is the mandatory final step of implementation.**
|
||||
> Fill implementation-owned sections, then stop with active files in place and report ready for review.
|
||||
> Finalization is review-agent-only.
|
||||
|
||||
## 개요
|
||||
|
||||
date=2026-06-05
|
||||
task=m-control-plane-separation-migration/02_client_app, plan=0, tag=MONOREPO_CLIENT
|
||||
|
||||
## Roadmap Targets
|
||||
|
||||
- Milestone: `agent-roadmap/phase/independent-control-plane/milestones/control-plane-separation-migration.md`
|
||||
- Task ids:
|
||||
- `client-app`: Flutter client가 `apps/client` 기준으로 추가되고, OTO 독립 콘솔의 source of truth가 client app에 위치한다.
|
||||
- Completion mode: check-on-pass
|
||||
|
||||
## 이 파일을 읽는 리뷰 에이전트에게
|
||||
|
||||
> **[REVIEW AGENT ONLY]** 종결 절차는 코드리뷰 에이전트 전용이다.
|
||||
|
||||
## 구현 항목별 완료 여부
|
||||
|
||||
| 항목 | 완료 여부 |
|
||||
|------|---------|
|
||||
| [MONOREPO_CLIENT-1] Add Flutter Client Scaffold | [ ] |
|
||||
|
||||
## 구현 체크리스트
|
||||
|
||||
- [ ] `apps/client`에 Flutter app scaffold를 만들고 project name은 `oto_client`로 둔다.
|
||||
- [ ] 초기 앱은 독립 콘솔 source of truth가 드러나도록 title/app shell만 최소 수정한다.
|
||||
- [ ] scaffold widget test를 현재 title/app shell에 맞게 보정한다.
|
||||
- [ ] `apps/client`에서 `flutter analyze`와 `flutter test`를 실행한다.
|
||||
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.
|
||||
|
||||
## 코드리뷰 전용 체크리스트
|
||||
|
||||
- [ ] `코드리뷰 결과`에 `PASS`, `WARN`, `FAIL` 중 하나의 판정을 append한다.
|
||||
- [ ] active plan/review 파일을 `.log`로 아카이브한다.
|
||||
- [ ] PASS이면 `complete.log` 작성 후 active task directory를 archive로 이동한다.
|
||||
- [ ] PASS이면 런타임이 읽을 완료 이벤트 메타데이터를 보고한다.
|
||||
|
||||
## 계획 대비 변경 사항
|
||||
|
||||
_구현 에이전트가 계획과 다르게 구현한 부분을 이유와 함께 기록한다._
|
||||
|
||||
## 주요 설계 결정
|
||||
|
||||
_구현 에이전트가 주요 설계 결정 사항을 기록한다._
|
||||
|
||||
## 사용자 리뷰 요청
|
||||
|
||||
_기본값은 `없음`이다. 구현 중 사용자 결정, 사용자 소유 외부 환경/secret/서비스 준비, 또는 계획 범위 변경 없이는 안전하게 진행할 수 없으면 아래 항목을 실제 내용으로 교체하고, 구현을 중단한 뒤 active 파일을 그대로 둔 채 리뷰를 요청한다._
|
||||
|
||||
- 상태: 없음
|
||||
- 사유 유형: 없음
|
||||
- 결정 필요: 없음
|
||||
- 차단 근거: 없음
|
||||
- 실행한 검증/명령: 없음
|
||||
- 자동 후속 불가 이유: 없음
|
||||
- 재개 조건: 없음
|
||||
|
||||
## 리뷰어를 위한 체크포인트
|
||||
|
||||
- `apps/client`가 독립 Flutter app으로 생성됐는지 확인한다.
|
||||
- API/auth/runner list 같은 후속 범위가 섞이지 않았는지 확인한다.
|
||||
- `flutter analyze`와 `flutter test` 출력이 실제 코드와 일치하는지 확인한다.
|
||||
|
||||
## 검증 결과
|
||||
|
||||
### MONOREPO_CLIENT-1 중간 검증
|
||||
```bash
|
||||
$ cd apps/client && flutter analyze
|
||||
(output)
|
||||
```
|
||||
|
||||
### 최종 검증
|
||||
```bash
|
||||
$ cd apps/client && flutter analyze && flutter test
|
||||
(output)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
> **[IMPLEMENTING AGENT — BEFORE SAVING] Have you filled in every implementation-owned section?**
|
||||
|
|
@ -0,0 +1,117 @@
|
|||
<!-- task=m-control-plane-separation-migration/02_client_app plan=0 tag=MONOREPO_CLIENT -->
|
||||
|
||||
# Implementation Plan - MONOREPO_CLIENT
|
||||
|
||||
## 이 파일을 읽는 구현 에이전트에게
|
||||
|
||||
구현 완료 전 `CODE_REVIEW-local-G05.md`의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 사용자 결정, 사용자 소유 외부 환경/secret, 또는 범위 충돌이 있으면 review stub의 `사용자 리뷰 요청` 섹션에 근거를 남기고 중단한다. 구현 에이전트는 `USER_REVIEW.md`, archive log, `complete.log`를 만들지 않는다.
|
||||
|
||||
## 배경
|
||||
|
||||
Milestone은 OTO 독립 콘솔의 source of truth를 `apps/client`에 두라고 지정한다. 현재 repo에는 Flutter client app이 없으므로 최소 standalone scaffold와 검증 기준을 만든다. OTO Server API 연동은 아직 contract가 없으므로 이 plan에서는 제외한다.
|
||||
|
||||
## 사용자 리뷰 요청 흐름
|
||||
|
||||
구현 중 blocker는 active review stub의 `사용자 리뷰 요청` 섹션에 기록한다. code-review가 검증하고 `USER_REVIEW.md` 작성 여부를 결정한다.
|
||||
|
||||
## Roadmap Targets
|
||||
|
||||
- Milestone: `agent-roadmap/phase/independent-control-plane/milestones/control-plane-separation-migration.md`
|
||||
- Task ids:
|
||||
- `client-app`: Flutter client가 `apps/client` 기준으로 추가되고, OTO 독립 콘솔의 source of truth가 client app에 위치한다.
|
||||
- Completion mode: check-on-pass
|
||||
|
||||
## 분석 결과
|
||||
|
||||
### 읽은 파일
|
||||
|
||||
- `agent-roadmap/current.md`
|
||||
- `agent-roadmap/phase/independent-control-plane/PHASE.md`
|
||||
- `agent-roadmap/phase/independent-control-plane/milestones/control-plane-separation-migration.md`
|
||||
- `agent-ops/rules/project/rules.md`
|
||||
- `agent-ops/skills/common/plan/SKILL.md`
|
||||
- `agent-test/local/rules.md`
|
||||
- `agent-test/local/framework-smoke.md`
|
||||
- `pubspec.yaml`
|
||||
- `analysis_options.yaml`
|
||||
|
||||
### 테스트 환경 규칙
|
||||
|
||||
- test_env: `local`
|
||||
- `agent-test/local/rules.md`와 `framework-smoke.md`를 읽었다.
|
||||
- 적용 명령: `flutter analyze`, `flutter test`.
|
||||
- 확인한 도구: `flutter`는 `/sdk/flutter/bin/flutter`, Flutter `3.41.5`, Dart `3.11.3`.
|
||||
|
||||
### 테스트 커버리지 공백
|
||||
|
||||
- 기존 client app이 없어 기존 테스트 커버리지는 없다.
|
||||
- scaffold가 생성하는 widget test 또는 새 smoke widget test로 초기 화면이 렌더링되는지만 검증한다.
|
||||
|
||||
### 심볼 참조
|
||||
|
||||
- renamed/removed symbols: none.
|
||||
|
||||
### 분할 판단
|
||||
|
||||
- split decision policy를 적용했다.
|
||||
- `02_client_app`은 Flutter toolchain과 UI scaffold만 다루며 runner/core와 독립 검증 가능하다.
|
||||
- root helper 위임은 `04+01,02,03_root_entrypoints`로 분리했다.
|
||||
|
||||
### 범위 결정 근거
|
||||
|
||||
- OTO Server API client, auth, runner registry 화면, job/log/artifact UI는 제외한다.
|
||||
- `packages/` 공유 패키지를 만들지 않는다.
|
||||
- runner Dart package와 Go core service를 수정하지 않는다.
|
||||
|
||||
### 빌드 등급
|
||||
|
||||
- `local-G05`: 새 Flutter scaffold와 기본 widget smoke 검증으로 범위가 명확하고 deterministic하다.
|
||||
|
||||
## 구현 체크리스트
|
||||
|
||||
- [ ] `apps/client`에 Flutter app scaffold를 만들고 project name은 `oto_client`로 둔다.
|
||||
- [ ] 초기 앱은 독립 콘솔 source of truth가 드러나도록 title/app shell만 최소 수정한다.
|
||||
- [ ] scaffold widget test를 현재 title/app shell에 맞게 보정한다.
|
||||
- [ ] `apps/client`에서 `flutter analyze`와 `flutter test`를 실행한다.
|
||||
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.
|
||||
|
||||
### [MONOREPO_CLIENT-1] Add Flutter Client Scaffold
|
||||
|
||||
문제: Milestone `agent-roadmap/phase/independent-control-plane/milestones/control-plane-separation-migration.md:29`와 `:41`은 `apps/client` Flutter client를 요구하지만 현재 해당 경로가 없다.
|
||||
|
||||
해결 방법:
|
||||
|
||||
```bash
|
||||
flutter create --project-name oto_client --platforms=web,linux,macos,windows apps/client
|
||||
```
|
||||
|
||||
그 뒤 기본 sample counter UI를 OTO Console shell로 줄인다. API endpoint, auth, runner list는 만들지 않는다.
|
||||
|
||||
수정 파일 및 체크리스트:
|
||||
- [ ] `apps/client/pubspec.yaml`
|
||||
- [ ] `apps/client/lib/main.dart`
|
||||
- [ ] `apps/client/test/widget_test.dart`
|
||||
- [ ] Flutter scaffold가 생성한 platform/config files
|
||||
|
||||
테스트 작성: scaffold widget test를 "OTO Console" title 또는 초기 shell 렌더링 assertion으로 수정한다.
|
||||
|
||||
중간 검증:
|
||||
```bash
|
||||
cd apps/client && flutter analyze
|
||||
```
|
||||
예상 결과: analyzer issue 없음.
|
||||
|
||||
## 수정 파일 요약
|
||||
|
||||
| 파일 | 항목 |
|
||||
|------|------|
|
||||
| `apps/client/**` | MONOREPO_CLIENT-1 |
|
||||
|
||||
## 최종 검증
|
||||
|
||||
```bash
|
||||
cd apps/client && flutter analyze && flutter test
|
||||
```
|
||||
예상 결과: Flutter analyze/test 통과.
|
||||
|
||||
모든 코드 변경 완료 후 반드시 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 채운다. 이 파일 작성이 구현의 마지막 단계다.
|
||||
|
|
@ -0,0 +1,88 @@
|
|||
<!-- task=m-control-plane-separation-migration/03_core_service plan=0 tag=MONOREPO_CORE -->
|
||||
|
||||
# Code Review Reference - MONOREPO_CORE
|
||||
|
||||
> **[IMPLEMENTING AGENT — READ FIRST] Filling in this file is the mandatory final step of implementation.**
|
||||
> Fill implementation-owned sections, then stop with active files in place and report ready for review.
|
||||
> Finalization is review-agent-only.
|
||||
|
||||
## 개요
|
||||
|
||||
date=2026-06-05
|
||||
task=m-control-plane-separation-migration/03_core_service, plan=0, tag=MONOREPO_CORE
|
||||
|
||||
## Roadmap Targets
|
||||
|
||||
- Milestone: `agent-roadmap/phase/independent-control-plane/milestones/control-plane-separation-migration.md`
|
||||
- Task ids:
|
||||
- `core-service`: OTO Server backend가 `services/core` 기준으로 생성되고, health/readiness와 local run entrypoint가 준비된다.
|
||||
- Completion mode: check-on-pass
|
||||
|
||||
## 이 파일을 읽는 리뷰 에이전트에게
|
||||
|
||||
> **[REVIEW AGENT ONLY]** 종결 절차는 코드리뷰 에이전트 전용이다.
|
||||
|
||||
## 구현 항목별 완료 여부
|
||||
|
||||
| 항목 | 완료 여부 |
|
||||
|------|---------|
|
||||
| [MONOREPO_CORE-1] Add Core Service Scaffold | [ ] |
|
||||
|
||||
## 구현 체크리스트
|
||||
|
||||
- [ ] `services/core`에 Go module과 local run entrypoint를 만든다.
|
||||
- [ ] health/readiness HTTP handlers를 외부 dependency 없이 구현한다.
|
||||
- [ ] handler tests를 작성한다.
|
||||
- [ ] `services/core`에서 `go test ./...`를 실행한다.
|
||||
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.
|
||||
|
||||
## 코드리뷰 전용 체크리스트
|
||||
|
||||
- [ ] `코드리뷰 결과`에 `PASS`, `WARN`, `FAIL` 중 하나의 판정을 append한다.
|
||||
- [ ] active plan/review 파일을 `.log`로 아카이브한다.
|
||||
- [ ] PASS이면 `complete.log` 작성 후 active task directory를 archive로 이동한다.
|
||||
- [ ] PASS이면 런타임이 읽을 완료 이벤트 메타데이터를 보고한다.
|
||||
|
||||
## 계획 대비 변경 사항
|
||||
|
||||
_구현 에이전트가 계획과 다르게 구현한 부분을 이유와 함께 기록한다._
|
||||
|
||||
## 주요 설계 결정
|
||||
|
||||
_구현 에이전트가 주요 설계 결정 사항을 기록한다._
|
||||
|
||||
## 사용자 리뷰 요청
|
||||
|
||||
_기본값은 `없음`이다. 구현 중 사용자 결정, 사용자 소유 외부 환경/secret/서비스 준비, 또는 계획 범위 변경 없이는 안전하게 진행할 수 없으면 아래 항목을 실제 내용으로 교체하고, 구현을 중단한 뒤 active 파일을 그대로 둔 채 리뷰를 요청한다._
|
||||
|
||||
- 상태: 없음
|
||||
- 사유 유형: 없음
|
||||
- 결정 필요: 없음
|
||||
- 차단 근거: 없음
|
||||
- 실행한 검증/명령: 없음
|
||||
- 자동 후속 불가 이유: 없음
|
||||
- 재개 조건: 없음
|
||||
|
||||
## 리뷰어를 위한 체크포인트
|
||||
|
||||
- `services/core`가 독립 Go module인지 확인한다.
|
||||
- health/readiness 외에 후속 범위가 섞이지 않았는지 확인한다.
|
||||
- `go test ./...` 출력이 실제 코드와 일치하는지 확인한다.
|
||||
|
||||
## 검증 결과
|
||||
|
||||
### MONOREPO_CORE-1 중간 검증
|
||||
```bash
|
||||
$ cd services/core && go test ./...
|
||||
(output)
|
||||
```
|
||||
|
||||
### 최종 검증
|
||||
```bash
|
||||
$ cd services/core && go test ./...
|
||||
(output)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
> **[IMPLEMENTING AGENT — BEFORE SAVING] Have you filled in every implementation-owned section?**
|
||||
|
|
@ -0,0 +1,118 @@
|
|||
<!-- task=m-control-plane-separation-migration/03_core_service plan=0 tag=MONOREPO_CORE -->
|
||||
|
||||
# Implementation Plan - MONOREPO_CORE
|
||||
|
||||
## 이 파일을 읽는 구현 에이전트에게
|
||||
|
||||
구현 완료 전 `CODE_REVIEW-local-G05.md`의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 사용자 결정, 사용자 소유 외부 환경/secret, 또는 범위 충돌이 있으면 review stub의 `사용자 리뷰 요청` 섹션에 근거를 남기고 중단한다. 구현 에이전트는 `USER_REVIEW.md`, archive log, `complete.log`를 만들지 않는다.
|
||||
|
||||
## 배경
|
||||
|
||||
Milestone은 OTO Control Plane backend를 `services/core`에 두고 health/readiness와 local run entrypoint를 준비하라고 지정한다. 현재 repo에는 Go service가 없으므로 외부 dependency 없는 최소 HTTP service와 테스트를 만든다. runner registry/enrollment/job dispatch는 후속 Epic의 계약이므로 이번 plan에서는 endpoint 이름만 확장 가능하게 둔다.
|
||||
|
||||
## 사용자 리뷰 요청 흐름
|
||||
|
||||
구현 중 blocker는 active review stub의 `사용자 리뷰 요청` 섹션에 기록한다. code-review가 검증하고 `USER_REVIEW.md` 작성 여부를 결정한다.
|
||||
|
||||
## Roadmap Targets
|
||||
|
||||
- Milestone: `agent-roadmap/phase/independent-control-plane/milestones/control-plane-separation-migration.md`
|
||||
- Task ids:
|
||||
- `core-service`: OTO Server backend가 `services/core` 기준으로 생성되고, health/readiness와 local run entrypoint가 준비된다.
|
||||
- Completion mode: check-on-pass
|
||||
|
||||
## 분석 결과
|
||||
|
||||
### 읽은 파일
|
||||
|
||||
- `agent-roadmap/current.md`
|
||||
- `agent-roadmap/phase/independent-control-plane/PHASE.md`
|
||||
- `agent-roadmap/phase/independent-control-plane/milestones/control-plane-separation-migration.md`
|
||||
- `agent-ops/rules/project/rules.md`
|
||||
- `agent-ops/skills/common/plan/SKILL.md`
|
||||
- `agent-test/local/rules.md`
|
||||
- `pubspec.yaml`
|
||||
|
||||
### 테스트 환경 규칙
|
||||
|
||||
- test_env: `local`
|
||||
- `agent-test/local/rules.md`는 Dart 중심 baseline이라 Go profile은 아직 없다. fallback verification은 Go toolchain 자체와 `go test ./...`로 둔다.
|
||||
- 확인한 도구: `go`는 `/config/.local/bin/go`, Go `1.26.2`.
|
||||
|
||||
### 테스트 커버리지 공백
|
||||
|
||||
- 기존 Go service가 없어 기존 테스트는 없다.
|
||||
- 새 HTTP health/readiness handler test를 작성해 status code/body를 검증한다.
|
||||
|
||||
### 심볼 참조
|
||||
|
||||
- renamed/removed symbols: none.
|
||||
|
||||
### 분할 판단
|
||||
|
||||
- split decision policy를 적용했다.
|
||||
- `03_core_service`는 Go service scaffold와 HTTP smoke만 다루며 runner/client와 독립 검증 가능하다.
|
||||
- root Makefile 위임은 `04+01,02,03_root_entrypoints`에서 처리한다.
|
||||
|
||||
### 범위 결정 근거
|
||||
|
||||
- runner registry, enrollment token persistence, bootstrap command generation, job/log/artifact storage는 제외한다.
|
||||
- database, migration, auth, OpenAPI/proto contract는 만들지 않는다.
|
||||
- `proto/oto`는 server-runner contract Epic에서 확정한다.
|
||||
|
||||
### 빌드 등급
|
||||
|
||||
- `local-G05`: 새 Go service scaffold와 deterministic handler tests로 범위가 작고 검증 가능하다.
|
||||
|
||||
## 구현 체크리스트
|
||||
|
||||
- [ ] `services/core`에 Go module과 local run entrypoint를 만든다.
|
||||
- [ ] health/readiness HTTP handlers를 외부 dependency 없이 구현한다.
|
||||
- [ ] handler tests를 작성한다.
|
||||
- [ ] `services/core`에서 `go test ./...`를 실행한다.
|
||||
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.
|
||||
|
||||
### [MONOREPO_CORE-1] Add Core Service Scaffold
|
||||
|
||||
문제: Milestone `agent-roadmap/phase/independent-control-plane/milestones/control-plane-separation-migration.md:30`와 `:42`는 `services/core` Go backend와 health/readiness/local run entrypoint를 요구하지만 현재 경로가 없다.
|
||||
|
||||
해결 방법:
|
||||
|
||||
```text
|
||||
services/core/
|
||||
go.mod
|
||||
cmd/oto-core/main.go
|
||||
internal/httpserver/server.go
|
||||
internal/httpserver/server_test.go
|
||||
```
|
||||
|
||||
`main.go`는 `OTO_CORE_ADDR` 환경값이 있으면 사용하고, 없으면 `127.0.0.1:8080`으로 listen한다. `server.go`는 `/healthz`와 `/readyz`를 같은 handler set에 등록한다.
|
||||
|
||||
수정 파일 및 체크리스트:
|
||||
- [ ] `services/core/go.mod`
|
||||
- [ ] `services/core/cmd/oto-core/main.go`
|
||||
- [ ] `services/core/internal/httpserver/server.go`
|
||||
- [ ] `services/core/internal/httpserver/server_test.go`
|
||||
|
||||
테스트 작성: `httptest`로 `/healthz`, `/readyz`, unknown route를 검증한다.
|
||||
|
||||
중간 검증:
|
||||
```bash
|
||||
cd services/core && go test ./...
|
||||
```
|
||||
예상 결과: 모든 Go package test 통과.
|
||||
|
||||
## 수정 파일 요약
|
||||
|
||||
| 파일 | 항목 |
|
||||
|------|------|
|
||||
| `services/core/**` | MONOREPO_CORE-1 |
|
||||
|
||||
## 최종 검증
|
||||
|
||||
```bash
|
||||
cd services/core && go test ./...
|
||||
```
|
||||
예상 결과: 모든 Go package test 통과.
|
||||
|
||||
모든 코드 변경 완료 후 반드시 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 채운다. 이 파일 작성이 구현의 마지막 단계다.
|
||||
|
|
@ -0,0 +1,89 @@
|
|||
<!-- task=m-control-plane-separation-migration/04+01,02,03_root_entrypoints plan=0 tag=MONOREPO_ROOT -->
|
||||
|
||||
# Code Review Reference - MONOREPO_ROOT
|
||||
|
||||
> **[IMPLEMENTING AGENT — READ FIRST] Filling in this file is the mandatory final step of implementation.**
|
||||
> This task depends on sibling complete logs for `01`, `02`, and `03`.
|
||||
> Fill implementation-owned sections, then stop with active files in place and report ready for review.
|
||||
> Finalization is review-agent-only.
|
||||
|
||||
## 개요
|
||||
|
||||
date=2026-06-05
|
||||
task=m-control-plane-separation-migration/04+01,02,03_root_entrypoints, plan=0, tag=MONOREPO_ROOT
|
||||
|
||||
## Roadmap Targets
|
||||
|
||||
- Milestone: `agent-roadmap/phase/independent-control-plane/milestones/control-plane-separation-migration.md`
|
||||
- Task ids:
|
||||
- `root-entrypoints`: root `bin/`, Makefile 또는 동등한 helper가 runner/client/core 작업을 위임하도록 정리되어 monorepo root에서 개발 진입점이 명확하다.
|
||||
- Completion mode: check-on-pass
|
||||
|
||||
## 이 파일을 읽는 리뷰 에이전트에게
|
||||
|
||||
> **[REVIEW AGENT ONLY]** 종결 절차는 코드리뷰 에이전트 전용이다.
|
||||
|
||||
## 구현 항목별 완료 여부
|
||||
|
||||
| 항목 | 완료 여부 |
|
||||
|------|---------|
|
||||
| [MONOREPO_ROOT-1] Add Root Makefile Delegation | [ ] |
|
||||
|
||||
## 구현 체크리스트
|
||||
|
||||
- [ ] predecessor `complete.log` 세 개가 있는지 확인하고 없으면 구현하지 않고 review stub에 차단 근거를 남긴다.
|
||||
- [ ] root `Makefile`을 추가해 runner/client/core setup/analyze/test/run helper를 위임한다.
|
||||
- [ ] root README의 설치/검증/프로젝트 구조를 monorepo 기준으로 보정한다.
|
||||
- [ ] root에서 `make test` 또는 개별 target을 실행해 위임 경로를 검증한다.
|
||||
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.
|
||||
|
||||
## 코드리뷰 전용 체크리스트
|
||||
|
||||
- [ ] `코드리뷰 결과`에 `PASS`, `WARN`, `FAIL` 중 하나의 판정을 append한다.
|
||||
- [ ] active plan/review 파일을 `.log`로 아카이브한다.
|
||||
- [ ] PASS이면 `complete.log` 작성 후 active task directory를 archive로 이동한다.
|
||||
- [ ] PASS이면 런타임이 읽을 완료 이벤트 메타데이터를 보고한다.
|
||||
|
||||
## 계획 대비 변경 사항
|
||||
|
||||
_구현 에이전트가 계획과 다르게 구현한 부분을 이유와 함께 기록한다._
|
||||
|
||||
## 주요 설계 결정
|
||||
|
||||
_구현 에이전트가 주요 설계 결정 사항을 기록한다._
|
||||
|
||||
## 사용자 리뷰 요청
|
||||
|
||||
_기본값은 `없음`이다. 구현 중 사용자 결정, 사용자 소유 외부 환경/secret/서비스 준비, 또는 계획 범위 변경 없이는 안전하게 진행할 수 없으면 아래 항목을 실제 내용으로 교체하고, 구현을 중단한 뒤 active 파일을 그대로 둔 채 리뷰를 요청한다._
|
||||
|
||||
- 상태: 없음
|
||||
- 사유 유형: 없음
|
||||
- 결정 필요: 없음
|
||||
- 차단 근거: 없음
|
||||
- 실행한 검증/명령: 없음
|
||||
- 자동 후속 불가 이유: 없음
|
||||
- 재개 조건: 없음
|
||||
|
||||
## 리뷰어를 위한 체크포인트
|
||||
|
||||
- predecessor `complete.log` 확인 없이 구현하지 않았는지 확인한다.
|
||||
- Makefile target이 runner/client/core 실제 경로로 위임되는지 확인한다.
|
||||
- README가 monorepo 구조를 설명하되 후속 기능을 완료된 것처럼 쓰지 않았는지 확인한다.
|
||||
|
||||
## 검증 결과
|
||||
|
||||
### MONOREPO_ROOT-1 중간 검증
|
||||
```bash
|
||||
$ make runner-analyze
|
||||
(output)
|
||||
```
|
||||
|
||||
### 최종 검증
|
||||
```bash
|
||||
$ make test
|
||||
(output)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
> **[IMPLEMENTING AGENT — BEFORE SAVING] Have you filled in every implementation-owned section?**
|
||||
|
|
@ -0,0 +1,143 @@
|
|||
<!-- task=m-control-plane-separation-migration/04+01,02,03_root_entrypoints plan=0 tag=MONOREPO_ROOT -->
|
||||
|
||||
# Implementation Plan - MONOREPO_ROOT
|
||||
|
||||
## 이 파일을 읽는 구현 에이전트에게
|
||||
|
||||
이 subtask는 디렉터리명 기준으로 `01_runner_app`, `02_client_app`, `03_core_service`의 `complete.log`가 먼저 필요하다. 구현 완료 전 `CODE_REVIEW-cloud-G06.md`의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 구현 에이전트는 `USER_REVIEW.md`, archive log, `complete.log`를 만들지 않는다.
|
||||
|
||||
## 배경
|
||||
|
||||
첫 Epic의 앞선 세 작업이 앱/서비스 경계를 만들면 monorepo root에서 반복 개발 진입점이 필요하다. 현재 README와 scripts는 루트 단일 Dart package 기준이라 runner/client/core 작업을 위임하는 root helper로 정리해야 한다. 이 plan은 root `Makefile`과 README 실행 명령만 다룬다.
|
||||
|
||||
## 사용자 리뷰 요청 흐름
|
||||
|
||||
구현 중 blocker는 active review stub의 `사용자 리뷰 요청` 섹션에 기록한다. code-review가 검증하고 `USER_REVIEW.md` 작성 여부를 결정한다.
|
||||
|
||||
## Roadmap Targets
|
||||
|
||||
- Milestone: `agent-roadmap/phase/independent-control-plane/milestones/control-plane-separation-migration.md`
|
||||
- Task ids:
|
||||
- `root-entrypoints`: root `bin/`, Makefile 또는 동등한 helper가 runner/client/core 작업을 위임하도록 정리되어 monorepo root에서 개발 진입점이 명확하다.
|
||||
- Completion mode: check-on-pass
|
||||
|
||||
## 분석 결과
|
||||
|
||||
### 읽은 파일
|
||||
|
||||
- `agent-roadmap/current.md`
|
||||
- `agent-roadmap/phase/independent-control-plane/PHASE.md`
|
||||
- `agent-roadmap/phase/independent-control-plane/milestones/control-plane-separation-migration.md`
|
||||
- `agent-ops/rules/project/rules.md`
|
||||
- `agent-ops/skills/common/plan/SKILL.md`
|
||||
- `agent-test/local/rules.md`
|
||||
- `agent-test/local/cli-smoke.md`
|
||||
- `agent-test/local/framework-smoke.md`
|
||||
- `README.md`
|
||||
- `assets/script/shell/build.sh`
|
||||
- `assets/script/batch/build.bat`
|
||||
- `lib/cli/cli.dart`
|
||||
- `test/oto_agent_cli_test.dart`
|
||||
- `test/oto_application_test.dart`
|
||||
- `test/oto_catalog_cli_test.dart`
|
||||
- `test/oto_validate_cli_test.dart`
|
||||
|
||||
### 테스트 환경 규칙
|
||||
|
||||
- test_env: `local`
|
||||
- 적용 profiles: `cli-smoke`, `framework-smoke`.
|
||||
- 적용 명령: `make runner-analyze`, `make runner-test`, `make client-test`, `make core-test`, `make test`.
|
||||
- 확인한 도구: `make`는 `/config/.local/bin/make`, GNU Make `4.3`.
|
||||
|
||||
### 테스트 커버리지 공백
|
||||
|
||||
- 기존 테스트는 root Makefile 자체를 검증하지 않는다.
|
||||
- 이 plan은 Makefile target 실행을 최종 검증으로 사용한다.
|
||||
|
||||
### 심볼 참조
|
||||
|
||||
- renamed/removed symbols: none.
|
||||
- path 문자열 보정 대상: root `README.md`의 `dart compile exe bin/main.dart -o oto`, scripts/tests에 남은 root `bin/main.dart` 참조가 있으면 모두 의도 여부를 확인한다.
|
||||
|
||||
### 분할 판단
|
||||
|
||||
- split decision policy를 적용했다.
|
||||
- 이 subtask는 `04+01,02,03_root_entrypoints`이므로 predecessor indices `01`, `02`, `03`이 필요하다.
|
||||
- 현재 predecessor `complete.log` 상태: active 경로 기준 missing. 구현 시작 전 다음 파일이 있어야 한다.
|
||||
- `agent-task/m-control-plane-separation-migration/01_runner_app/complete.log`
|
||||
- `agent-task/m-control-plane-separation-migration/02_client_app/complete.log`
|
||||
- `agent-task/m-control-plane-separation-migration/03_core_service/complete.log`
|
||||
|
||||
### 범위 결정 근거
|
||||
|
||||
- runner/client/core 내부 기능 구현은 제외한다.
|
||||
- root helper는 Makefile 중심으로 둔다. 별도 root binary wrapper는 필요한 근거가 생기기 전까지 만들지 않는다.
|
||||
- roadmap 상태 체크는 이 plan에서 직접 수정하지 않는다.
|
||||
|
||||
### 빌드 등급
|
||||
|
||||
- `cloud-G06`: 세 toolchain을 root에서 orchestration하고 predecessor 상태를 확인해야 하며 CLI/script 경로 회귀 위험이 있다.
|
||||
|
||||
## 의존 관계 및 구현 순서
|
||||
|
||||
- `01_runner_app`, `02_client_app`, `03_core_service`의 `complete.log`가 모두 있어야 구현을 시작한다.
|
||||
- dependency는 디렉터리명 `04+01,02,03_root_entrypoints`가 source of truth다.
|
||||
|
||||
## 구현 체크리스트
|
||||
|
||||
- [ ] predecessor `complete.log` 세 개가 있는지 확인하고 없으면 구현하지 않고 review stub에 차단 근거를 남긴다.
|
||||
- [ ] root `Makefile`을 추가해 runner/client/core setup/analyze/test/run helper를 위임한다.
|
||||
- [ ] root README의 설치/검증/프로젝트 구조를 monorepo 기준으로 보정한다.
|
||||
- [ ] root에서 `make test` 또는 개별 target을 실행해 위임 경로를 검증한다.
|
||||
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.
|
||||
|
||||
### [MONOREPO_ROOT-1] Add Root Makefile Delegation
|
||||
|
||||
문제: Milestone `agent-roadmap/phase/independent-control-plane/milestones/control-plane-separation-migration.md:43`은 root helper가 runner/client/core 작업을 위임해야 한다고 지정한다. 현재 root에는 Makefile이 없고 README는 `README.md:18-21`, `:51`, `:67-73`, `:299-311`에서 단일 Dart package 구조를 설명한다.
|
||||
|
||||
해결 방법:
|
||||
|
||||
Makefile target baseline:
|
||||
```make
|
||||
runner-get:
|
||||
cd apps/runner && dart pub get
|
||||
runner-analyze:
|
||||
cd apps/runner && dart analyze
|
||||
runner-test:
|
||||
cd apps/runner && dart test
|
||||
client-analyze:
|
||||
cd apps/client && flutter analyze
|
||||
client-test:
|
||||
cd apps/client && flutter test
|
||||
core-test:
|
||||
cd services/core && go test ./...
|
||||
test: runner-test client-test core-test
|
||||
```
|
||||
|
||||
수정 파일 및 체크리스트:
|
||||
- [ ] `Makefile`
|
||||
- [ ] `README.md`
|
||||
|
||||
테스트 작성: Makefile target 실행 자체를 검증으로 둔다. 별도 unit test는 만들지 않는다.
|
||||
|
||||
중간 검증:
|
||||
```bash
|
||||
make runner-analyze
|
||||
```
|
||||
예상 결과: runner analyzer 통과.
|
||||
|
||||
## 수정 파일 요약
|
||||
|
||||
| 파일 | 항목 |
|
||||
|------|------|
|
||||
| `Makefile` | MONOREPO_ROOT-1 |
|
||||
| `README.md` | MONOREPO_ROOT-1 |
|
||||
|
||||
## 최종 검증
|
||||
|
||||
```bash
|
||||
make test
|
||||
```
|
||||
예상 결과: runner/client/core delegated test target이 모두 통과한다.
|
||||
|
||||
모든 코드 변경 완료 후 반드시 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 채운다. 이 파일 작성이 구현의 마지막 단계다.
|
||||
|
|
@ -21,7 +21,6 @@ class CLIConfig {
|
|||
var fileName = path.basename(Platform.resolvedExecutable);
|
||||
fileName = fileName.replaceAll(path.extension(fileName), '');
|
||||
if (fileName == 'dart') {
|
||||
//debug
|
||||
fileName = 'dart bin/main.dart';
|
||||
}
|
||||
executableFileName = fileName;
|
||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue