/** * 훅 공유 유틸: 원자적 파일 쓰기 * * write → rename 패턴으로 동시 세션에서의 상태 파일 손상을 방지합니다. * * 보안 모델: * - mode 옵션이 0o600인 파일은 같은 호스트의 다른 user로부터 보호. * - tmp 파일은 PID + randomBytes(6) suffix → 같은 process가 동시 atomic write를 * 하더라도 tmp 충돌 없음. symlink TOCTOU도 방지. * * Windows 한계: * - fchmodSync/chmodSync는 Windows에서 read-only 비트만 영향. 0o600 같은 * POSIX 권한은 의미가 없으며, 보안은 OS-level ACL과 사용자 home 격리에 의존. * - 민감 데이터는 Windows에서 추가 보호가 필요할 수 있다. */ /** * JSON 데이터를 원자적으로 파일에 기록 (tmp → rename) * * @param options.pretty 들여쓴 포맷으로 직렬화 * @param options.mode 생성될 파일의 권한 (예: 0o600). 기본값은 umask 의존(보통 0o644). * 민감한 캐시(컨텍스트 식별자/태그 포함)에 대해서는 0o600 권장. * @param options.dirMode 부모 디렉터리 mode. cache는 0o700 권장. * * 권한 보장 (M6+M16+M17 fix): * 1. tmp 파일이 random suffix → 다른 fd 충돌 없음 (Promise.all 안전). * 2. fd 단위 fchmodSync로 새 inode 권한 강제. * 3. post-rename chmodSync 실패는 throw — 느슨한 권한 침묵 방지. * 4. Windows에서는 위 mode가 무효일 수 있으나, OS-level ACL이 일반적으로 user 격리. */ export declare function atomicWriteJSON(filePath: string, data: unknown, options?: { pretty?: boolean; mode?: number; dirMode?: number; }): void; /** 텍스트를 원자적으로 파일에 기록 (tmp → rename) */ export declare function atomicWriteText(filePath: string, content: string, options?: { mode?: number; dirMode?: number; }): void; /** * JSON 파일을 안전하게 읽기 (파싱 실패 시 fallback 반환). * * R4-B3 (2026-04-22): UTF-8 BOM () prefix 제거 — Windows 메모장 등으로 저장된 * rule/settings JSON 이 BOM 으로 시작해 JSON.parse 가 silent 실패하던 문제. * R4-SKIP: FORGEN_DEBUG_SIGNALS=1 일 때 파싱 실패를 stderr 로 노출 — silent * 누락을 운영자가 추적 가능하도록. */ export declare function safeReadJSON(filePath: string, fallback: T): T;