/**
 * Read and parse a JSON file
 * @param filePath Path to JSON file to read
 * @returns Parsed JSON data
 */
export declare function readJson<T = unknown>(filePath: string): Promise<T>;
/**
 * Read JSON file, returning null if file doesn't exist or is invalid
 * @param filePath Path to JSON file to read
 * @returns Parsed JSON data or null if file doesn't exist or is invalid
 */
export declare function readJsonOrNull<T = unknown>(filePath: string): Promise<T | null>;
/**
 * Write object as JSON to a file
 * @param filePath Path to file to write
 * @param data Data to serialize as JSON
 * @param spaces Number of spaces for indentation (default 2)
 */
export declare function writeJson(filePath: string, data: unknown, spaces?: number): Promise<void>;
/**
 * Check if a file contains valid JSON
 * @param filePath Path to file to check
 * @returns True if file contains valid JSON
 */
export declare function isValidJson(filePath: string): Promise<boolean>;
/**
 * Deep merge two objects (Lisa values take precedence on conflicts)
 * Uses lodash.merge for deep merging
 * @param base Base object (project values)
 * @param override Override object with precedence (Lisa values)
 * @returns Merged object with Lisa values winning conflicts
 */
export declare function deepMerge<T extends object>(base: T, override: T): T;
/**
 * Deep merge two JSON objects while preserving array entries from both sides.
 * Scalar conflicts still use override-wins semantics.
 * @param base Base object (project values)
 * @param override Override object with precedence (Lisa values)
 * @returns Merged object with arrays concatenated and deduplicated
 */
export declare function deepMergeWithArrayUnion<T extends object>(base: T, override: T): T;
//# sourceMappingURL=json-utils.d.ts.map