# scheduler

## 목적 / 책임

등록된 YAML 파이프라인을 백그라운드에서 cron 또는 interval 방식으로 실행하는 스케줄러 도메인이다.
CLI의 `scheduler` 명령, OS별 실행 경로, isolate 기반 실행, 등록 파일/로그 파일 관리를 담당한다.

## 포함 경로

- `lib/cli/commands/command_scheduler.dart` — `scheduler` CLI 명령 파싱과 진입점
- `lib/cli/commands/scheduler/` — 스케줄러 등록/해제/실행/OS별 구현
- `lib/cli/commands/scheduler/data/` — 스케줄러 설정 JSON 직렬화 모델

## 제외 경로

- `lib/cli/cli.dart` — 일반 CLI 출력/명령 라우팅 (`cli` 도메인)
- `lib/cli/commands/command_exe.dart` — 파이프라인 실행 isolate 진입 (`cli` 도메인). 단, scheduler가 실행을 위임한다
- `lib/oto/pipeline/` — 실제 파이프라인 실행 흐름 (`pipeline` 도메인)
- `lib/oto/commands/` — 실제 커맨드 실행 (`command` 도메인)

## 주요 구성 요소

- `CommandScheduler` — `-l`, `-r`, `-u`, `-e`, 숨김 `-s`, `-t` 플래그 처리
- `SchedulerManager` — 스케줄러 등록 파일, settings.json, 로그, 프로세스 시작/종료 관리
- `SchedulerLinux` / `SchedulerOsx` / `SchedulerWindows` — OS별 실행 파일 경로 결정
- `IsolateScheduler` — 스케줄러 YAML 변경 감지, cron/interval 실행, 로그 전송
- `SchedulerInterval` — interval 기반 반복 실행 제어
- `SchedulerListData` / `SchedulerData` — 로컬 scheduler settings JSON 모델

## 유지할 패턴

- OS별 차이는 `scheduler_linux.dart`, `scheduler_osx.dart`, `scheduler_windows.dart`에 분리한다
- YAML 파싱은 `Application.getMapFromYamlA()`와 `DataBuild.fromJson()` 흐름을 사용한다
- 실제 파이프라인 실행은 `CommandExe.executeScheduler()`에 위임하고, scheduler가 command/pipeline 내부를 직접 해석하지 않는다
- 스케줄러 등록 데이터는 `dataPath/scheduler` 하위의 YAML과 `settings.json` 구조를 유지한다
- 로그 파일명에는 alias, pid, 날짜/시간을 포함하는 기존 패턴을 유지한다
- scheduler 데이터 모델 변경 시 `dart run build_runner build`와 `dart analyze`를 실행한다

## 다른 도메인과의 경계

- **cli**: 일반 CLI 라우팅과 출력은 cli 도메인이다. scheduler 도메인은 `scheduler` 명령 이후의 등록/실행 정책을 담당한다
- **core**: YAML 파싱과 `Application.build()`는 core 도메인이다. scheduler는 실행 타이밍과 로그 파일을 준비해 위임한다
- **pipeline/command**: scheduler는 파이프라인과 커맨드를 직접 실행하지 않고 `CommandExe.executeScheduler()`를 통해 실행한다
- **sample**: scheduler YAML 예시는 `assets/yaml/sample/12_scheduler.yaml`에서 관리한다

## 금지 사항

- scheduler 내부에서 `Command.byType()` 또는 `Pipeline.pipelineInitialize()`를 직접 호출하지 않는다
- OS별 실행 경로 보정 로직을 공통 `SchedulerManager`에 섞지 않는다
- 등록/해제 작업에서 사용자가 지정한 YAML 외 임의의 프로젝트 파일을 수정하지 않는다
- scheduler 샘플에 실제 토큰, 비밀번호, API 키를 넣지 않는다
