task-pipeliner 0.3.6 → 0.3.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. package/README.ko.md +30 -1276
  2. package/README.md +31 -1278
  3. package/dist/index.cjs +105 -99
  4. package/package.json +5 -1
package/README.ko.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  > 조건 기반 실행과 아름다운 CLI 출력을 제공하는 강력한 워크플로우 오케스트레이션 도구
4
4
 
5
- **버전:** 0.3.6
5
+ **버전:** 0.3.7
6
6
 
7
7
  ![fox2](https://github.com/user-attachments/assets/fdf8d786-6a91-4d2d-9dc1-72be6f3ccd98)
8
8
 
@@ -13,11 +13,14 @@
13
13
 
14
14
  **README-Language-Map** [KR [한국어 버전]](https://github.com/racgoo/task-pipeliner/blob/main/README.ko.md) / [EN [English Version]](https://github.com/racgoo/task-pipeliner)
15
15
 
16
+ > **📖 자세한 내용은 [공식 문서](https://task-pipeliner.racgoo.com/)를 참조하세요!**
17
+ > 이 README는 빠른 시작과 기본 사용법을 제공합니다. DSL 문법, 고급 기능, 예제 등 자세한 내용은 문서 사이트에서 확인할 수 있습니다.
18
+
16
19
  ## 리소스
17
20
 
18
21
  ### 문서 및 도구
19
22
 
20
- - 📚 **[문서](https://task-pipeliner.racgoo.com/)** - 완전한 DSL 참조가이드
23
+ - **[📖 공식 문서](https://task-pipeliner.racgoo.com/)** - **완전한 DSL 참조, 가이드, 예제 모든 기능 설명** ⭐
21
24
  - 🎨 **[워크플로우 생성기](https://task-pipeliner-generator.racgoo.com/)** - 브라우저에서 시각적으로 워크플로우 생성
22
25
 
23
26
  ### 저장소 및 패키지 관리자
@@ -29,6 +32,8 @@
29
32
 
30
33
  ## ✨ 주요 기능
31
34
 
35
+ > 💡 **각 기능에 대한 자세한 설명과 예제는 [DSL 참조 문서](https://task-pipeliner.racgoo.com/docs/dsl-reference/workflow-structure)를 확인하세요.**
36
+
32
37
  - **조건 기반 실행** - 파일 존재 여부, 사용자 선택, 환경 변수 등을 기반으로 단계 실행
33
38
 
34
39
  - **병렬 실행** - 여러 작업을 동시에 병렬로 실행
@@ -47,6 +52,8 @@
47
52
 
48
53
  ### CLI 명령어
49
54
 
55
+ > 💡 **CLI 명령어에 대한 자세한 설명은 [CLI 참조 문서](https://task-pipeliner.racgoo.com/docs/cli-reference)를 확인하세요.**
56
+
50
57
  **프로젝트 셋업 (신규 프로젝트 권장):**
51
58
  ```bash
52
59
  tp setup # tp/, tp/workflows, tp/schedules 생성 및 예시 워크플로우 2개·예시 스케줄 2개 추가 (echo 기반; choose, when, profiles, prompt 포함)
@@ -93,6 +100,10 @@ tp schedule status # 데몬·스케줄 상태 확인 (실시간 모드; Ctrl+C
93
100
  ```
94
101
  `tp schedule add`, `toggle`, `remove` 후에는 해당 스케줄이 `tp schedule list`와 같은 카드 레이아웃(크론, 언제 실행되는지 설명, 다음 실행, 활성 여부)으로 표시됩니다. 토글 후에는 ENABLED/DISABLED가 강조되어 새 상태를 한눈에 알 수 있습니다.
95
102
 
103
+ **스케줄 상태 (실시간 뷰)** — `tp schedule status`로 데몬과 모든 스케줄을 스크롤 가능한 실시간 화면으로 확인할 수 있습니다. Cron 시간에는 타임존(UTC 또는 local)이 함께 표시됩니다. 스케줄이 많을 때는 ↑/↓ 또는 PgUp/PgDn으로 스크롤할 수 있습니다.
104
+
105
+ <p align="center"><img src="https://github.com/user-attachments/assets/348325d3-d184-4c1e-bc78-040da13e7e7d" width="720" alt="tp schedule status 실시간 뷰" /></p>
106
+
96
107
  **데이터 및 업그레이드:**
97
108
  ```bash
98
109
  tp clean # ~/.pipeliner 전체 삭제 (스케줄, 데몬 상태, 워크플로우 히스토리)
@@ -216,6 +227,8 @@ npx tp run workflow.yaml
216
227
 
217
228
  ### 기본 사용법
218
229
 
230
+ > 💡 **더 많은 예제와 고급 사용법은 [시작하기 가이드](https://task-pipeliner.racgoo.com/docs/getting-started)와 [예제 문서](https://task-pipeliner.racgoo.com/docs/examples)를 참조하세요.**
231
+
219
232
  `workflow.yaml` 또는 `workflow.json` 파일을 생성하세요:
220
233
 
221
234
  **YAML 형식 (`workflow.yaml`):**
@@ -343,1280 +356,21 @@ tp run
343
356
 
344
357
  참고: 사일런트 모드는 명령 출력, 단계 헤더, 에러 메시지를 포함한 모든 출력을 억제합니다. 워크플로우는 정상적으로 실행되며 적절한 종료 코드를 반환합니다.
345
358
 
346
- ## DSL 문법
347
-
348
- ### 워크플로우 구조
349
-
350
- 워크플로우 파일은 다음 구조를 가진 YAML 또는 JSON 문서입니다:
351
-
352
- **YAML 형식:**
353
-
354
- ```yaml
355
- name: Workflow Name # 선택사항: 워크플로우 표시 이름
356
- baseDir: ./ # 선택사항: 명령 실행 기본 디렉토리
357
- # - 상대 경로: YAML 파일 위치 기준으로 해석
358
- # - 절대 경로: 그대로 사용
359
- # - 생략 시: 현재 작업 디렉토리 사용
360
- shell: # 선택사항: 모든 run 명령의 전역 설정
361
- - bash # - 첫 번째 요소: 쉘 프로그램 (bash, zsh, sh 등)
362
- - -lc # - 나머지: 쉘 인자 (-c, -lc 등)
363
- # - 생략 시: 플랫폼 기본 쉘 사용
364
- profiles: # 선택사항: tp run --profile <name>용 미리 설정된 변수
365
- - name: Test # - name: 프로필 이름
366
- var: # - var: 키-값 맵 ({{variable}} 치환 및 choose/prompt 생략에 사용)
367
- mode: "dev"
368
- label: "test-label"
369
-
370
- steps: # 필수: 실행할 단계 배열
371
- - some-step-1
372
- - some-step-2
373
- # ...
374
- ```
375
-
376
- **JSON 형식:**
377
-
378
- ```json
379
- {
380
- "name": "Workflow Name", // 선택사항: 워크플로우 표시 이름
381
- "baseDir": "./", // 선택사항: 명령 실행 기본 디렉토리
382
- // - 상대 경로: JSON 파일 위치 기준으로 해석
383
- // - 절대 경로: 그대로 사용
384
- // - 생략 시: 현재 작업 디렉토리 사용
385
- "shell": ["bash", "-lc"], // 선택사항: 모든 run 명령의 전역 쉘 설정
386
- // - 첫 번째 요소: 쉘 프로그램
387
- // - 나머지: 쉘 인자
388
- // - 생략 시: 플랫폼 기본 쉘 사용
389
- "profiles": [ // 선택사항: tp run --profile <name>용 미리 설정된 변수
390
- { "name": "Test", "var": { "mode": "dev", "label": "test-label" } }
391
- ],
392
- "steps": [ // 필수: 실행할 단계 배열
393
- { /* some-step-1 */ },
394
- { /* some-step-2 */ }
395
- ]
396
- }
397
- ```
398
-
399
- #### `name` (선택)
400
- - **타입**: `string`
401
- - **설명**: 워크플로우의 표시 이름
402
- - **예제**: `name: "빌드 및 배포"`
403
-
404
- #### `baseDir` (선택)
405
- - **타입**: `string` (상대 또는 절대 경로)
406
- - **설명**: 모든 명령 실행을 위한 기본 디렉토리
407
- - **해석**:
408
- - **상대 경로** (예: `./`, `../frontend`): YAML 파일의 디렉토리를 기준으로 해석
409
- - **절대 경로** (예: `/home/user/project`): 그대로 사용
410
- - **생략 시**: `process.cwd()` (현재 작업 디렉토리) 사용
411
- - **예제**:
412
- ```yaml
413
- baseDir: ./frontend # YAML 파일 기준 상대 경로
414
- baseDir: /app/frontend # 절대 경로
415
- ```
416
-
417
- #### `shell` (선택)
418
- - **타입**: `string`의 `array`
419
- - **설명**: 워크플로우 내 모든 `run` 명령에 대한 전역 쉘 설정
420
- - **형식**: `[프로그램, ...인자]` - 첫 번째 요소는 쉘 프로그램, 나머지는 인자
421
- - **우선순위**: 스텝별 `shell` > 워크플로우 `shell` > 사용자의 현재 쉘
422
- - **사용자의 현재 쉘** (생략 시):
423
- - **Linux/macOS**: `$SHELL` 환경변수 사용 (예: `/bin/zsh`, `/bin/bash`)
424
- - **Windows**: `%COMSPEC%` 사용 (일반적으로 `cmd.exe`)
425
- - **동작**: `tp run`을 실행한 쉘 환경과 동일한 환경에서 명령 실행
426
- - **예제**:
427
- ```yaml
428
- # Unix/Linux/macOS
429
- shell: [bash, -lc] # bash 로그인 쉘 사용
430
- shell: [zsh, -c] # zsh 사용
431
- shell: [sh, -c] # sh 사용 (POSIX)
432
-
433
- # Windows
434
- shell: [cmd, /c] # 명령 프롬프트
435
- shell: [powershell, -Command] # Windows PowerShell
436
- shell: [pwsh, -Command] # PowerShell Core
437
- ```
438
- - **크로스 플랫폼 예시**:
439
- - **Linux/macOS**: `[bash, -lc]`, `[zsh, -c]`, `[/bin/bash, -c]`
440
- - **Windows**: `[cmd, /c]`, `[powershell, -Command]`, `[pwsh, -Command]`
441
- - **Git Bash (Windows)**: `[bash, -c]`
442
- - **WSL**: `[wsl, bash, -c]` 또는 `wsl` 명령 직접 사용
443
-
444
- #### `profiles` (선택)
445
- - **타입**: `{ name: string, var: Record<string, string> }` 의 `array`
446
- - **설명**: 비대화형 실행을 위한 이름 붙은 변수 세트. `tp run --profile <name>` 과 함께 사용.
447
- - **동작**: 프로필을 사용하면, 프로필에 이미 설정된 변수에 값을 저장하는 **choose** 또는 **prompt** 단계는 생략되고, 프로필 값이 `{{variable}}` 치환 및 조건에 사용됩니다.
448
- - **예제**:
449
- ```yaml
450
- profiles:
451
- - name: Test
452
- var:
453
- mode: "dev"
454
- label: "test-label"
455
- - name: Prod
456
- var:
457
- mode: "prod"
458
- label: "prod-label"
459
- ```
460
- ```bash
461
- tp run workflow.yaml --profile Test # Test 프로필 변수 사용; mode, label에 대한 choose/prompt 생략
462
- ```
463
-
464
- #### `steps` (필수)
465
- - **타입**: `Step` 객체의 `array`
466
- - **설명**: 순차적으로 실행할 단계 목록
467
- - **실행**: 단계는 순서대로 하나씩 실행됩니다 (병렬이 아닌 경우)
468
-
469
- ---
470
-
471
- ### 단계 타입
472
-
473
- `steps` 배열의 각 단계는 다음 타입 중 하나일 수 있습니다:
474
-
475
- #### 1. `run` - 명령 실행
476
-
477
- 셸 명령을 실행합니다.
478
-
479
- **문법:**
480
- ```yaml
481
- - run: <command>
482
- when?: <condition> # 선택: 조건이 충족될 때만 실행
483
- timeout?: <number> # 선택: 타임아웃 (초 단위)
484
- retry?: <number> | "Infinity" # 선택: 실패 시 재시도 횟수 (기본값: 0). "Infinity"로 무한 재시도 가능
485
- shell?: <array> # 선택: 쉘 설정 (workflow.shell 오버라이드)
486
- continue?: <bool> # 선택: 이 스텝 이후 다음 스텝으로 진행할지 여부 (성공/실패 무관)
487
- onError?: # 선택: 에러 처리 동작
488
- run: <command> # 메인 run 명령이 실패했을 때 실행할 대체 명령 (사이드 이펙트)
489
- timeout?: <number> # 선택: 이 fallback 명령의 타임아웃
490
- retry?: <number> | "Infinity" # 선택: 이 fallback 명령의 재시도 횟수. "Infinity"로 무한 재시도 가능
491
- onError?: ... # 선택: 중첩 fallback (재귀 onError 체인)
492
- ```
493
-
494
- **속성:**
495
- - `run` (필수): `string` - 실행할 셸 명령
496
- - `when` (선택): `Condition` - 실행 전 확인할 조건
497
- - `timeout` (선택): `number` - 최대 실행 시간 (초 단위). 이 시간을 초과하면 명령이 종료됩니다.
498
- - `retry` (선택): `number | "Infinity"` - 실패 시 재시도 횟수 (기본값: 0, 재시도 없음). `"Infinity"`로 성공할 때까지 무한 재시도 가능
499
- - `shell` (선택): `string`의 `array` - 이 스텝의 쉘 설정. 워크플로우의 전역 `shell`을 오버라이드합니다. 형식: `[프로그램, ...인자]`. 예: `[bash, -lc]`, `[zsh, -c]`.
500
- - `continue` (선택): `boolean` - 이 스텝 완료 후 다음 스텝으로 진행할지 여부를 제어합니다 (성공/실패와 무관).
501
- - `continue: true` - 항상 다음 스텝으로 진행 (이 스텝이 실패해도)
502
- - `continue: false` - 항상 워크플로우 중단 (이 스텝이 성공해도)
503
- - `continue` 미설정 (기본값) - 성공 시 진행, 실패 시 중단
504
- - `onError.run` (선택): `string` - 메인 `run` 명령이 (자신의 재시도 후에도) 실패했을 때 실행할 대체 명령. **onError는 단순히 사이드 이펙트(예: 정리 작업, 롤백)를 수행하며, 스텝의 성공/실패 여부에는 영향을 주지 않습니다.** 메인 `run`이 실패하면 이 스텝은 실패로 간주됩니다.
505
- - `onError.timeout` (선택): `number` - 이 fallback 명령의 타임아웃.
506
- - `onError.retry` (선택): `number | "Infinity"` - 이 fallback 명령의 재시도 횟수. `"Infinity"`로 무한 재시도 가능.
507
-
508
- **예제:**
509
- ```yaml
510
- # 간단한 명령
511
- steps:
512
- - run: 'npm install'
513
-
514
- # 조건이 있는 명령
515
- - when:
516
- file: ./package.json
517
- run: 'npm install'
518
-
519
- # 변수 입력
520
- - choose:
521
- message: 실행알 모드를 선택하세요.
522
- options:
523
- - id: 1.1.1
524
- label: 1.1.1 버전 (display 영역에 표시될 문자열)
525
- - id: 1.1.2
526
- label: 1.1.2 버전 (display 영역에 표시될 문자열)
527
- - id: 1.1.3
528
- label: 1.1.3 버전 (display 영역에 표시될 문자열)
529
- as: version
530
-
531
- # 변수 치환이 있는 명령
532
- - run: 'echo "Building {{version}}"'
533
-
534
- # 타임아웃이 있는 명령 (30초)
535
- - run: 'npm install'
536
- timeout: 30
537
-
538
- # 재시도가 있는 명령 (최대 3번 재시도)
539
- - run: 'npm install'
540
- retry: 3
541
-
542
- # 무한 재시도 명령 (성공할 때까지 재시도)
543
- - run: 'npm install'
544
- retry: Infinity
545
-
546
- # PM2처럼 프로세스 관리: 서버가 죽으면 자동 재시작
547
- - run: 'node server.js'
548
- retry: Infinity
549
-
550
- # 타임아웃과 재시도 모두 사용
551
- - run: 'npm install'
552
- timeout: 60
553
- retry: 2
554
-
555
- # 실패 시 fallback 명령 실행
556
- - run: 'pnpm lint'
557
- onError:
558
- run: 'pnpm lint:fix'
559
-
560
- # 여러 단계로 이어지는 fallback 체인
561
- - run: 'step1'
562
- onError:
563
- run: 'step2'
564
- onError:
565
- run: 'step3'
566
-
567
- # 실패를 기록만 하고 워크플로우는 계속 진행
568
- - run: 'pnpm typecheck'
569
- continue: true
570
- onError:
571
- run: 'echo "Type check failed, but continuing..."'
572
-
573
- # 커스텀 쉘 사용 (스텝별)
574
- - run: 'echo $SHELL'
575
- shell:
576
- - zsh
577
- - -c
578
-
579
- # bash 로그인 쉘 사용
580
- - run: 'source ~/.bashrc && echo "프로필 로드됨"'
581
- shell:
582
- - bash
583
- - -lc
584
- ```
585
-
586
- **동작:**
587
- - 명령은 `baseDir` (지정된 경우) 또는 현재 작업 디렉토리에서 실행됩니다
588
- - 메인 `run` 명령의 성공/실패 여부가 이 스텝의 최종 결과를 결정합니다. `onError`는 단순히 실패 시 추가 작업(정리, 롤백 등)을 수행할 뿐이며, 스텝의 성공 여부를 변경하지 않습니다.
589
- - `continue` 플래그는 이 스텝 완료 후 워크플로우 실행을 제어합니다:
590
- - `continue: true` - 항상 다음 스텝으로 진행 (성공/실패 무관)
591
- - `continue: false` - 항상 워크플로우 중단 (성공/실패 무관)
592
- - `continue` 미설정 - 기본 동작: 성공 시 진행, 실패 시 중단
593
- - 출력은 CLI 포맷팅과 함께 실시간으로 표시됩니다
594
- - `timeout`이 지정되면 명령이 시간 제한을 초과하면 종료되고 단계가 실패합니다
595
- - `retry`가 지정되면 성공할때 까지 retry 값 만큼 재시도됩니다
596
-
597
- ---
598
-
599
- #### 2. `choose` - 사용자 선택
600
-
601
- 옵션 목록에서 사용자가 선택하도록 프롬프트를 표시합니다. 선택 메뉴에는 **실시간 검색 기능**이 포함되어 있어 타이핑으로 옵션을 필터링할 수 있습니다.
602
-
603
- **문법:**
604
- ```yaml
605
- steps:
606
- - choose:
607
- message: <string> # 필수: 표시할 질문
608
- options: # 필수: 옵션 배열
609
- - id: <string> # 필수: 고유 식별자 (값으로 저장됨)
610
- label: <string> # 필수: 표시 텍스트
611
- - id: <string>
612
- label: <string>
613
- as: <variable-name> # 선택: 결과를 저장할 변수 이름
614
- when: <condition> # 초이스 프롬프트 제공 조건
615
- ```
616
-
617
- **속성:**
618
- - `choose.message` (필수): `string` - 사용자에게 표시할 질문 텍스트
619
- - `choose.options` (필수): 다음을 가진 객체의 `array`:
620
- - `id` (필수): `string` - 고유 식별자 (이 값이 저장됨)
621
- - `label` (필수): `string` - 사용자에게 표시할 텍스트
622
- - `choose.as` (선택): `string` - 선택된 `id`를 저장할 변수 이름
623
- - 생략 시: choice는 `id`로 저장됩니다 (하위 호환성을 위해)
624
- - 제공 시: 선택된 `id`가 이 변수 이름으로 저장됩니다
625
- - `when` (선택): `Condition` - 조건이 충족될 때만 선택 프롬프트 표시
626
-
627
- **대화형 기능:**
628
- - **실시간 검색**: 타이핑하여 옵션을 즉시 필터링 - 매칭되는 옵션만 표시됩니다
629
- - **화살표 키 탐색**: ↑↓ 키를 사용하여 옵션 간 탐색
630
- - **Enter로 선택**: Enter를 눌러 선택 확인
631
- - **Backspace**: 검색어에서 문자 제거
632
- - **Escape**: 검색어를 지우고 모든 옵션 표시
633
-
634
- **예제:**
635
- ```yaml
636
- # 기본 선택
637
- - choose:
638
- message: "환경을 선택하세요:"
639
- options:
640
- - id: dev
641
- label: "개발"
642
- - id: staging
643
- label: "스테이징"
644
- - id: prod
645
- label: "프로덕션"
646
-
647
- # 변수 저장이 있는 선택
648
- - choose:
649
- message: "환경을 선택하세요:"
650
- options:
651
- - id: dev
652
- label: "개발"
653
- - id: prod
654
- label: "프로덕션"
655
- as: env # 선택된 id가 'env' 변수에 저장됨
656
-
657
- # 조건부 선택
658
- - when:
659
- file: ./package.json
660
- choose:
661
- message: "테스트를 실행하시겠습니까?"
662
- options:
663
- - id: yes
664
- label: "예"
665
- - id: no
666
- label: "아니오"
667
- as: runTests
668
- ```
669
-
670
- **저장:**
671
- - 선택된 옵션의 `id`는 다음으로 저장됩니다:
672
- 1. choice ( `hasChoice(id)`로 접근 가능)
673
- 2. `id` 이름을 가진 변수 (하위 호환성을 위해)
674
- 3. `as`가 제공된 경우: `as` 이름을 가진 변수로도 저장됨
675
-
676
- **조건에서 사용:**
677
- ```yaml
678
- # 'as: env'가 있는 choice 후
679
- - when:
680
- var: # 변수를 사용한다는 정의
681
- env: prod # 'env' 변수가 'prod'와 같은지 확인
682
- run: 'echo "프로덕션에 배포 중"'
683
- ```
684
-
685
- ---
686
-
687
- #### 3. `prompt` - 텍스트 입력
688
-
689
- 사용자에게 텍스트 입력을 요청합니다.
690
-
691
- **문법:**
692
- ```yaml
693
- - prompt:
694
- message: <string> # 필수: 표시할 질문
695
- as: <variable-name> # 필수: 결과를 저장할 변수 이름
696
- default: <string> # 선택: 기본값
697
- when: <condition> # 선택: 조건이 충족될 때만 프롬프트 표시
698
- ```
699
-
700
- **속성:**
701
- - `prompt.message` (필수): `string` - 사용자에게 표시할 질문 텍스트
702
- - `prompt.as` (필수): `string` - 입력 값을 저장할 변수 이름
703
- - `prompt.default` (선택): `string` - 사용자가 입력 없이 Enter를 누를 때의 기본값
704
- - `when` (선택): `Condition` - 조건이 충족될 때만 프롬프트 표시
705
-
706
- **예제:**
707
- ```yaml
708
- # 기본 프롬프트
709
- - prompt:
710
- message: "버전 번호를 입력하세요:"
711
- as: version
712
-
713
- # 기본값이 있는 프롬프트
714
- - prompt:
715
- message: "버전 번호를 입력하세요:"
716
- as: version
717
- default: "1.0.0"
718
-
719
- # 조건부 프롬프트
720
- - when:
721
- var:
722
- env: prod
723
- prompt:
724
- message: "프로덕션 배포 사유를 입력하세요:"
725
- as: deployReason
726
- ```
727
-
728
- **저장:**
729
- - 사용자 입력은 `as`에 지정된 이름의 변수로 저장됩니다
730
- - `{{variable}}` 문법으로 명령에서 사용할 수 있습니다
731
- - `var` 조건으로 조건에서 확인할 수 있습니다
732
-
733
- **사용:**
734
- ```yaml
735
- # 명령에서 사용
736
- - run: 'echo "Building version {{version}}"'
737
-
738
- # 조건에서 확인
739
- - when:
740
- var:
741
- version: "1.0.0"
742
- run: 'echo "안정 버전 배포 중"'
743
- ```
744
-
745
- ---
746
-
747
- #### 4. `parallel` - 병렬 실행
748
-
749
- 여러 단계를 동시에 실행합니다. `steps`와 마찬가지로 `parallel`은 내부에 step 배열을 가지며, 각 step은 `-`로 시작합니다. 이 step들이 모두 동시에 실행됩니다.
750
-
751
- **문법:**
752
- ```yaml
753
- - parallel:
754
- - <step1> # 각 step은 `-`로 시작하며, `steps`와 동일한 형식
755
- - <step2>
756
- - <step3>
757
- when?: <condition> # 선택: 조건이 충족될 때만 병렬 블록 실행
758
- ```
759
-
760
- **속성:**
761
- - `parallel` (필수): 단계들의 `array` - 병렬로 실행할 단계. **`run`, 중첩 `parallel`, `fail` 스텝만 허용됩니다.** `choose`와 `prompt`(사용자 입력 스텝)는 `parallel` **안에서 사용할 수 없습니다**—사용자 입력은 병렬로 실행되지 않습니다.
762
- - `when` (선택): `Condition` - 조건이 충족될 때만 병렬 블록 실행
763
-
764
- **제한:** `parallel` 내부의 스텝은 `run`, 중첩 `parallel`, `fail`만 사용할 수 있습니다. `parallel` 안에서 `choose`나 `prompt`를 사용하면 안 되며, 워크플로우 검증 시 에러가 발생합니다 (예: `'choose' step is not allowed inside 'parallel' block`).
765
-
766
- **예제:**
767
- ```yaml
768
- # 기본 병렬 실행
769
- # parallel 내부의 각 step은 `-`로 시작하며, `steps`와 동일한 형식
770
- - parallel:
771
- - run: 'npm run test:unit'
772
- - run: 'npm run test:integration'
773
- - run: 'npm run lint'
774
-
775
- # 조건이 있는 병렬
776
- # 각 step은 자신만의 `when` 조건을 가질 수 있습니다
777
- - parallel:
778
- - when:
779
- file: ./src
780
- run: 'echo "프론트엔드 빌드 중..."'
781
- - when:
782
- file: ./api
783
- run: 'echo "백엔드 빌드 중..."'
784
-
785
- # 조건부 병렬 블록
786
- # 전체 parallel 블록에 `when` 조건을 적용할 수 있습니다
787
- - when:
788
- var:
789
- env: staging
790
- parallel:
791
- - run: 'npm run test'
792
- - run: 'npm run lint'
793
-
794
- # 중첩 parallel (허용); parallel 내부에는 run / parallel / fail만 사용
795
- - parallel:
796
- - run: 'npm run test'
797
- - parallel:
798
- - run: 'npm run lint'
799
- - run: 'npm run typecheck'
800
- ```
801
-
802
- **동작:**
803
- - `parallel` 배열의 모든 단계가 동시에 실행을 시작합니다
804
- - 워크플로우는 모든 병렬 단계가 완료될 때까지 기다립니다
805
- - 어떤 단계라도 실패하면 워크플로우가 중지됩니다
806
- - 각 병렬 브랜치는 자체 격리된 워크스페이스 상태를 가집니다 (복제됨)
807
- - **`choose`와 `prompt`는 `parallel` 안에서 사용할 수 없습니다** (사용자 입력은 병렬로 실행되지 않음; `parallel` 블록 앞뒤의 순차 스텝에서만 사용하세요)
808
-
809
- ---
810
-
811
- #### 5. `fail` - 워크플로우 실패
812
-
813
- 오류 메시지와 함께 워크플로우를 중지합니다.
814
-
815
- **문법:**
816
- ```yaml
817
- - fail:
818
- message: <string>
819
- when?: <condition> # 선택: 조건이 충족될 때만 실패
820
- ```
821
-
822
- **속성:**
823
- - `fail.message` (필수): `string` - 표시할 오류 메시지
824
- - `when` (선택): `Condition` - 조건이 충족될 때만 실패
825
-
826
- **예제:**
827
- ```yaml
828
- # 파일이 없으면 실패
829
- - when:
830
- not:
831
- file: ./dist
832
- fail:
833
- message: "빌드 출력을 찾을 수 없습니다"
834
-
835
- # 변수 기반 실패
836
- - when:
837
- var:
838
- env: prod
839
- fail:
840
- message: "승인 없이는 프로덕션에 배포할 수 없습니다"
841
- ```
842
-
843
- **동작:**
844
- - 워크플로우 실행을 즉시 중지합니다
845
- - 오류 메시지를 표시합니다
846
- - 0이 아닌 상태 코드로 종료합니다
847
-
848
- ---
849
-
850
- ### 조건 (`when` 절)
851
-
852
- 조건은 단계가 실행되는 시점을 제어합니다. 모든 조건은 워크스페이스 상태에 대한 질문으로 평가됩니다.
853
-
854
- #### 조건 타입
855
-
856
- ##### 1. 파일 존재 (`file`)
857
-
858
- 파일 또는 디렉토리가 존재하는지 확인합니다.
859
-
860
- **문법:**
861
- ```yaml
862
- when:
863
- file: <path>
864
- ```
865
-
866
- **속성:**
867
- - `file`: `string` - 파일 또는 디렉토리 경로 (현재 작업 디렉토리 기준)
868
-
869
- **예제:**
870
- ```yaml
871
- - when:
872
- file: ./dist
873
- run: 'echo "빌드가 존재합니다"'
874
-
875
- - when:
876
- file: ./package.json
877
- run: 'npm install'
878
-
879
- - when:
880
- not:
881
- file: ./node_modules
882
- run: 'npm install'
883
- ```
884
-
885
- **동작:**
886
- - 경로는 `process.cwd()` (현재 작업 디렉토리) 기준으로 해석됩니다
887
- - 파일 또는 디렉토리가 존재하면 `true`, 그렇지 않으면 `false`를 반환합니다
888
-
889
- ---
890
-
891
- ##### 2. 변수 값 비교 (`var` 객체)
892
-
893
- 변수가 특정 값과 같은지 확인합니다.
894
-
895
- **문법:**
896
- ```yaml
897
- when:
898
- var:
899
- <variable-name>: <expected-value>
900
- ```
901
-
902
- **속성:**
903
- - `var`: `object` - 변수 이름을 키로, 예상 값을 값으로 가진 객체
904
- - 키: 변수 이름 (`prompt.as` 또는 `choose.as`에서)
905
- - 값: 비교할 예상 문자열 값
906
-
907
- **예제:**
908
- ```yaml
909
- # env 변수가 'prod'와 같은지 확인
910
- - when:
911
- var:
912
- env: prod
913
- run: 'echo "프로덕션에 배포 중"'
914
-
915
- # version이 특정 값과 같은지 확인
916
- - when:
917
- var:
918
- version: "1.0.0"
919
- run: 'echo "안정 버전 배포 중"'
920
-
921
- # 여러 변수 확인 (모두 일치해야 함)
922
- - when:
923
- var:
924
- env: staging
925
- version: "2.0.0"
926
- run: 'echo "스테이징에 v2.0.0 배포 중"'
927
- ```
928
-
929
- **동작:**
930
- - 변수 값(문자열)을 예상 값과 비교합니다
931
- - 값이 정확히 일치하면 `true`를 반환합니다 (대소문자 구분)
932
- - 변수가 존재하지 않거나 값이 일치하지 않으면 `false`를 반환합니다
933
- - 객체의 모든 키-값 쌍이 일치해야 합니다 (AND 논리)
934
-
935
- ---
936
-
937
- ##### 3. 변수 존재 (`var` 문자열)
938
-
939
- 변수가 존재하는지 확인합니다 (값과 무관하게).
940
-
941
- **문법:**
942
- ```yaml
943
- when:
944
- var: <variable-name>
945
- # 또는
946
- when:
947
- has: <variable-name> # var의 별칭
948
- ```
949
-
950
- **속성:**
951
- - `var` 또는 `has`: `string` - 확인할 변수 이름
952
-
953
- **예제:**
954
- ```yaml
955
- # 변수가 존재하는지 확인
956
- - when:
957
- var: version
958
- run: 'echo "Version: {{version}}"'
959
-
960
- # 'has' 별칭 사용
961
- - when:
962
- has: projectName
963
- run: 'echo "Project: {{projectName}}"'
964
- ```
965
-
966
- **동작:**
967
- - 변수가 존재하면 `true`를 반환합니다 (`prompt.as` 또는 `choose.as`에서)
968
- - 변수가 존재하지 않으면 `false`를 반환합니다
969
- - 값을 확인하지 않고 존재 여부만 확인합니다
970
-
971
- ---
972
-
973
- ##### 4. 결합된 조건
974
-
975
- `all`, `any`, `not`을 사용하여 여러 조건을 결합합니다.
976
-
977
- ###### `all` - AND 논리
978
-
979
- 모든 조건이 참이어야 합니다.
980
-
981
- **문법:**
982
- ```yaml
983
- when:
984
- all:
985
- - <condition1>
986
- - <condition2>
987
- - <condition3>
988
- ```
989
-
990
- **예제:**
991
- ```yaml
992
- - when:
993
- all:
994
- - file: ./dist
995
- - var:
996
- env: production
997
- run: 'echo "프로덕션 빌드 준비 완료"'
998
-
999
- - when:
1000
- all:
1001
- - var:
1002
- env: staging
1003
- - var:
1004
- version: "2.0.0"
1005
- - file: ./dist
1006
- run: 'echo "스테이징에 v2.0.0 배포 중"'
1007
- ```
1008
-
1009
- **동작:**
1010
- - 배열의 모든 조건이 `true`일 때만 `true`를 반환합니다
1011
- - 어떤 조건이라도 `false`이면 `false`를 반환합니다
1012
- - 단락 평가: 첫 번째 `false` 후 확인을 중지합니다
1013
-
1014
- ---
1015
-
1016
- ###### `any` - OR 논리
1017
-
1018
- 어떤 조건이라도 참일 수 있습니다.
1019
-
1020
- **문법:**
1021
- ```yaml
1022
- when:
1023
- any:
1024
- - <condition1>
1025
- - <condition2>
1026
- - <condition3>
1027
- ```
1028
-
1029
- **예제:**
1030
- ```yaml
1031
- - when:
1032
- any:
1033
- - var:
1034
- env: staging
1035
- - var:
1036
- env: production
1037
- run: 'echo "서버에 배포 중"'
1038
-
1039
- - when:
1040
- any:
1041
- - file: ./dist
1042
- - file: ./build
1043
- run: 'echo "빌드 출력을 찾았습니다"'
1044
- ```
1045
-
1046
- **동작:**
1047
- - 배열의 어떤 조건이라도 `true`이면 `true`를 반환합니다
1048
- - 모든 조건이 `false`일 때만 `false`를 반환합니다
1049
- - 단락 평가: 첫 번째 `true` 후 확인을 중지합니다
1050
-
1051
- ---
1052
-
1053
- ###### `not` - 부정
1054
-
1055
- 조건을 부정합니다.
1056
-
1057
- **문법:**
1058
- ```yaml
1059
- when:
1060
- not:
1061
- <condition>
1062
- ```
1063
-
1064
- **예제:**
1065
- ```yaml
1066
- # 파일이 없으면 실패
1067
- - when:
1068
- not:
1069
- file: ./dist
1070
- fail:
1071
- message: "빌드 출력을 찾을 수 없습니다"
1072
-
1073
- # 변수가 값과 같지 않으면 실행
1074
- - when:
1075
- not:
1076
- var:
1077
- env: prod
1078
- run: 'echo "프로덕션 환경이 아닙니다"'
1079
-
1080
- # 복잡한 부정
1081
- - when:
1082
- not:
1083
- all:
1084
- - file: ./dist
1085
- - var:
1086
- env: prod
1087
- run: 'echo "프로덕션 준비가 되지 않았습니다"'
1088
- ```
1089
-
1090
- **동작:**
1091
- - 내부 조건이 `false`이면 `true`를 반환합니다
1092
- - 내부 조건이 `true`이면 `false`를 반환합니다
1093
- - 모든 조건 타입을 부정할 수 있습니다
1094
-
1095
- ---
1096
-
1097
- ##### 5. 중첩된 조건
1098
-
1099
- 조건을 중첩하여 복잡한 논리를 만들 수 있습니다.
1100
-
1101
- **예제:**
1102
- ```yaml
1103
- # 복잡한 중첩 조건
1104
- - when:
1105
- all:
1106
- - file: ./dist
1107
- - any:
1108
- - var:
1109
- env: staging
1110
- - var:
1111
- env: production
1112
- - not:
1113
- var:
1114
- version: "0.0.0"
1115
- run: 'echo "배포 준비 완료"'
1116
-
1117
- # 여러 수준의 중첩
1118
- - when:
1119
- any:
1120
- - all:
1121
- - var:
1122
- env: prod
1123
- - file: ./dist
1124
- - all:
1125
- - var:
1126
- env: staging
1127
- - not:
1128
- file: ./test-results
1129
- run: 'echo "조건부 배포"'
1130
- ```
1131
-
1132
- ---
1133
-
1134
- ### 변수 치환
1135
-
1136
- 변수는 `{{variable}}` 문법을 사용하여 명령에서 사용할 수 있습니다. 선택적으로 공백을 사용할 수 있습니다: `{{var}}`, `{{ var }}`, `{{ var }}` 모두 작동합니다.
1137
-
1138
- **문법:**
1139
- ```yaml
1140
- run: 'echo "{{variableName}}"'
1141
- # 또는 선택적으로 공백 사용
1142
- run: 'echo "{{ variableName }}"'
1143
- ```
1144
-
1145
- **⚠️ 중요: YAML 문법 규칙**
1146
-
1147
- 명령어에서 `{{variable}}`을 사용할 때, 파싱 오류를 방지하기 위해 다음 규칙을 따르세요:
1148
-
1149
- ✅ **안전한 패턴:**
1150
- ```yaml
1151
- # 작은따옴표로 감싸기 (권장)
1152
- - run: 'echo "Building {{version}}..."'
1153
- - run: 'npm run build --version={{version}}'
1154
-
1155
- # 전체 명령어를 작은따옴표로 감싸기
1156
- - run: 'echo "Selected: {{mode}}"'
1157
- ```
1158
-
1159
- ❌ **문제가 되는 패턴:**
1160
- ```yaml
1161
- # 금지: 따옴표 + 변수 앞 콜론
1162
- - run: echo "mode: {{mode}}" # ❌ YAML 파싱 에러!
1163
-
1164
- # 해결: 전체 명령어를 작은따옴표로 감싸기
1165
- - run: 'echo "mode: {{mode}}"' # ✅ 정상 작동
1166
- ```
1167
-
1168
- **예제:**
1169
- ```yaml
1170
- # 프롬프트 변수 사용
1171
- - prompt:
1172
- message: "프로젝트 이름을 입력하세요:"
1173
- as: projectName
1174
- - run: 'echo "Building {{projectName}}..."'
1175
-
1176
- # 선택 변수 사용
1177
- - choose:
1178
- message: "환경을 선택하세요:"
1179
- options:
1180
- - id: dev
1181
- label: "개발"
1182
- as: env
1183
- - run: 'echo "Deploying to {{env}}"'
1184
-
1185
- # 여러 변수
1186
- - run: 'echo "Building {{projectName}} version {{version}} for {{env}}"'
1187
- ```
1188
-
1189
- **동작:**
1190
- - 변수는 문자열 값으로 대체됩니다
1191
- - 변수가 존재하지 않으면 빈 문자열로 대체됩니다
1192
- - 변수는 실행 시점에 해석됩니다
1193
-
1194
- ---
1195
-
1196
- ### 완전한 예제
1197
-
1198
- 모든 기능을 보여주는 완전한 예제입니다:
1199
-
1200
- ```yaml
1201
- name: Complete Workflow Example
1202
- baseDir: ./
1203
-
1204
- steps:
1205
- # 1. 간단한 명령
1206
- - run: 'echo "워크플로우 시작 중..."'
1207
-
1208
- # 2. 변수 저장이 있는 사용자 선택
1209
- - choose:
1210
- message: "배포 환경을 선택하세요:"
1211
- options:
1212
- - id: dev
1213
- label: "개발"
1214
- - id: staging
1215
- label: "스테이징"
1216
- - id: prod
1217
- label: "프로덕션"
1218
- as: env
1219
-
1220
- # 3. 변수 값 기반 조건부 단계
1221
- - when:
1222
- var:
1223
- env: prod
1224
- prompt:
1225
- message: "프로덕션 배포 사유를 입력하세요:"
1226
- as: deployReason
1227
-
1228
- # 4. 변수 값 비교
1229
- - when:
1230
- var:
1231
- env: dev
1232
- run: 'echo "개발 환경에 배포 중..."'
1233
-
1234
- - when:
1235
- var:
1236
- env: staging
1237
- run: 'echo "스테이징에 배포 중..."'
1238
-
1239
- # 5. 복잡한 조건 (all)
1240
- - when:
1241
- all:
1242
- - var:
1243
- env: prod
1244
- - var: deployReason
1245
- - file: ./dist
1246
- run: 'echo "프로덕션 배포 승인됨"'
1247
-
1248
- # 6. 병렬 실행
1249
- - parallel:
1250
- - run: 'npm run test:unit'
1251
- - run: 'npm run test:integration'
1252
- - run: 'npm run lint'
1253
-
1254
- # 6.5. 스텝별 쉘 오버라이드
1255
- - run: 'echo "zsh로 실행"'
1256
- shell: [zsh, -c] # 이 스텝만 워크플로우 쉘 오버라이드
1257
-
1258
- # 7. 파일 존재 확인
1259
- - when:
1260
- file: ./test-results
1261
- run: 'echo "테스트 완료"'
1262
-
1263
- # 8. 결합된 조건 (any)
1264
- - when:
1265
- any:
1266
- - var:
1267
- env: staging
1268
- - var:
1269
- env: prod
1270
- run: 'echo "서버에 배포 중..."'
1271
-
1272
- # 9. 부정
1273
- - when:
1274
- not:
1275
- file: ./dist
1276
- fail:
1277
- message: "빌드 출력을 찾을 수 없습니다"
1278
-
1279
- # 10. 변수 치환
1280
- - run: 'echo "Deploying {{projectName}} version {{version}} to {{env}}"'
1281
- ```
1282
-
1283
- ---
1284
-
1285
- ## 📜 실행 히스토리 관리
1286
-
1287
- task-pipeliner는 워크플로우 실행 히스토리를 자동으로 기록하여 과거 실행 내역을 검토하고, 문제를 디버깅하며, 성능을 추적할 수 있게 해줍니다.
1288
-
1289
- ### 히스토리 보기
1290
-
1291
- 모든 워크플로우 실행은 타임스탬프가 포함된 파일명으로 `~/.pipeliner/workflow-history/`에 자동으로 저장됩니다.
1292
-
1293
- **인터랙티브 메뉴:**
1294
- ```bash
1295
- tp history
1296
- ```
1297
-
1298
- 이 명령은 다음 옵션을 제공하는 인터랙티브 메뉴를 엽니다:
1299
- - **Show** - 히스토리를 선택하여 보기
1300
- - **Remove** - 특정 히스토리 파일 삭제
1301
- - **Remove All** - 모든 히스토리 파일 삭제
1302
-
1303
- **특정 히스토리 보기:**
1304
- ```bash
1305
- tp history show
1306
- ```
1307
-
1308
- 이 명령은:
1309
- 1. 사용 가능한 모든 히스토리 파일을 나열합니다
1310
- 2. 하나를 선택하여 볼 수 있게 합니다
1311
- 3. 다음을 포함한 상세한 실행 정보를 표시합니다:
1312
- - 실행 타임스탬프
1313
- - 총 실행 시간
1314
- - 단계별 결과 (성공/실패)
1315
- - 명령 출력 (stdout/stderr)
1316
- - 각 단계의 실행 시간
1317
-
1318
- **출력 예시:**
1319
- ```
1320
- ┌─────────────────────────────────────────┐
1321
- │ Workflow Execution History │
1322
- │ │
1323
- │ File: workflow-2026-01-26_21-51-17... │
1324
- │ Started: 2026-01-26 21:51:17 │
1325
- │ Total Duration: 5.23s │
1326
- │ Total Steps: 3 │
1327
- │ ✓ Successful: 2 │
1328
- │ ✗ Failed: 1 │
1329
- └─────────────────────────────────────────┘
1330
-
1331
- ┌─────────────────────────────────────────┐
1332
- │ ✓ Step 1/3 - Run │
1333
- │ Duration: 1.23s | Status: Success │
1334
- │ │
1335
- │ Command: npm install │
1336
- └─────────────────────────────────────────┘
1337
- ```
1338
-
1339
- ### 히스토리 삭제
1340
-
1341
- **특정 히스토리 삭제:**
1342
- ```bash
1343
- tp history remove
1344
- ```
1345
-
1346
- 삭제할 히스토리 파일을 선택하는 인터랙티브 메뉴를 엽니다.
1347
-
1348
- **모든 히스토리 삭제:**
1349
- ```bash
1350
- tp history remove-all
1351
- ```
1352
-
1353
- 저장된 모든 워크플로우 실행 히스토리를 삭제합니다. `-y` 플래그를 사용하지 않으면 확인 프롬프트가 표시됩니다:
1354
-
1355
- ```bash
1356
- tp history remove-all -y # 확인 건너뛰기
1357
- ```
1358
-
1359
- ### 히스토리 파일 형식
1360
-
1361
- 히스토리 파일은 `~/.pipeliner/workflow-history/`에 다음 구조로 JSON 형식으로 저장됩니다:
1362
-
1363
- ```json
1364
- {
1365
- "initialTimestamp": 1706281877000,
1366
- "records": [
1367
- {
1368
- "step": { "run": "npm install" },
1369
- "output": {
1370
- "success": true,
1371
- "stdout": ["...", "..."],
1372
- "stderr": []
1373
- },
1374
- "duration": 1234,
1375
- "status": "success"
1376
- }
1377
- ]
1378
- }
1379
- ```
1380
-
1381
- 각 레코드는 다음을 포함합니다:
1382
- - **step**: 실행된 단계 정의
1383
- - **output**: 명령 출력 (stdout/stderr) 및 성공 상태
1384
- - **duration**: 밀리초 단위의 실행 시간
1385
- - **status**: `"success"` 또는 `"failure"`
1386
-
1387
- ---
1388
-
1389
- ## ⏰ 워크플로우 스케줄링
1390
-
1391
- cron 표현식을 사용하여 지정된 시간에 워크플로우를 자동으로 실행하도록 예약할 수 있습니다.
1392
-
1393
- ### 스케줄 추가
1394
-
1395
- 스케줄을 정의하는 스케줄 파일(YAML 또는 JSON)을 생성하세요:
1396
-
1397
- **YAML (`schedules.yaml`):**
1398
- ```yaml
1399
- schedules:
1400
- - name: Daily Build # 스케줄 별칭 (구분용)
1401
- cron: "0 9 * * *" # Cron 표현식
1402
- workflow: ./build.yaml # 스케줄 파일 기준 상대 경로
1403
-
1404
- - name: Nightly Test
1405
- cron: "0 2 * * *"
1406
- workflow: ./test.yaml
1407
- silent: true # 선택사항: 무음 모드로 실행
1408
-
1409
- - name: Production Deploy
1410
- cron: "0 18 * * 5" # 매주 금요일 오후 6시
1411
- workflow: ./deploy.yaml
1412
- profile: Production # 선택사항: 특정 프로필 사용
1413
-
1414
- - name: Hourly Check
1415
- cron: "0 * * * *"
1416
- workflow: simple.yaml
1417
- baseDir: /path/to/workflows # 선택사항: 워크플로우 경로의 기준 디렉토리
1418
-
1419
- - name: Daily UTC
1420
- cron: "0 9 * * *"
1421
- workflow: ./daily.yaml
1422
- timezone: 0 # 선택사항: UTC 오프셋(시간). +9, -5, 0. 생략 시 시스템 로컬
1423
- ```
1424
-
1425
- **필드 설명:**
1426
- - `name`: 스케줄을 구분하기 위한 별칭
1427
- - `cron`: 실행 시간 (cron 표현식)
1428
- - `workflow`: 워크플로우 파일 경로 (스케줄 파일 또는 `baseDir` 기준 상대 경로, 또는 절대 경로)
1429
- - `baseDir`: (선택사항) 워크플로우 경로의 기준 디렉토리 (기본값: 스케줄 파일 디렉토리)
1430
- - `timezone`: (선택사항) UTC 오프셋(시간). 숫자 또는 문자열 (예: `+9`, `-5`, `0`). 생략 시 시스템 로컬
1431
- - `silent`: (선택사항) 무음 모드로 실행 (콘솔 출력 억제)
1432
- - `profile`: (선택사항) 사용할 프로필 이름 (프로필이 있는 워크플로우용)
1433
-
1434
- **경로 해석 방식:**
1435
- 기본적으로 상대 워크플로우 경로는 스케줄 파일의 디렉토리를 기준으로 해석됩니다. 즉, 스케줄 파일과 워크플로우가 같은 폴더에 있으면 `./workflow.yaml`만 쓰면 됩니다. 다른 기준 디렉토리가 필요하면 `baseDir`을 사용하세요.
1436
-
1437
- **JSON (`schedules.json`):**
1438
- ```json
1439
- {
1440
- "schedules": [
1441
- {
1442
- "name": "Daily Build",
1443
- "cron": "0 9 * * *",
1444
- "workflow": "./build.yaml"
1445
- },
1446
- {
1447
- "name": "Nightly Test",
1448
- "cron": "0 2 * * *",
1449
- "workflow": "./test.yaml",
1450
- "silent": true
1451
- },
1452
- {
1453
- "name": "Production Deploy",
1454
- "cron": "0 18 * * 5",
1455
- "workflow": "./deploy.yaml",
1456
- "profile": "Production"
1457
- }
1458
- ]
1459
- }
1460
- ```
1461
-
1462
- 파일에서 모든 스케줄을 추가:
1463
-
1464
- ```bash
1465
- tp schedule add schedules.yaml
1466
- # 또는 경로 없이: 가장 가까운 tp/schedules/에서 파일 선택
1467
- tp schedule add
1468
- ```
1469
-
1470
- 각 스케줄에 대해 별칭을 확인하거나 변경할 수 있습니다. 추가 후에는 추가된 스케줄이 `tp schedule list`와 같은 카드 형식(크론, 언제 실행되는지 설명, 다음 실행, 활성 여부)으로 표시됩니다.
1471
-
1472
- **Cron 표현식 형식:**
1473
-
1474
- 5자리(표준) 또는 **6자리(초 포함, node-cron 확장)** 지원:
1475
-
1476
- ```
1477
- # 6자리 (초 선택사항)
1478
- # ┌────────────── 초 (0-59, 선택)
1479
- # │ ┌──────────── 분 (0-59)
1480
- # │ │ ┌────────── 시 (0-23)
1481
- # │ │ │ ┌──────── 일 (1-31)
1482
- # │ │ │ │ ┌────── 월 (1-12)
1483
- # │ │ │ │ │ ┌──── 요일 (0-7)
1484
- # │ │ │ │ │ │
1485
- # * * * * * *
1486
- ```
1487
-
1488
- **일반적인 예시 (5자리):**
1489
- - `0 9 * * *` - 매일 오전 9시
1490
- - `0 0 * * 1` - 매주 월요일 자정
1491
- - `*/15 * * * *` - 15분마다
1492
- - `0 */2 * * *` - 2시간마다
1493
-
1494
- **초 포함 (6자리):**
1495
- - `* * * * * *` - 매초
1496
- - `*/5 * * * * *` - 5초마다
1497
- - `0 * * * * *` - 매분 (5자리 `* * * * *`와 동일)
1498
- - `0 9 * * 1-5` - 평일 오전 9시
1499
-
1500
- ### 스케줄 관리
1501
-
1502
- ```bash
1503
- # 모든 스케줄 목록 보기 (카드 레이아웃: cron, "언제" 설명, 다음 실행 등)
1504
- tp schedule list
1505
-
1506
- # 스케줄 삭제 (삭제 후 삭제된 스케줄을 동일한 카드 형식으로 표시)
1507
- tp schedule remove
1508
-
1509
- # 모든 스케줄 삭제
1510
- tp schedule remove-all
1511
-
1512
- # 스케줄 활성화/비활성화 (토글 후 ENABLED/DISABLED를 굵게·색상으로 강조하고 스케줄 카드 표시)
1513
- tp schedule toggle
1514
- ```
1515
-
1516
- **통일된 스케줄 UI:** list, add, toggle, remove 모두 동일한 스케줄 카드 레이아웃을 사용합니다. 각 카드에는 크론 표현식, 언제 실행되는지 사람이 읽기 쉬운 설명(예: "매분"), 타임존, 워크플로우 경로, 프로필(설정 시), 마지막 실행, 다음 실행이 표시됩니다. `tp schedule toggle` 후에는 새 상태(ENABLED는 초록, DISABLED는 회색)가 강조되어 한눈에 구분할 수 있습니다.
1517
-
1518
- ### 스케줄러 실행
1519
-
1520
- 예약된 시간에 워크플로우를 실행하려면 스케줄러를 시작하세요. 두 가지 모드로 실행할 수 있습니다:
1521
-
1522
- **포그라운드 모드:**
1523
- ```bash
1524
- tp schedule start
1525
- ```
1526
- - 포그라운드에서 실행됩니다 (터미널에 연결됨)
1527
- - `Ctrl+C`를 눌러 스케줄러를 중지합니다
1528
- - 테스트나 임시 스케줄링에 유용합니다
1529
-
1530
- **데몬 모드 (백그라운드):**
1531
- ```bash
1532
- tp schedule start -d
1533
- ```
1534
- - 백그라운드 데몬 프로세스로 실행됩니다
1535
- - 터미널을 닫아도 계속 실행됩니다
1536
- - 한 번에 하나의 데몬 인스턴스만 실행 가능합니다 (중복 실행 방지)
1537
- - `tp schedule stop`으로 데몬을 종료합니다
1538
-
1539
- **데몬 상태 확인:**
1540
- ```bash
1541
- tp schedule status # 실시간 보기 (1초마다 갱신); Ctrl+C는 화면만 종료, 데몬은 유지
1542
- tp schedule status -n # 한 번만 표시 후 종료 (갱신 없음)
1543
- ```
1544
- - 데몬·스케줄 상태를 `tp schedule list`, `tp schedule start`와 동일한 카드 레이아웃으로 표시
1545
- - 표시 내용: 데몬 상태(active/inactive), PID, 시작 시각·업타임, 각 스케줄의 Enabled/Cron/Timezone/Workflow/Profile/Last run/Next run
1546
- - `Ctrl+C`로 상태 화면만 종료 (데몬은 `tp schedule start -d`로 띄웠다면 계속 실행됨)
1547
-
1548
- 스케줄러는:
1549
- - 예약된 시간에 워크플로우를 실행합니다
1550
- - 모든 실행을 `~/.pipeliner/workflow-history/`에 기록합니다
1551
- - 중복 데몬 인스턴스 실행을 방지합니다 (한 번에 하나만 실행 가능)
1552
-
1553
- ### 스케줄 저장
1554
-
1555
- 스케줄은 `~/.pipeliner/schedules/schedules.json`에 저장됩니다. 각 스케줄은 다음을 포함합니다:
1556
- - 고유 ID
1557
- - 워크플로우 경로
1558
- - Cron 표현식
1559
- - 활성화/비활성화 상태
1560
- - 마지막 실행 시간
1561
-
1562
- 예약된 모든 워크플로우 실행은 수동 실행과 동일한 히스토리 디렉토리(`~/.pipeliner/workflow-history/`)에 기록되므로, `tp history`를 사용하여 검토할 수 있습니다.
1563
-
1564
- ---
1565
-
1566
- ## 📚 예제
1567
-
1568
- ### 프로젝트 예제
1569
-
1570
- 완전한 프로젝트 예제는 `examples/` 디렉토리를 확인하세요:
1571
-
1572
- - **`tp setup`** – 프로젝트 루트에서 `tp setup`을 실행하면 `tp/workflows/`, `tp/schedules/`와 예시 워크플로우 2개(choose, when, profiles, prompt), 예시 스케줄 파일 2개(프로필 사용 포함)가 생성됩니다. 모든 단계는 `echo`로 되어 있어 안전하게 실행한 뒤 실제 명령으로 바꿀 수 있습니다.
1573
- - **`monorepo-example/`** - 여러 프로젝트가 있는 모노레포 워크플로우
1574
- - **`simple-project/`** - 간단한 단일 프로젝트 워크플로우
1575
- - **`react-app/`** - React 애플리케이션 빌드 및 배포
1576
-
1577
- ### YAML 예제
1578
-
1579
- `examples/yaml-examples/`에서 YAML 워크플로우 예제를 확인하세요:
1580
-
1581
- - **`basic.yaml`** - 선택과 조건이 있는 기본 워크플로우
1582
- - **`simple.yaml`** - 최소한의 워크플로우 예제
1583
- - **`parallel.yaml`** - 병렬 실행 예제
1584
- - **`conditions.yaml`** - 다양한 조건 타입
1585
- - **`file-checks.yaml`** - 파일 존재 확인
1586
- - **`prompt.yaml`** - 사용자 입력 프롬프트
1587
- - **`variables.yaml`** - 변수 치환 예제
1588
- - **`profiles-example.yaml`** - 비대화형 실행용 프로필 (`tp run --profile <name>`)
1589
-
1590
- ### JSON 예제
1591
-
1592
- `examples/json-examples/`에서 JSON 워크플로우 예제를 확인하세요 (YAML 예제와 동일):
1593
-
1594
- - **`basic.json`** - 선택과 조건이 있는 기본 워크플로우
1595
- - **`simple.json`** - 최소한의 워크플로우 예제
1596
- - **`parallel.json`** - 병렬 실행 예제
1597
- - **`conditions.json`** - 조건 평가 예제
1598
- - **`prompt.json`** - 사용자 입력 프롬프트
1599
- - **`variables.json`** - 변수 치환 예제
1600
- - **`profiles-example.json`** - 비대화형 실행용 프로필 (`tp run --profile <name>`)
1601
-
1602
- **참고:** YAML과 JSON 형식 모두 완전히 지원됩니다. 선호하는 형식을 선택하세요 - 가독성을 위해 YAML, 프로그래밍 방식 생성을 위해 JSON.
1603
- - **`variables.yaml`** - 변수 사용 예제
1604
- - **`prompt.yaml`** - 텍스트 프롬프트 예제
1605
- - **`var-value-example.yaml`** - 변수 값 비교 예제
1606
- - **`choice-as-example.yaml`** - 선택에서 `as` 키워드 사용
1607
- - **`base-dir-example.yaml`** - baseDir 설정 예제
1608
- - **`timeout-retry-example.yaml`** - 타임아웃 및 재시도 기능
1609
- - **`cicd.yaml`** - CI/CD 파이프라인 예제
1610
- - **`advanced.yaml`** - 고급 워크플로우 패턴
1611
- - **`multi-choice.yaml`** - 여러 순차적 선택
1612
- - **`react.yaml`** - React 전용 워크플로우
1613
-
1614
- ## 아키텍처
1615
-
1616
- - **CLI**: Commander.js를 사용한 Node.js + TypeScript
1617
- - **작업 실행**: 스트리밍 출력이 있는 Node.js 자식 프로세스
1618
- - **UI**: 아름다운 터미널 출력을 위한 Boxen과 Chalk
1619
- - **프롬프트**: 대화형 프롬프트를 위한 Inquirer.js
359
+ ## 📚 더 알아보기
360
+
361
+ README는 기본적인 사용법만 다룹니다. 더 자세한 내용은 다음 문서를 참조하세요:
362
+
363
+ - **[시작하기](https://task-pipeliner.racgoo.com/docs/getting-started)** - 설치부터 워크플로우까지
364
+ - **[DSL 참조](https://task-pipeliner.racgoo.com/docs/dsl-reference/workflow-structure)** - 완전한 문법 가이드
365
+ - [워크플로우 구조](https://task-pipeliner.racgoo.com/docs/dsl-reference/workflow-structure)
366
+ - [단계 타입](https://task-pipeliner.racgoo.com/docs/dsl-reference/step-types)
367
+ - [조건](https://task-pipeliner.racgoo.com/docs/dsl-reference/conditions)
368
+ - [변수](https://task-pipeliner.racgoo.com/docs/dsl-reference/variables)
369
+ - [프로필](https://task-pipeliner.racgoo.com/docs/dsl-reference/profiles)
370
+ - **[CLI 참조](https://task-pipeliner.racgoo.com/docs/cli-reference)** - 모든 CLI 명령어 상세 설명
371
+ - **[예제](https://task-pipeliner.racgoo.com/docs/examples)** - 실제 사용 사례와 예제
372
+ - **[실행 히스토리](https://task-pipeliner.racgoo.com/docs/history)** - 과거 실행 기록 관리
373
+ - **[워크플로우 스케줄링](https://task-pipeliner.racgoo.com/docs/schedule)** - cron을 사용한 자동 실행
1620
374
 
1621
375
  ## 기여하기
1622
376