--- domain: scheduler last_rule_review_commit: 67d7b6e411b8a28d6d42cac550a29872a7ef6b7e last_rule_updated_at: 2026-06-01 --- # 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 키를 넣지 않는다