import { CLAUDE_DIR, SETTINGS_PATH } from './paths.js'; export { CLAUDE_DIR, SETTINGS_PATH }; export declare const SETTINGS_BACKUP_PATH: string; /** settings.json 쓰기 경로가 락으로 보호받지 못할 때 던지는 오류. */ export declare class SettingsLockError extends Error { constructor(message: string); } /** * lockfile 획득 (최대 3초 대기, 100ms 간격 재시도). * * Audit fix #1 (2026-04-21): 이전 구현은 타임아웃 후 기존 holder가 * **살아있어도** 무조건 `writeFileSync`로 PID를 덮어써 동시 쓰기를 유발했다. * 주석은 "보류"라고 되어있었지만 코드는 그렇지 않았다. 이제: * - holder가 살아있으면 `SettingsLockError`를 throw (쓰기 중단) * - holder가 죽었을 때만 stale recovery로 강제 획득 * 호출자는 락 실패 시 사용자 작업을 망치지 않도록 merge 결과를 버릴 책임을 진다. */ export declare function acquireLock(): void; /** * lockfile 해제. * * Audit fix #1 (2026-04-21): 이전에는 ownership 확인 없이 `rmSync`로 * 다른 프로세스의 lock도 지울 수 있었다 (cascade lock loss). 이제 lock * 파일의 PID가 내 PID와 일치할 때만 삭제한다. 불일치 시 조용히 no-op — * 정상 케이스에서는 내 PID만 존재하므로 영향 없음, 비정상 경합 시에는 * 다른 프로세스의 lock을 존중한다. */ export declare function releaseLock(): void; /** 임시파일에 쓴 후 rename으로 원자적 교체 */ export declare function atomicWriteFileSync(targetPath: string, data: string): void; /** * settings.json 안전 읽기. * 파일이 없으면 빈 객체 반환. 파싱 실패 시 Error throw (빈 설정 덮어쓰기 방지). */ export declare function readSettings(): Record; /** * settings.json 안전 읽기 + 손상본 보존. * * 2026-04-21 audit (finding #2, #10): `readSettingsWithBackup`가 parse * 실패 시 silent `{}` 반환했고, 이후 merged write가 사용자 원본을 덮어써서 * 데이터 손실 경로가 됐다. 이제 파싱 실패 시 원본을 `.corrupt-` 로 * 별도 보존 후 예외를 던진다 — 호출자가 덮어쓰기를 중단할 수 있도록. * * Fallthrough: 파일 없음 → `{}`. IO 실패 → throw. Parse 실패 → 손상본 * 보존 후 throw. */ export declare function readSettingsSafely(): Record; /** settings.json 안전 쓰기. backup 생성 + lock + atomic write */ export declare function writeSettings(settings: Record): void; /** settings.json.forgen-backup 파일에서 원본 복원 */ export declare function rollbackSettings(): boolean;