oto/agent-ops/rules/project/domain/scheduler/rules.md

3.3 KiB

domain last_rule_review_commit last_rule_updated_at
scheduler 810532a097 2026-06-24

scheduler

목적 / 책임

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

포함 경로

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

제외 경로

  • apps/runner/lib/cli/cli.dart — 일반 CLI 출력/명령 라우팅 (cli 도메인)
  • apps/runner/lib/cli/commands/command_exe.dart — 파이프라인 실행 isolate 진입 (cli 도메인). 단, scheduler가 실행을 위임한다
  • apps/runner/lib/oto/pipeline/ — 실제 파이프라인 실행 흐름 (pipeline 도메인)
  • apps/runner/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 builddart analyze를 실행한다

다른 도메인과의 경계

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

금지 사항

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