/** * Code Order — shared types. * * Tree-like representation of a scanned directory. Every node is either a file * or a folder; folders aggregate size/file/folder counts from their children. */ export interface FileNode { readonly path: string; readonly name: string; readonly size: number; /** Lowercase extension without the leading dot. Empty string when none. */ readonly extension: string; readonly isFile: true; readonly mtime: number; } export interface FolderNode { path: string; name: string; isFile: false; totalSize: number; fileCount: number; folderCount: number; maxDepth: number; children: TreeNode[]; } export type TreeNode = FileNode | FolderNode; export type IssueType = "oversized_file" | "deep_nesting" | "empty_folder" | "empty_file" | "duplicate_names" | "single_child_folder"; export type IssueSeverity = "info" | "warning" | "critical"; export interface Issue { type: IssueType; severity: IssueSeverity; path: string; message: string; suggestion?: string; } export interface ExtensionEntry { extension: string; count: number; size: number; } export interface ProjectMetrics { totalFiles: number; totalFolders: number; totalSize: number; maxDepth: number; avgFileSize: number; medianFileSize: number; extensions: ExtensionEntry[]; topLargestFiles: FileNode[]; emptyFolders: string[]; emptyFiles: string[]; } export interface AnalysisResult { root: string; generatedAt: string; metrics: ProjectMetrics; issues: Issue[]; } export interface AnalysisOptions { /** Absolute directory to analyze. Defaults to process.cwd(). */ root: string; } //# sourceMappingURL=types.d.ts.map