# eCL 설정 레퍼런스

> 전체 설정 스키마, 워크플로우 토글, 모델 프로필, git 브랜칭 옵션입니다. 기능에 대한 맥락은 [Feature Reference](FEATURES.md)를 참조하세요.

---

## 설정 파일

eCL는 프로젝트 설정을 `.planning/config.json`에 저장합니다. `/ecl-new-project` 실행 시 생성되며 `/ecl-settings`를 통해 업데이트할 수 있습니다.

### 전체 스키마

```json
{
  "mode": "interactive",
  "granularity": "standard",
  "model_profile": "balanced",
  "model_overrides": {},
  "planning": {
    "commit_docs": true,
    "search_gitignored": false
  },
  "workflow": {
    "research": true,
    "plan_check": true,
    "verifier": true,
    "auto_advance": false,
    "nyquist_validation": true,
    "ui_phase": true,
    "ui_safety_gate": true,
    "node_repair": true,
    "node_repair_budget": 2,
    "research_before_questions": false,
    "discuss_mode": "discuss",
    "skip_discuss": false,
    "text_mode": false,
    "use_worktrees": true
  },
  "hooks": {
    "context_warnings": true,
    "workflow_guard": false
  },
  "parallelization": {
    "enabled": true,
    "plan_level": true,
    "task_level": false,
    "skip_checkpoints": true,
    "max_concurrent_agents": 3,
    "min_plans_for_parallel": 2
  },
  "git": {
    "branching_strategy": "none",
    "phase_branch_template": "ecl/phase-{phase}-{slug}",
    "milestone_branch_template": "ecl/{milestone}-{slug}",
    "quick_branch_template": null
  },
  "gates": {
    "confirm_project": true,
    "confirm_phases": true,
    "confirm_roadmap": true,
    "confirm_breakdown": true,
    "confirm_plan": true,
    "execute_next_plan": true,
    "issues_review": true,
    "confirm_transition": true
  },
  "safety": {
    "always_confirm_destructive": true,
    "always_confirm_external_services": true
  }
}
```

---

## 핵심 설정

| 설정 | 타입 | 옵션 | 기본값 | 설명 |
|------|------|------|--------|------|
| `mode` | enum | `interactive`, `yolo` | `interactive` | `yolo`는 결정을 자동 승인하고 `interactive`는 각 단계에서 확인을 요청합니다. |
| `granularity` | enum | `coarse`, `standard`, `fine` | `standard` | 단계 수를 조절합니다. `coarse` (3~5), `standard` (5~8), `fine` (8~12) |
| `model_profile` | enum | `quality`, `balanced`, `budget`, `inherit` | `balanced` | 각 에이전트의 모델 티어입니다. ([Model Profiles](#model-profiles) 참조) |

> **참고:** `granularity`는 v1.22.3에서 `depth`에서 이름이 변경되었습니다. 기존 설정은 자동으로 마이그레이션됩니다.

---

## 워크플로우 토글

모든 워크플로우 토글은 **키가 없으면 활성화** 패턴을 따릅니다. 설정에서 키가 없으면 기본값은 `true`입니다.

| 설정 | 타입 | 기본값 | 설명 |
|------|------|--------|------|
| `workflow.research` | boolean | `true` | 각 단계 플래닝 전 도메인 조사 |
| `workflow.plan_check` | boolean | `true` | 플랜 검증 루프 (최대 3회 반복) |
| `workflow.verifier` | boolean | `true` | 실행 후 단계 목표 대비 검증 |
| `workflow.auto_advance` | boolean | `false` | discuss → plan → execute를 중단 없이 자동으로 연결 |
| `workflow.nyquist_validation` | boolean | `true` | plan 단계 리서치 중 테스트 커버리지 매핑 |
| `workflow.ui_phase` | boolean | `true` | 프론트엔드 단계를 위한 UI 디자인 계약서 생성 |
| `workflow.ui_safety_gate` | boolean | `true` | plan 단계에서 프론트엔드 단계에 대해 /ecl-ui-phase 실행 여부 확인 |
| `workflow.node_repair` | boolean | `true` | 검증 실패 시 자율적 태스크 복구 |
| `workflow.node_repair_budget` | number | `2` | 실패한 태스크당 최대 복구 시도 횟수 |
| `workflow.research_before_questions` | boolean | `false` | 토론 질문 후가 아닌 전에 리서치 실행 |
| `workflow.use_worktrees` | boolean | `true` | `false`이면 git worktree 격리 비활성화 (v1.31) |
| `workflow.discuss_mode` | string | `'discuss'` | `/ecl-discuss-phase`의 컨텍스트 수집 방식을 제어합니다. `'discuss'` (기본값)는 질문을 하나씩 합니다. `'assumptions'`는 코드베이스를 먼저 읽고 신뢰도 수준이 있는 구조화된 가정을 생성하여 틀린 부분만 수정하도록 요청합니다. v1.28에서 추가 |
| `workflow.skip_discuss` | boolean | `false` | `true`로 설정하면 `/ecl-autonomous`가 discuss 단계를 완전히 건너뛰고 ROADMAP 단계 목표로부터 최소한의 CONTEXT.md를 작성합니다. 개발자 선호사항이 PROJECT.md/REQUIREMENTS.md에 모두 캡처된 프로젝트에 유용합니다. v1.28에서 추가 |
| `workflow.text_mode` | boolean | `false` | AskUserQuestion TUI 메뉴를 일반 텍스트 번호 목록으로 대체합니다. TUI 메뉴가 렌더링되지 않는 Claude Code 원격 세션 (`/rc` 모드)에 필요합니다. discuss 단계에서 `--text` 플래그로 세션별 설정도 가능합니다. v1.28에서 추가 |

### 권장 프리셋

| 시나리오 | mode | granularity | profile | research | plan_check | verifier |
|---------|------|-------------|---------|----------|------------|----------|
| 프로토타이핑 | `yolo` | `coarse` | `budget` | `false` | `false` | `false` |
| 일반 개발 | `interactive` | `standard` | `balanced` | `true` | `true` | `true` |
| 프로덕션 릴리스 | `interactive` | `fine` | `quality` | `true` | `true` | `true` |

---

## 플래닝 설정

| 설정 | 타입 | 기본값 | 설명 |
|------|------|--------|------|
| `planning.commit_docs` | boolean | `true` | `.planning/` 파일을 git에 커밋할지 여부 |
| `planning.search_gitignored` | boolean | `false` | 광범위한 검색에 `--no-ignore`를 추가하여 `.planning/`을 포함 |

### 자동 감지

`.planning/`이 `.gitignore`에 포함되어 있으면 config.json 설정과 무관하게 `commit_docs`가 자동으로 `false`로 설정됩니다. 이는 git 오류를 방지합니다.

---

## 훅 설정

| 설정 | 타입 | 기본값 | 설명 |
|------|------|--------|------|
| `hooks.context_warnings` | boolean | `true` | context monitor 훅을 통해 컨텍스트 윈도우 사용 경고 표시 |
| `hooks.workflow_guard` | boolean | `false` | eCL 워크플로우 컨텍스트 밖에서 파일 편집이 발생할 때 경고 ((`/ecl-quick` 또는 `/ecl-fast` 사용 권고)) |

프롬프트 주입 방지 훅 (`ecl-prompt-guard.js`)은 항상 활성화되며 비활성화할 수 없습니다. 워크플로우 토글이 아닌 보안 기능입니다.

### 플래닝 비공개 설정

플래닝 아티팩트를 git에서 제외하려면 다음과 같이 설정합니다.

1. `planning.commit_docs: false` 및 `planning.search_gitignored: true` 설정
2. `.planning/`을 `.gitignore`에 추가
3. 이미 추적 중인 경우: `git rm -r --cached .planning/ && git commit -m "chore: stop tracking planning docs"`

---

## 병렬화 설정

| 설정 | 타입 | 기본값 | 설명 |
|------|------|--------|------|
| `parallelization.enabled` | boolean | `true` | 독립적인 플랜을 동시에 실행 |
| `parallelization.plan_level` | boolean | `true` | 플랜 수준에서 병렬화 |
| `parallelization.task_level` | boolean | `false` | 플랜 내 태스크를 병렬화 |
| `parallelization.skip_checkpoints` | boolean | `true` | 병렬 실행 중 체크포인트 건너뜀 |
| `parallelization.max_concurrent_agents` | number | `3` | 동시 실행 가능한 최대 에이전트 수 |
| `parallelization.min_plans_for_parallel` | number | `2` | 병렬 실행을 시작하기 위한 최소 플랜 수 |

> **Pre-commit 훅과 병렬 실행:** 병렬화가 활성화되면 executor 에이전트는 빌드 잠금 경합(예: Rust 프로젝트의 cargo lock 충돌)을 피하기 위해 `--no-verify`로 커밋합니다. 오케스트레이터는 각 wave가 완료된 후 훅을 한 번 검증합니다. STATE.md 쓰기는 동시 쓰기 충돌을 방지하기 위해 파일 수준 잠금으로 보호됩니다. 커밋마다 훅을 실행해야 한다면 `parallelization.enabled: false`로 설정하세요.

---

## Git 브랜칭

| 설정 | 타입 | 기본값 | 설명 |
|------|------|--------|------|
| `git.branching_strategy` | enum | `none` | `none`, `phase`, 또는 `milestone` |
| `git.phase_branch_template` | string | `ecl/phase-{phase}-{slug}` | phase 전략의 브랜치 이름 템플릿 |
| `git.milestone_branch_template` | string | `ecl/{milestone}-{slug}` | milestone 전략의 브랜치 이름 템플릿 |
| `git.quick_branch_template` | string 또는 null | `null` | `/ecl-quick` 태스크를 위한 선택적 브랜치 이름 템플릿 |

### 전략 비교

| 전략 | 브랜치 생성 | 범위 | 병합 시점 | 적합한 경우 |
|------|------------|------|----------|------------|
| `none` | 없음 | 해당 없음 | 해당 없음 | 개인 개발, 단순 프로젝트 |
| `phase` | `execute-phase` 시작 시 | 단일 단계 | 단계 완료 후 사용자가 병합 | 단계별 코드 리뷰, 세밀한 롤백 |
| `milestone` | 첫 번째 `execute-phase` 시 | milestone 내 모든 단계 | `complete-milestone` 시 | 릴리스 브랜치, 버전별 PR |

### 템플릿 변수

| 변수 | 사용 가능한 템플릿 | 예시 |
|------|------------------|------|
| `{phase}` | `phase_branch_template` | `03` (0 패딩) |
| `{slug}` | 두 템플릿 모두 | `user-authentication` (소문자, 하이픈) |
| `{milestone}` | `milestone_branch_template` | `v1.0` |
| `{num}` / `{quick}` | `quick_branch_template` | `260317-abc` (quick 태스크 ID) |

quick 태스크 브랜칭 예시:

```json
"git": {
  "quick_branch_template": "ecl/quick-{num}-{slug}"
}
```

### Milestone 완료 시 병합 옵션

| 옵션 | Git 명령어 | 결과 |
|------|-----------|------|
| Squash merge (권장) | `git merge --squash` | 브랜치당 단일 클린 커밋 |
| Merge with history | `git merge --no-ff` | 모든 개별 커밋 보존 |
| Delete without merging | `git branch -D` | 브랜치 작업 폐기 |
| Keep branches | (없음) | 나중에 수동으로 처리 |

---

## Gate 설정

워크플로우 중 확인 프롬프트를 제어합니다.

| 설정 | 타입 | 기본값 | 설명 |
|------|------|--------|------|
| `gates.confirm_project` | boolean | `true` | 확정 전 프로젝트 세부사항 확인 |
| `gates.confirm_phases` | boolean | `true` | 단계 분류 확인 |
| `gates.confirm_roadmap` | boolean | `true` | 진행 전 로드맵 확인 |
| `gates.confirm_breakdown` | boolean | `true` | 태스크 분류 확인 |
| `gates.confirm_plan` | boolean | `true` | 실행 전 각 플랜 확인 |
| `gates.execute_next_plan` | boolean | `true` | 다음 플랜 실행 전 확인 |
| `gates.issues_review` | boolean | `true` | 수정 플랜 생성 전 이슈 검토 |
| `gates.confirm_transition` | boolean | `true` | 단계 전환 확인 |

---

## 안전성 설정

| 설정 | 타입 | 기본값 | 설명 |
|------|------|--------|------|
| `safety.always_confirm_destructive` | boolean | `true` | 파괴적 작업(삭제, 덮어쓰기) 확인 |
| `safety.always_confirm_external_services` | boolean | `true` | 외부 서비스 상호작용 확인 |

---

## 보안 설정 (v1.31)

| 설정 | 타입 | 기본값 | 설명 |
|------|------|--------|------|
| `security_enforcement` | boolean | `true` | 위협 모델 보안 검증 활성화 |
| `security_asvs_level` | number (1-3) | `1` | OWASP ASVS 검증 레벨 |
| `security_block_on` | string | `"high"` | 페이즈 진행을 차단하는 최소 심각도 |

---

## 응답 언어 설정 (v1.32)

| 설정 | 타입 | 기본값 | 설명 |
|------|------|--------|------|
| `response_language` | string | (없음) | 에이전트 응답의 언어 코드 (예: `"pt"`, `"ko"`, `"ja"`) |

`response_language`가 설정되면 모든 페이즈와 스폰된 에이전트에서 일관된 언어 출력을 보장합니다.

---

## 훅 설정

| 설정 | 타입 | 기본값 | 설명 |
|------|------|--------|------|
| `hooks.context_warnings` | boolean | `true` | 세션 중 컨텍스트 윈도우 사용 경고 표시 |

---

## 모델 프로필

### 프로필 정의

| 에이전트 | `quality` | `balanced` | `budget` | `inherit` |
|---------|-----------|------------|----------|-----------|
| ecl-planner | Opus | Opus | Sonnet | Inherit |
| ecl-roadmapper | Opus | Sonnet | Sonnet | Inherit |
| ecl-executor | Opus | Sonnet | Sonnet | Inherit |
| ecl-phase-researcher | Opus | Sonnet | Haiku | Inherit |
| ecl-project-researcher | Opus | Sonnet | Haiku | Inherit |
| ecl-research-synthesizer | Sonnet | Sonnet | Haiku | Inherit |
| ecl-debugger | Opus | Sonnet | Sonnet | Inherit |
| ecl-codebase-mapper | Sonnet | Haiku | Haiku | Inherit |
| ecl-verifier | Sonnet | Sonnet | Haiku | Inherit |
| ecl-plan-checker | Sonnet | Sonnet | Haiku | Inherit |
| ecl-integration-checker | Sonnet | Sonnet | Haiku | Inherit |
| ecl-nyquist-auditor | Sonnet | Sonnet | Haiku | Inherit |

### 에이전트별 재정의

전체 프로필을 변경하지 않고 특정 에이전트만 재정의할 수 있습니다.

```json
{
  "model_profile": "balanced",
  "model_overrides": {
    "ecl-executor": "opus",
    "ecl-planner": "haiku"
  }
}
```

유효한 재정의 값: `opus`, `sonnet`, `haiku`, `inherit`, 또는 완전히 정규화된 모델 ID (예: `"openai/o3"`, `"google/gemini-2.5-pro"`).

### 비 Claude 런타임 (Codex, OpenCode, Gemini CLI, Kilo)

비 Claude 런타임에 eCL를 설치하면 인스톨러가 자동으로 `~/.ecl/defaults.json`에 `resolve_model_ids: "omit"`을 설정합니다. 이로 인해 eCL는 모든 에이전트에 빈 model 파라미터를 반환하며 각 에이전트는 런타임에 설정된 모델을 사용합니다. 기본 사용 시 추가 설정은 필요하지 않습니다.

에이전트마다 다른 모델을 사용하려면 런타임이 인식하는 완전히 정규화된 모델 ID로 `model_overrides`를 사용합니다.

```json
{
  "resolve_model_ids": "omit",
  "model_overrides": {
    "ecl-planner": "o3",
    "ecl-executor": "o4-mini",
    "ecl-debugger": "o3",
    "ecl-codebase-mapper": "o4-mini"
  }
}
```

의도는 Claude 프로필 티어와 동일합니다. 추론 품질이 가장 중요한 플래닝과 디버깅에는 더 강력한 모델을 사용하고 플랜에 추론이 이미 포함된 실행과 매핑에는 저렴한 모델을 사용합니다.

**접근 방식 선택 기준.**

| 시나리오 | 설정 | 효과 |
|---------|------|------|
| 비 Claude 런타임, 단일 모델 | `resolve_model_ids: "omit"` (인스톨러 기본값) | 모든 에이전트가 런타임 기본 모델 사용 |
| 비 Claude 런타임, 계층형 모델 | `resolve_model_ids: "omit"` + `model_overrides` | 지정된 에이전트는 특정 모델 사용, 나머지는 런타임 기본값 사용 |
| Claude Code + OpenRouter/로컬 프로바이더 | `model_profile: "inherit"` | 모든 에이전트가 세션 모델을 따름 |
| Claude Code + OpenRouter, 계층형 | `model_profile: "inherit"` + `model_overrides` | 지정된 에이전트는 특정 모델 사용, 나머지는 상속 |

**`resolve_model_ids` 값.**

| 값 | 동작 | 사용 시점 |
|----|------|----------|
| `false` (기본값) | Claude 별칭 반환 (`opus`, `sonnet`, `haiku`) | 네이티브 Anthropic API를 사용하는 Claude Code |
| `true` | 별칭을 전체 Claude 모델 ID로 매핑 (`claude-opus-4-6`) | 전체 ID가 필요한 API를 사용하는 Claude Code |
| `"omit"` | 빈 문자열 반환 (런타임이 기본값 선택) | 비 Claude 런타임 (Codex, OpenCode, Gemini CLI, Kilo) |

### 프로필 철학

| 프로필 | 철학 | 사용 시점 |
|--------|------|----------|
| `quality` | 모든 의사결정에 Opus, 검증에 Sonnet | 할당량 여유가 있을 때, 중요한 아키텍처 작업 |
| `balanced` | 플래닝에만 Opus, 나머지는 Sonnet | 일반 개발 (기본값) |
| `budget` | 코드 작성에 Sonnet, 리서치/검증에 Haiku | 대용량 작업, 덜 중요한 단계 |
| `inherit` | 모든 에이전트가 현재 세션 모델 사용 | 동적 모델 전환, **비 Anthropic 프로바이더** (OpenRouter, 로컬 모델) |

---

## 환경 변수

| 변수 | 용도 |
|------|------|
| `CLAUDE_CONFIG_DIR` | 기본 설정 디렉토리 재정의 (`~/.claude/`) |
| `GEMINI_API_KEY` | context monitor가 훅 이벤트 이름을 전환하기 위해 감지 |
| `WSL_DISTRO_NAME` | 인스톨러가 WSL 경로 처리를 위해 감지 |
| `ECL_SKIP_SCHEMA_CHECK` | 스키마 드리프트 감지 바이패스 (v1.31) |

---

## 전역 기본값

향후 프로젝트를 위한 전역 기본값으로 설정을 저장할 수 있습니다.

**위치:** `~/.ecl/defaults.json`

`/ecl-new-project`가 새 `config.json`을 생성할 때 전역 기본값을 읽어 초기 설정으로 병합합니다. 프로젝트별 설정은 항상 전역 설정보다 우선합니다.
