export type ConfigPrimitive = string | number | boolean | null; export type ConfigValue = ConfigPrimitive | ConfigObject | ConfigArray | Date; export interface ConfigObject { [key: string]: ConfigValue; } export type ConfigArray = ConfigValue[]; export declare function isConfigObject(value: unknown): value is ConfigObject; export interface FileSystem { readFile(path: string, encoding: "utf8"): Promise; writeFile(path: string, content: string, options?: { encoding: "utf8"; flag?: string; }): Promise; mkdir(path: string, options?: { recursive: boolean; }): Promise; rename(oldPath: string, newPath: string): Promise; unlink(path: string): Promise; rm?(path: string, options?: { recursive?: boolean; force?: boolean; }): Promise; stat(path: string): Promise<{ mode?: number; }>; lstat(path: string): Promise<{ isSymbolicLink(): boolean; }>; readdir(path: string): Promise; chmod?(path: string, mode: number): Promise; } export type TemplateLoader = (templateId: string) => Promise; export interface ConfigFormat { /** Parse string content into object */ parse(content: string): ConfigObject; /** Serialize object to string (with consistent formatting) */ serialize(obj: ConfigObject): string; /** Serialize an update against original content while preserving comments when possible */ serializeUpdate?(content: string, current: ConfigObject, next: ConfigObject): string; /** Deep merge patch into base, returning new object */ merge(base: ConfigObject, patch: ConfigObject): ConfigObject; /** Remove keys matching shape from object, returning new object */ prune(obj: ConfigObject, shape: ConfigObject): { changed: boolean; result: ConfigObject; }; } export interface PathMapper { /** Map a target directory to a different location (e.g., for isolated configs) */ mapTargetDirectory(input: { targetDirectory: string; }): string; } export interface MutationContext { /** Filesystem interface - required */ fs: FileSystem; /** Home directory for ~ expansion - required */ homeDir: string; /** Optional dry-run mode */ dryRun?: boolean; /** Optional observers for logging */ observers?: MutationObservers; /** Required for template mutations */ templates?: TemplateLoader; /** Optional path mapper for redirecting paths (used for isolated configs) */ pathMapper?: PathMapper; } export interface MutationOptions { [key: string]: unknown; } export type ValueResolver = T | ((ctx: MutationOptions) => T); interface BaseMutation { /** Human-readable label for logging */ label?: string; } export interface ConfigMergeMutation extends BaseMutation { kind: "configMerge"; target: ValueResolver; value: ValueResolver; format?: "json" | "toml" | "yaml"; pruneByPrefix?: Record; } export interface ConfigPruneMutation extends BaseMutation { kind: "configPrune"; target: ValueResolver; shape: ValueResolver; format?: "json" | "toml" | "yaml"; onlyIf?: (doc: ConfigObject, ctx: MutationOptions) => boolean; } export interface ConfigTransformMutation extends BaseMutation { kind: "configTransform"; target: ValueResolver; format?: "json" | "toml" | "yaml"; transform: (content: ConfigObject, ctx: MutationOptions) => { content: ConfigObject | null; changed: boolean; }; } export interface EnsureDirectoryMutation extends BaseMutation { kind: "ensureDirectory"; path: ValueResolver; } export interface RemoveDirectoryMutation extends BaseMutation { kind: "removeDirectory"; path: ValueResolver; force?: boolean; } export interface RemoveFileMutation extends BaseMutation { kind: "removeFile"; target: ValueResolver; whenEmpty?: boolean; whenContentMatches?: RegExp; } export interface ChmodMutation extends BaseMutation { kind: "chmod"; target: ValueResolver; mode: number; } export interface BackupMutation extends BaseMutation { kind: "backup"; target: ValueResolver; once?: boolean; } export interface RestoreBackupMutation extends BaseMutation { kind: "restoreBackup"; target: ValueResolver; } export interface TemplateWriteMutation extends BaseMutation { kind: "templateWrite"; target: ValueResolver; templateId: string; context?: ValueResolver; } export interface TemplateMergeTomlMutation extends BaseMutation { kind: "templateMergeToml"; target: ValueResolver; templateId: string; context?: ValueResolver; } export interface TemplateMergeJsonMutation extends BaseMutation { kind: "templateMergeJson"; target: ValueResolver; templateId: string; context?: ValueResolver; } export type Mutation = ConfigMergeMutation | ConfigPruneMutation | ConfigTransformMutation | EnsureDirectoryMutation | RemoveDirectoryMutation | RemoveFileMutation | ChmodMutation | BackupMutation | RestoreBackupMutation | TemplateWriteMutation | TemplateMergeTomlMutation | TemplateMergeJsonMutation; export type MutationEffect = "none" | "mkdir" | "write" | "delete" | "chmod" | "copy"; export type MutationDetail = "create" | "update" | "delete" | "noop" | "backup" | "restore"; export interface MutationOutcome { changed: boolean; effect: MutationEffect; detail?: MutationDetail; } export interface MutationDetails { kind: string; label: string; targetPath?: string; } export interface MutationObservers { onStart?(details: MutationDetails): void; onComplete?(details: MutationDetails, outcome: MutationOutcome): void; onError?(details: MutationDetails, error: unknown): void; } export interface MutationResult { changed: boolean; effects: MutationOutcome[]; } export {};