/** * `uxloom diff` — semantic design diffs (RFC 0004 R8). * * Compares two project files as designs, not as JSON: journeys/screens/ * states added or removed, transition changes (guards, roles), contract * vs designed deltas, exemptions, tokens, components, layout. A * thousand-line JSON diff becomes ten meaningful lines. */ export interface DesignDiff { changes: DiffChange[]; summary: { added: number; removed: number; changed: number; }; } export interface DiffChange { kind: "journey-added" | "journey-removed" | "screen-added" | "screen-removed" | "state-added" | "state-removed" | "contract-state-added" | "contract-state-removed" | "designed-state-added" | "designed-state-removed" | "transition-added" | "transition-removed" | "transition-changed" | "exemption-added" | "exemption-removed" | "tokens-changed" | "component-added" | "component-removed" | "component-changed" | "layout-changed" | "platforms-changed"; journey?: string; screen?: string; state?: string; event?: string; /** One human sentence, e.g. 'transition PAY on payment: target "confirm" → "review"'. */ detail: string; } /** * Semantic diff of two projects. Both sides are validated with * parseProject (ZodError propagates). Arrays keyed by id / state name / * event compare order-insensitively; string transitions are normalized * to object form. Output ordering is deterministic: project-level * first, then journeys alphabetically, then screens alphabetically. */ export declare function diffProjects(oldProject: unknown, newProject: unknown): DesignDiff; /** Grouped terminal output; colors match `uxloom check`. */ export declare function renderHuman(diff: DesignDiff, useColor: boolean): string; /** PR-comment-ready markdown. */ export declare function renderMarkdown(diff: DesignDiff): string; /** * `uxloom diff` entry point; receives the raw args after "diff". * Exit codes: 0 no changes, 3 changes present, 2 error. Never 1 * (reserved for check/audit failures). */ export declare function runDiff(args: string[]): never;