feat: Hierarchy-Aware Categorization#16
Conversation
- Add ScannedFolder struct for folder units - Add ScanUnit enum for unified folder/file handling - Add HierarchyScanResult with folders and loose files separated - Add scanWithHierarchy() method to FilenameScanner - Add Configuration options: respectHierarchy, minDepthForFolder, minFilesForFolder - Add comprehensive unit tests for hierarchy scanning This is Phase 1 of the hierarchy-aware categorization feature. Folders with >= minFilesForFolder files are treated as units. Folders below threshold are flattened to loose files. Empty folders are silently skipped.
- Add FolderCategoryAssignment struct for folder categorization results - Add FolderCategorizer actor with LLM-based categorization - Add quickCategorize() for rule-based fallback (no LLM needed) - Add comprehensive unit tests for folder categorization The FolderCategorizer analyzes folder name and contents to determine the best category for moving the folder as a unit. Includes fallback quick categorization for when LLM is unavailable.
- Add FolderOrganizationOperation and FolderOrganizationConflict types - Add HierarchyAwareOrganizationPlan with folder and file operations - Add OrganizationEngine.planHierarchyOrganization() method - Add SafeFileOrganizer.moveFolder() and moveFolders() methods - Add SafeFolderOrganizationResult for folder operation results The OrganizationEngine can now plan operations that treat folders as complete units while still handling loose files individually. SafeFileOrganizer supports moving entire folder trees atomically.
- Add respectHierarchy, minFilesForFolder, allowUserFlatten, folderReviewThreshold to OrganizationConfiguration - Add corresponding SortAIDefaultsKey constants - Register defaults for hierarchy settings - Add OrganizationConfiguration.flat preset for legacy behavior Users can now configure hierarchy-aware categorization behavior: - respectHierarchy: Enable/disable folder-as-unit treatment - minFilesForFolder: Minimum files before treating as unit - allowUserFlatten: Allow flattening folders from preview UI - folderReviewThreshold: Confidence below which folders need review
…hase 5) - Add OrganizationPreviewView showing proposed folder and file operations - Add FolderPreviewRow with confidence indicators and actions - Add FilePreviewRow grouped by destination category - Add OrganizationConflictRow for displaying conflicts - Add CategoryPickerSheet for changing folder categories - Support flatten and category change actions for folders The preview UI displays: - Folder units with file counts, sizes, confidence indicators - Grouped individual files by destination category - Conflict warnings with resolution status - Actions: flatten folder, change category, confirm/cancel
- Add HierarchyOrganization test suite - Test HierarchyAwareOrganizationPlan totals and properties - Test FolderOrganizationOperation properties - Test planHierarchyOrganization with folders and loose files - Test toLegacyPlan conversion All 15 hierarchy-related tests pass: - 10 HierarchyScanning tests - 4 HierarchyOrganization tests - 1 FilenameScanner configuration test
|
Claude finished @gilmanb1's task —— View job Code Review: Hierarchy-Aware Categorization
|

Summary
This PR implements Hierarchy-Aware Categorization as specified in
HIERARCHY_AWARE_CATEGORIZATION.md.Key Changes
Phase 1: Data Models & Scanning
ScannedFolderstruct for folders that move as complete unitsScanUnitenum for unified folder/file handlingHierarchyScanResultwith folders and loose files separatedscanWithHierarchy()method toFilenameScannerrespectHierarchy,minDepthForFolder,minFilesForFolderPhase 2: Folder Categorization
FolderCategorizeractor with LLM-based categorizationFolderCategoryAssignmentstruct with confidence and alternativesquickCategorize()for rule-based fallback (no LLM needed)Phase 3: Organization Planning & Execution
FolderOrganizationOperationfor moving folders as unitsHierarchyAwareOrganizationPlanseparating folder and file operationsplanHierarchyOrganization()inOrganizationEnginemoveFolder()andmoveFolders()inSafeFileOrganizerPhase 4: Configuration
OrganizationConfigurationrespectHierarchy,minFilesForFolder,allowUserFlatten,folderReviewThresholdPhase 5: UI Preview
OrganizationPreviewViewshowing folder units and loose filesFolderPreviewRowwith confidence indicators and actionsCategoryPickerSheetfor reassigning folder categoriesPhase 6: Tests
Files Changed
Sources/SortAI/Core/Taxonomy/FilenameScanner.swift- Hierarchy scanningSources/SortAI/Core/Taxonomy/FolderCategorizer.swift- New fileSources/SortAI/Core/Organizer/OrganizationEngine.swift- Hierarchy planningSources/SortAI/Core/Organizer/SafeFileOrganizer.swift- Folder movesSources/SortAI/Core/Configuration/AppConfiguration.swift- SettingsSources/SortAI/App/OrganizationPreviewView.swift- New fileTests/SortAITests/TaxonomyTests.swift- Hierarchy testsTests/SortAITests/OrganizationTests.swift- Integration testsTesting