/** * Forgen — Hook Config Loader * * hook-config.json 에서 훅별 설정을 읽어 반환합니다. * 파일이 없거나 읽기에 실패하면 null 을 반환합니다 (failure-tolerant). * * 설정 로딩 우선순위: * 1. 프로젝트 레벨: {cwd}/.forgen/hook-config.json * 2. 글로벌 레벨: FORGEN_HOME/hook-config.json (~/.forgen/hook-config.json) * 프로젝트 설정은 글로벌 설정과 머지됩니다 (훅 단위 오버라이드). * 프로젝트 설정이 없으면 글로벌 설정만 사용 (하위호환). * * cwd 결정: process.env.FORGEN_CWD ?? process.env.COMPOUND_CWD ?? process.cwd() * * 설정 형식 (hook-config.json): * { * "tiers": { "compound-core": { "enabled": true }, "safety": { "enabled": true }, "workflow": { "enabled": true } }, * "hooks": { "hookName": { "enabled": false, ...customConfig } }, * "hookName": { "enabled": false } // 레거시 호환 (hooks 키 없이 직접 지정) * } * * 안전 보장: * - compound-core 티어는 tiers 설정으로 비활성화 불가 (복리화 보호) * - 개별 hooks.hookName.enabled: false 로만 비활성화 가능 */ /** 훅 설정 파일의 전체 구조 타입 */ export type HookConfig = Record; /** 테스트/진단용: 보호된 훅 이름 집합 스냅샷. */ export declare function getProtectedHookNames(): string[]; /** * 프로젝트의 작업 디렉토리를 결정합니다. * FORGEN_CWD → COMPOUND_CWD → process.cwd() 순서. */ export declare function resolveProjectCwd(): string; /** * 글로벌 설정과 프로젝트 설정을 머지합니다. * 프로젝트 설정이 글로벌 설정을 훅 단위로 오버라이드합니다. * * 머지 규칙: * - tiers: 프로젝트가 글로벌을 훅 단위로 오버라이드 (shallow merge) * - hooks: 프로젝트가 글로벌을 훅 단위로 오버라이드 (shallow merge) * - 최상위 레거시 키: 프로젝트가 글로벌을 키 단위로 오버라이드 * - 프로젝트에 없는 키는 글로벌에서 상속 */ export declare function mergeHookConfigs(global: HookConfig, project: HookConfig): HookConfig; /** 특정 훅의 설정을 반환합니다. 실패 시 null 반환. */ export declare function loadHookConfig(hookName: string): Record | null; /** * 훅이 활성화되어 있는지 확인합니다. * * Invariant: compound-core 티어 및 compoundCritical=true 훅은 어떤 config * 경로(개별 hooks / tier / 레거시)로도 비활성화되지 않는다. config 값과 무관하게 * 항상 true를 반환한다. 이는 복리화 3축(승급/rollback/피드백)을 project-level * config 실수로 조용히 끄는 dual-path를 차단하는 단일 진입점 가드다. * * 우선순위: * 0. PROTECTED_HOOKS에 속하면 → 즉시 true (가드레일) * 1. hooks.hookName.enabled (개별 훅 설정) * 2. tiers.tierName.enabled (티어 설정) * 3. hookName.enabled (레거시 형식) * 4. 기본값 true (하위호환) */ export declare function isHookEnabled(hookName: string): boolean;