# OTO Monorepo

YAML 기반 CI/CD 파이프라인 자동화 도구 OTO의 Monorepo 프로젝트입니다.
독립 Control Plane 분리 마이그레이션을 통해 Runner, Client, Core Service로 컴포넌트를 분리하여 관리합니다.

## 프로젝트 구조

```
/
├── apps/
│   ├── runner/       # Dart CLI 기반 OTO Runner (파이프라인 실행 엔진)
│   └── client/       # Flutter 기반 OTO Console Client (독립 제어 콘솔)
├── services/
│   └── core/         # Go 기반 OTO Control Plane Server (Runner Registry & Bootstrap)
└── Makefile          # Monorepo 작업을 위한 루트 진입점 Helper
```

## 시작하기

루트 `Makefile`을 통해 모든 서브프로젝트의 의존성 설치, 분석, 테스트 작업을 통합 관리할 수 있습니다.

## Workspace 포트와 환경 기준

OTO는 독립 Control Plane 제품 경로를 기준으로 포트와 환경값을 기록합니다.
iop Edge 또는 wire 포트는 OTO workspace 포트 표준의 source of truth가 아닙니다.
기본 local 테스트 evidence는 원격 runner `ssh toki@toki-labs.com`의 `/Users/toki/agent-work/oto` checkout 기준으로 수집합니다.

| 표면 | 표준 후보 | 호환 기준 |
|------|-----------|-----------|
| OTO Core HTTP | backend host publish `18020` | 로컬 실행 기본값 `OTO_CORE_ADDR` 미설정 시 `127.0.0.1:8080`은 기존 개발 호환 경로로 유지 |
| Flutter client/web preview | frontend preview `13020` | preview 포트는 UI dev server 포트이며, 서버 연결 URL은 `OTO_SERVER_HTTP_URL`로 별도 지정 |
| runner bootstrap/release | `OTO_RUNNER_RELEASE_BASE_URL` | release base URL은 `https://`만 기록하고, token/credential/private endpoint 원문은 tracked 문서에 남기지 않음 |

Core를 workspace publish 포트로 띄울 때는 `OTO_CORE_ADDR=0.0.0.0:18020`처럼 listen 주소를 명시합니다.
Flutter web preview는 `cd apps/client && flutter run -d chrome --web-port=13020`을 기준 후보로 둡니다.
Makefile 기준 실행은 `make core-run`과 `make client-run-web OTO_SERVER_HTTP_URL=http://toki-labs.com:18020`을 사용합니다.
bootstrap command와 artifact URL 문서는 public validation 기준과 source of truth만 남기고, enrollment token이나 private release host는 런타임 환경에서만 주입합니다.

### Runner bootstrap asset matrix

Control Plane bootstrap은 `OTO_RUNNER_RELEASE_BASE_URL` 아래의 OS/arch별 `oto` binary asset을 내려받는 것을 기준으로 합니다.
Linux와 macOS는 `tar.gz`, Windows는 `zip` archive를 사용합니다.

| OS | Arch | Release asset |
|----|------|---------------|
| Linux | x64 | `oto-linux-x64.tar.gz` |
| Linux | arm64 | `oto-linux-arm64.tar.gz` |
| macOS | x64 | `oto-macos-x64.tar.gz` |
| macOS | arm64 | `oto-macos-arm64.tar.gz` |
| Windows | x64 | `oto-windows-x64.zip` |
| Windows | arm64 | `oto-windows-arm64.zip` |

Bootstrap command 예시는 `--server-url`, `--agent-id`, `--enrollment-token`, `--release-base-url` 인자를 기준으로 하며, `--release-base-url`은 `https://` URL만 허용합니다.
Tracked 문서와 테스트 규칙에는 enrollment token, credential, private release host 원문을 기록하지 않습니다.

### 의존성 설치 (Setup)

각 앱/서비스의 패키지 및 모듈 의존성을 설치합니다.
```bash
make setup
```

### 코드 분석 및 린트 (Analyze)

서브프로젝트별 정적 분석을 수행합니다.
```bash
make runner-analyze
make client-analyze
```

### 테스트 실행 (Test)

#### 개별 서브프로젝트 테스트
```bash
make runner-test
make client-test
make core-test
```

#### 통합 테스트 실행 (전체 서브프로젝트)
```bash
make test
```

## 서브프로젝트 상세 안내

각 서브프로젝트의 내부 아키텍처 및 상세 사용 방법은 하위 경로의 README 문서를 참조하세요:
- [OTO Runner README](apps/runner/README.md)
- [OTO Client README](apps/client/README.md)
- OTO Core Server: [services/core/](services/core/)
