import type { AppQualityIssue, AppQualitySeverity } from "../app-quality/engine.js"; export type InterfaceCraftDimensionId = "focusing-mechanism" | "visual-weight" | "typographic-hierarchy" | "spacing-rhythm" | "color-intentionality" | "shadow-stroke-quality" | "icon-consistency" | "information-density" | "affordance-quality" | "state-feedback" | "component-cohesion" | "platform-conventions" | "motion-restraint" | "responsive-resilience" | "user-context-care"; export type InterfaceCraftLens = "visual-design" | "interface-design" | "conventions" | "user-context"; export type InterfaceCraftFindingSource = "app-quality" | "screenshot" | "manual" | "mcp"; /** 2.3 only emits "static-scan"; other values reserved for 2.4 rendered probes / vision. */ export type InterfaceCraftProvenance = "static-scan" | "rendered-probe" | "vision" | "manual"; export interface InterfaceCraftDimensionDefinition { id: InterfaceCraftDimensionId; name: string; lens: InterfaceCraftLens; description: string; inspectFor: string[]; } export interface InterfaceCraftFinding { id: string; title: string; severity: AppQualitySeverity; lens: InterfaceCraftLens; dimensionIds: InterfaceCraftDimensionId[]; evidence: string[]; recommendation: string; source: InterfaceCraftFindingSource; provenance: InterfaceCraftProvenance; artifactPath?: string; confidence?: number; affectedFiles?: string[]; } export interface InterfaceCraftDimensionAssessment { dimensionId: InterfaceCraftDimensionId; name: string; lens: InterfaceCraftLens; /** * "not-assessed" — no static-scan evidence path can ever reach this * dimension; it is unverified, NOT verified-good. "strong" is only claimed * for dimensions the scan can actually violate and found clean. */ status: "strong" | "watch" | "needs-work" | "unknown" | "not-assessed"; /** null when status is "not-assessed" — an unassessed dimension has no score, not a perfect one. */ score: number | null; findingIds: string[]; notes: string[]; } export interface InterfaceCraftCritique { firstImpression: string; visualDesign: string; interfaceDesign: string; consistencyAndConventions: string; userContext: string; } export interface InterfaceCraftReport { schemaVersion: 2; target: string; generatedAt: string; score: number; dimensions: InterfaceCraftDimensionAssessment[]; critique: InterfaceCraftCritique; findings: InterfaceCraftFinding[]; topOpportunities: string[]; artifactPath?: string; /** Present when a screenshot was attached: recorded, not analyzed — no vision pass runs in 2.3. */ artifactNote?: string; metadata?: { issueCount?: number; appQualityScore?: number; }; } export interface BuildInterfaceCraftReportInput { target?: string; generatedAt?: string; artifactPath?: string | null; issues?: AppQualityIssue[]; appQualityScore?: number; source?: InterfaceCraftFindingSource; } export declare const INTERFACE_CRAFT_DIMENSIONS: InterfaceCraftDimensionDefinition[]; export declare function mapAppQualityIssueToInterfaceCraftFinding(issue: AppQualityIssue): InterfaceCraftFinding; export declare function buildInterfaceCraftReport(input: BuildInterfaceCraftReportInput): InterfaceCraftReport; export declare function writeInterfaceCraftReport(projectRoot: string, report: InterfaceCraftReport): Promise<{ jsonPath: string; markdownPath: string; }>; export declare function renderInterfaceCraftMarkdown(report: InterfaceCraftReport): string;