import Foundation enum DiskCleanDynamicRule: String, Equatable, Sendable { case xcodeDerivedData case unavailableSimulators case npmCache case pnpmStore case bunCache case pipCache case goBuildCache case goModuleCache case miseCache case jetbrainsToolboxOldVersions case aiAgentOldVersions case serviceWorkerCache case oldBrowserVersions } struct DiskCleanRule: Identifiable, Equatable, Sendable { enum Target: Equatable, Sendable { case path(String) case dynamic(DiskCleanDynamicRule) } let id: String let choice: DiskCleanChoice let title: String let risk: DiskCleanRisk let targets: [Target] let skipWhenProcessIsRunning: [String] let requiresAdmin: Bool init( id: String, choice: DiskCleanChoice, title: String, risk: DiskCleanRisk, targets: [Target], skipWhenProcessIsRunning: [String] = [], requiresAdmin: Bool = false ) { self.id = id self.choice = choice self.title = title self.risk = risk self.targets = targets self.skipWhenProcessIsRunning = skipWhenProcessIsRunning self.requiresAdmin = requiresAdmin } } struct DiskCleanRuleCatalog: Equatable, Sendable { let rules: [DiskCleanRule] static let moleFirstVersion = DiskCleanRuleCatalog( rules: cacheRules + developerRules + browserRules ) func rules(for choice: DiskCleanChoice) -> [DiskCleanRule] { rules.filter { $0.choice == choice } } private static let cacheRules: [DiskCleanRule] = [ rule( id: "cache.user-essentials", choice: .cache, title: "User caches and logs", targets: [ "~/Library/Caches/*", "~/Library/Logs/*" ] ), rule( id: "cache.macos-app-state", choice: .cache, title: "macOS app state caches", targets: [ "~/Library/Saved Application State/*", "~/Library/Caches/com.apple.photoanalysisd", "~/Library/Caches/com.apple.akd", "~/Library/Caches/com.apple.WebKit.Networking/*", "~/Library/DiagnosticReports/*", "~/Library/Caches/com.apple.QuickLook.thumbnailcache", "~/Library/Caches/Quick Look/*", "~/Library/Caches/com.apple.iconservices*", "~/Library/Autosave Information/*", "~/Library/IdentityCaches/*", "~/Library/Suggestions/*", "~/Library/Calendars/Calendar Cache", "~/Library/Application Support/AddressBook/Sources/*/Photos.cache" ] ), rule( id: "cache.apple-sandboxed-apps", choice: .cache, title: "Apple sandboxed app caches", targets: [ "~/Library/Containers/com.apple.wallpaper.agent/Data/Library/Caches/*", "~/Library/Containers/com.apple.mediaanalysisd/Data/Library/Caches/*", "~/Library/Containers/com.apple.mediaanalysisd/Data/tmp/*", "~/Library/Containers/com.apple.AppStore/Data/Library/Caches/*", "~/Library/Containers/com.apple.configurator.xpc.InternetService/Data/tmp/*", "~/Library/Containers/com.apple.wallpaper.extension.aerials/Data/tmp/*", "~/Library/Containers/com.apple.geod/Data/tmp/*", "~/Library/Containers/com.apple.stocks/Data/Library/Caches/*", "~/Library/Application Support/com.apple.wallpaper/aerials/thumbnails/*", "~/Library/Caches/com.apple.helpd/*", "~/Library/Caches/GeoServices/*", "~/Library/Containers/com.apple.AvatarUI.AvatarPickerMemojiPicker/Data/Library/Caches/*", "~/Library/Containers/com.apple.AMPArtworkAgent/Data/Library/Caches/*", "~/Library/Containers/com.apple.CoreDevice.CoreDeviceService/Data/Library/Caches/*", "~/Library/Containers/com.apple.NeptuneOneExtension/Data/Library/Caches/*", "~/Library/Containers/com.apple.AppleMediaServicesUI.UtilityExtension/Data/tmp/*", "~/Library/Group Containers/group.com.apple.contentdelivery/Logs/*", "~/Library/Group Containers/group.com.apple.contentdelivery/Library/Logs/*" ] ), rule( id: "cache.cloud-storage", choice: .cache, title: "Cloud storage caches", targets: [ "~/Library/Caches/com.dropbox.*", "~/Library/Caches/com.getdropbox.dropbox", "~/Library/Caches/com.google.GoogleDrive", "~/Library/Caches/com.baidu.netdisk", "~/Library/Caches/com.alibaba.teambitiondisk", "~/Library/Caches/com.box.desktop", "~/Library/Caches/com.microsoft.OneDrive" ] ), rule( id: "cache.office-apps", choice: .cache, title: "Office and mail app caches", targets: [ "~/Library/Caches/com.microsoft.Word", "~/Library/Containers/com.microsoft.Word/Data/Library/Caches/*", "~/Library/Containers/com.microsoft.Word/Data/tmp/*", "~/Library/Containers/com.microsoft.Word/Data/Library/Logs/*", "~/Library/Caches/com.microsoft.Excel", "~/Library/Containers/com.microsoft.Excel/Data/Library/Caches/*", "~/Library/Containers/com.microsoft.Excel/Data/tmp/*", "~/Library/Containers/com.microsoft.Excel/Data/Library/Logs/*", "~/Library/Caches/com.microsoft.Powerpoint", "~/Library/Caches/com.microsoft.Outlook/*", "~/Library/Caches/com.apple.iWork.*", "~/Library/Caches/com.kingsoft.wpsoffice.mac", "~/Library/Caches/org.mozilla.thunderbird/*", "~/Library/Caches/com.apple.mail/*" ] ), rule( id: "cache.virtualization", choice: .cache, title: "Virtualization caches", targets: [ "~/Library/Caches/com.vmware.fusion", "~/Library/Caches/com.parallels.*", "~/VirtualBox VMs/.cache", "~/.vagrant.d/tmp/*" ] ), rule( id: "cache.communication", choice: .cache, title: "Communication app caches", targets: [ "~/Library/Application Support/discord/Cache/*", "~/Library/Application Support/legcord/Cache/*", "~/Library/Application Support/Slack/Cache/*", "~/Library/Caches/us.zoom.xos/*", "~/Library/Caches/com.tencent.xinWeChat/*", "~/Library/Caches/ru.keepcoder.Telegram/*", "~/Library/Caches/com.microsoft.teams2/*", "~/Library/Caches/net.whatsapp.WhatsApp/*", "~/Library/Caches/com.skype.skype/*", "~/Library/Caches/com.tencent.meeting/*", "~/Library/Caches/com.tencent.WeWorkMac/*", "~/Library/Caches/com.feishu.*/*", "~/Library/Application Support/Microsoft/Teams/Cache/*", "~/Library/Application Support/Microsoft/Teams/Application Cache/*", "~/Library/Application Support/Microsoft/Teams/Code Cache/*", "~/Library/Application Support/Microsoft/Teams/GPUCache/*", "~/Library/Application Support/Microsoft/Teams/logs/*", "~/Library/Application Support/Microsoft/Teams/tmp/*" ] ), rule( id: "cache.ai-assistants", choice: .cache, title: "AI assistant app caches", targets: [ "~/Library/Caches/com.openai.chat/*", "~/Library/Caches/com.anthropic.claudefordesktop/*", "~/Library/Logs/Claude/*", "~/Library/Logs/com.openai.codex/*", "~/Library/Application Support/Codex/Cache/*", "~/Library/Application Support/Codex/Code Cache/*", "~/Library/Application Support/Codex/GPUCache/*", "~/Library/Application Support/Codex/DawnGraphiteCache/*", "~/Library/Application Support/Codex/DawnWebGPUCache/*" ] ), rule( id: "cache.creative-tools", choice: .cache, title: "Creative tool caches", targets: [ "~/Library/Caches/com.bohemiancoding.sketch3/*", "~/Library/Application Support/com.bohemiancoding.sketch3/cache/*", "~/Library/Caches/Adobe/*", "~/Library/Caches/com.adobe.*/*", "~/Library/Caches/com.figma.Desktop/*", "~/Library/Application Support/Adobe/Common/Media Cache Files/*", "~/Library/Caches/net.telestream.screenflow10/*", "~/Library/Caches/com.apple.FinalCut/*", "~/Library/Caches/com.blackmagic-design.DaVinciResolve/*", "~/Movies/CacheClip/*", "~/Library/Caches/com.adobe.PremierePro.*/*", "~/Library/Caches/org.blenderfoundation.blender/*", "~/Library/Caches/com.maxon.cinema4d/*", "~/Library/Caches/com.autodesk.*/*", "~/Library/Caches/com.sketchup.*/*" ] ), rule( id: "cache.productivity-media", choice: .cache, title: "Productivity and media caches", targets: [ "~/Library/Caches/com.tw93.MiaoYan/*", "~/Library/Caches/com.klee.desktop/*", "~/Library/Caches/klee_desktop/*", "~/Library/Caches/com.orabrowser.app/*", "~/Library/Caches/com.filo.client/*", "~/Library/Caches/com.flomoapp.mac/*", "~/Library/Application Support/Quark/Cache/videoCache/*", "~/Library/Containers/com.ranchero.NetNewsWire-Evergreen/Data/Library/Caches/*", "~/Library/Containers/com.ideasoncanvas.mindnode/Data/Library/Caches/*", "~/.cache/kaku/*", "~/Library/Caches/com.spotify.client/*", "~/Library/Caches/com.apple.Music", "~/Library/Caches/com.apple.podcasts", "~/Library/Containers/com.apple.podcasts/Data/tmp/StreamedMedia", "~/Library/Containers/com.apple.podcasts/Data/tmp/*.heic", "~/Library/Containers/com.apple.podcasts/Data/tmp/*.img", "~/Library/Containers/com.apple.podcasts/Data/tmp/*CFNetworkDownload*.tmp", "~/Library/Caches/com.apple.TV/*", "~/Library/Caches/tv.plex.player.desktop", "~/Library/Caches/com.netease.163music", "~/Library/Caches/com.tencent.QQMusic/*", "~/Library/Caches/com.kugou.mac/*", "~/Library/Caches/com.kuwo.mac/*", "~/Library/Caches/com.colliderli.iina", "~/Library/Caches/org.videolan.vlc", "~/Library/Caches/io.mpv", "~/Library/Caches/com.iqiyi.player", "~/Library/Caches/com.tencent.tenvideo", "~/Library/Caches/tv.danmaku.bili/*", "~/Library/Caches/com.douyu.*/*", "~/Library/Caches/com.huya.*/*", "~/Library/Caches/smart.stremio*/*", "~/Library/Application Support/stremio/stremio-server/stremio-cache/*" ] ), rule( id: "cache.utilities", choice: .cache, title: "Utility app caches", targets: [ "~/Library/Caches/net.xmac.aria2gui", "~/Library/Caches/org.m0k.transmission", "~/Library/Caches/com.qbittorrent.qBittorrent", "~/Library/Caches/com.downie.Downie-*", "~/Library/Caches/com.folx.*/*", "~/Library/Caches/com.charlessoft.pacifist/*", "~/Library/Caches/com.youdao.YoudaoDict", "~/Library/Caches/com.eudic.*", "~/Library/Caches/com.bob-build.Bob", "~/Library/Caches/com.cleanshot.*", "~/Library/Caches/com.reincubate.camo", "~/Library/Caches/com.xnipapp.xnip", "~/Library/Caches/com.readdle.smartemail-Mac", "~/Library/Caches/com.airmail.*", "~/Library/Caches/com.todoist.mac.Todoist", "~/Library/Caches/com.any.do.*", "~/.zcompdump*", "~/.lesshst", "~/.viminfo.tmp", "~/.wget-hsts", "~/.cacher/logs/*", "~/.kite/logs/*", "~/Library/Caches/dev.warp.Warp-Stable/*", "~/Library/Logs/warp.log", "~/Library/Caches/SentryCrash/Warp/*", "~/Library/Caches/com.mitchellh.ghostty/*" ] ), rule( id: "cache.games-notes-remote", choice: .cache, title: "Games, notes, and remote desktop caches", targets: [ "~/Library/Caches/com.valvesoftware.steam/*", "~/Library/Application Support/Steam/htmlcache/*", "~/Library/Application Support/Steam/appcache/*", "~/Library/Application Support/Steam/depotcache/*", "~/Library/Application Support/Steam/steamapps/shadercache/*", "~/Library/Application Support/Steam/logs/*", "~/Library/Caches/com.epicgames.EpicGamesLauncher/*", "~/Library/Caches/com.blizzard.Battle.net/*", "~/Library/Application Support/Battle.net/Cache/*", "~/Library/Caches/com.ea.*/*", "~/Library/Caches/com.gog.galaxy/*", "~/Library/Caches/com.riotgames.*/*", "~/Library/Application Support/minecraft/logs/*", "~/Library/Application Support/minecraft/crash-reports/*", "~/Library/Application Support/minecraft/webcache/*", "~/Library/Application Support/minecraft/webcache2/*", "~/.lunarclient/game-cache/*", "~/.lunarclient/launcher-cache/*", "~/.lunarclient/logs/*", "~/.lunarclient/offline/*/logs/*", "~/.lunarclient/offline/files/*/logs/*", "~/Library/Caches/net.pcsx2.PCSX2/*", "~/Library/Application Support/PCSX2/cache/*", "~/Library/Logs/PCSX2/*", "~/Library/Caches/net.rpcs3.rpcs3/*", "~/Library/Application Support/rpcs3/logs/*", "~/Library/Caches/notion.id/*", "~/Library/Caches/md.obsidian/*", "~/Library/Caches/com.logseq.*/*", "~/Library/Caches/com.bear-writer.*/*", "~/Library/Caches/com.evernote.*/*", "~/Library/Caches/com.yinxiang.*/*", "~/Library/Caches/com.teamviewer.*/*", "~/Library/Caches/com.anydesk.*/*", "~/Library/Caches/com.todesk.*/*", "~/Library/Caches/com.sunlogin.*/*" ] ), rule( id: "cache.launchers-system-utils", choice: .cache, title: "Launchers and system utility caches", targets: [ "~/Library/Caches/com.runningwithcrayons.Alfred/*", "~/Library/Caches/cx.c3.theunarchiver/*", "~/Library/Caches/com.raycast.macos/urlcache/*", "~/Library/Caches/com.raycast.macos/fsCachedData/*", "~/Library/Caches/com.runjuu.Input-Source-Pro/*", "~/Library/Caches/macos-wakatime.WakaTime/*", "~/Library/Application Support/WeType/com.onevcat.Kingfisher.ImageCache.WeType/*", "~/Library/Application Support/WeType/DictUpdate/*", "~/Library/Application Support/mihomo-party/Cache/*", "~/Library/Application Support/mihomo-party/Code Cache/*", "~/Library/Application Support/mihomo-party/GPUCache/*", "~/Library/Application Support/mihomo-party/DawnGraphiteCache/*", "~/Library/Application Support/mihomo-party/DawnWebGPUCache/*", "~/Library/Application Support/mihomo-party/logs/*", "~/Library/Caches/ws.stash.app.mac/*" ] ) ] private static let developerRules: [DiskCleanRule] = [ DiskCleanRule( id: "developer.xcode-derived-data", choice: .developer, title: "Xcode DerivedData", risk: .medium, targets: [.dynamic(.xcodeDerivedData)], skipWhenProcessIsRunning: ["Xcode"] ), rule( id: "developer.xcode-user-caches", choice: .developer, title: "Xcode user caches", risk: .medium, targets: [ "~/Library/Caches/com.apple.dt.Xcode/*", "~/Library/Developer/Xcode/iOS Device Logs/*", "~/Library/Developer/Xcode/watchOS Device Logs/*", "~/Library/Developer/Xcode/Products/*", "~/Library/Developer/Xcode/Archives/*", "~/Library/Developer/Xcode/DocumentationCache/*", "~/Library/Developer/Xcode/DocumentationIndex/*", "~/Library/Developer/Xcode/UserData/IB Support/*", "~/Library/Developer/Xcode/iOS DeviceSupport/*/Symbols/System/Library/Caches/*", "~/Library/Developer/Xcode/iOS DeviceSupport/*.log", "~/Library/Developer/Xcode/watchOS DeviceSupport/*/Symbols/System/Library/Caches/*", "~/Library/Developer/Xcode/watchOS DeviceSupport/*.log", "~/Library/Developer/Xcode/tvOS DeviceSupport/*/Symbols/System/Library/Caches/*", "~/Library/Developer/Xcode/tvOS DeviceSupport/*.log" ], skipWhenProcessIsRunning: ["Xcode"] ), DiskCleanRule( id: "developer.simulator-unavailable", choice: .developer, title: "Unavailable simulators", risk: .medium, targets: [.dynamic(.unavailableSimulators)], skipWhenProcessIsRunning: ["Simulator"] ), rule( id: "developer.simulator-caches", choice: .developer, title: "Simulator caches", risk: .medium, targets: [ "~/Library/Developer/CoreSimulator/Caches/*", "~/Library/Developer/CoreSimulator/Devices/*/data/tmp/*", "~/Library/Logs/CoreSimulator/*", "~/Library/Developer/CoreSimulator/Profiles/Runtimes/*/Contents/Resources/RuntimeRoot/System/Library/Caches/*" ], skipWhenProcessIsRunning: ["Simulator"] ), DiskCleanRule( id: "developer.package-manager-dynamic-caches", choice: .developer, title: "Package manager dynamic caches", risk: .medium, targets: [ .dynamic(.npmCache), .dynamic(.pnpmStore), .dynamic(.bunCache), .dynamic(.pipCache), .dynamic(.goBuildCache), .dynamic(.goModuleCache), .dynamic(.miseCache) ] ), rule( id: "developer.javascript-caches", choice: .developer, title: "JavaScript tool caches", risk: .medium, targets: [ "~/.npm/_cacache/*", "~/.npm/_npx/*", "~/.npm/_logs/*", "~/.npm/_prebuilds/*", "~/Library/pnpm/store/*", "~/.bun/install/cache/*", "~/.tnpm/_cacache/*", "~/.tnpm/_logs/*", "~/.yarn/cache/*", "~/Library/Caches/Yarn/*", "~/.cache/typescript/*", "~/.cache/electron/*", "~/.cache/node-gyp/*", "~/.node-gyp/*", "~/.turbo/cache/*", "~/.vite/cache/*", "~/.cache/vite/*", "~/.cache/webpack/*", "~/.parcel-cache/*", "~/.cache/eslint/*", "~/.cache/prettier/*" ] ), rule( id: "developer.python-caches", choice: .developer, title: "Python and ML caches", risk: .medium, targets: [ "~/Library/Caches/pip/*", "~/.cache/pip/*", "~/.pyenv/cache/*", "~/.cache/poetry/*", "~/.cache/uv/*", "~/.cache/ruff/*", "~/.cache/mypy/*", "~/.pytest_cache/*", "~/.jupyter/runtime/*", "~/.cache/huggingface/*", "~/.cache/torch/*", "~/.cache/tensorflow/*", "~/.conda/pkgs/*", "~/anaconda3/pkgs/*", "~/.cache/wandb/*" ] ), rule( id: "developer.rust-go-docker", choice: .developer, title: "Rust, Go, and Docker caches", risk: .medium, targets: [ "~/.cargo/registry/cache/*", "~/.cargo/git/*", "~/.rustup/downloads/*", "~/Library/Caches/go-build/*", "~/go/pkg/mod/*", "~/.docker/buildx/cache/*" ] ), rule( id: "developer.mobile-caches", choice: .developer, title: "Mobile development caches", risk: .medium, targets: [ "~/Library/Caches/Google/AndroidStudio*/*", "~/.android/build-cache/*", "~/.android/cache/*", "~/.cache/swift-package-manager/*", "~/Library/Caches/org.swift.swiftpm/*", "~/.expo/expo-go/*", "~/.expo/android-apk-cache/*", "~/.expo/ios-simulator-app-cache/*", "~/.expo/native-modules-cache/*", "~/.expo/schema-cache/*", "~/.expo/template-cache/*", "~/.expo/versions-cache/*" ] ), rule( id: "developer.jvm-caches", choice: .developer, title: "JVM caches", risk: .medium, targets: [ "~/.m2/repository/*", "~/.sbt/*", "~/.ivy2/cache/*", "~/.gradle/caches/*", "~/.gradle/daemon/*" ] ), DiskCleanRule( id: "developer.jetbrains-toolbox-old-versions", choice: .developer, title: "JetBrains Toolbox old IDE versions", risk: .medium, targets: [.dynamic(.jetbrainsToolboxOldVersions)] ), DiskCleanRule( id: "developer.ai-agent-old-versions", choice: .developer, title: "AI coding agent old versions", risk: .medium, targets: [.dynamic(.aiAgentOldVersions)] ), rule( id: "developer.editor-caches", choice: .developer, title: "Editor caches", risk: .medium, targets: [ "~/Library/Application Support/Code/logs/*", "~/Library/Application Support/Code/Cache/*", "~/Library/Application Support/Code/CachedExtensions/*", "~/Library/Application Support/Code/CachedData/*", "~/Library/Application Support/Code/DawnGraphiteCache/*", "~/Library/Application Support/Code/DawnWebGPUCache/*", "~/Library/Application Support/Code/GPUCache/*", "~/Library/Application Support/Code/CachedExtensionVSIXs/*", "~/Library/Application Support/Code/Service Worker/ScriptCache/*", "~/Library/Caches/com.microsoft.VSCode/Cache/*", "~/Library/Caches/com.sublimetext.*/*", "~/Library/Caches/Zed/*", "~/Library/Logs/Zed/*", "~/Library/Caches/copilot/*", "~/.cache/vscode-ripgrep/*", "~/Library/Caches/Cursor/*", "~/Library/Application Support/Cursor/CachedData/*", "~/Library/Application Support/Cursor/CachedExtensionVSIXs/*", "~/Library/Application Support/Cursor/GPUCache/*", "~/Library/Application Support/Cursor/DawnGraphiteCache/*", "~/Library/Application Support/Cursor/DawnWebGPUCache/*", "~/Library/Application Support/Cursor/Service Worker/ScriptCache/*" ] ), rule( id: "developer.cloud-devops-caches", choice: .developer, title: "Cloud and DevOps caches", risk: .medium, targets: [ "~/.kube/cache/*", "~/.local/share/containers/storage/tmp/*", "~/.aws/cli/cache/*", "~/.config/gcloud/logs/*", "~/.azure/logs/*", "~/.cache/terraform/*", "~/.grafana/cache/*", "~/.prometheus/data/wal/*", "~/.jenkins/workspace/*/target/*", "~/.cache/gitlab-runner/*", "~/.github/cache/*", "~/.circleci/cache/*", "~/.sonar/*" ] ), rule( id: "developer.language-caches", choice: .developer, title: "Other language tool caches", risk: .medium, targets: [ "~/.bundle/cache/*", "~/.composer/cache/*", "~/Library/Caches/composer/*", "~/.nuget/packages/*", "~/.cache/bazel/*", "~/.cache/zig/*", "~/Library/Caches/deno/*", "~/.hex/cache/*", "~/.cabal/packages/*", "~/.opam/download-cache/*" ] ), rule( id: "developer.database-api-caches", choice: .developer, title: "Database and API tool caches", risk: .medium, targets: [ "~/Library/Caches/com.sequel-ace.sequel-ace/*", "~/Library/Caches/com.eggerapps.Sequel-Pro/*", "~/Library/Caches/redis-desktop-manager/*", "~/Library/Caches/com.navicat.*", "~/Library/Caches/com.dbeaver.*", "~/Library/Caches/com.redis.RedisInsight", "~/Library/Caches/com.postmanlabs.mac/*", "~/Library/Caches/com.konghq.insomnia/*", "~/Library/Caches/com.tinyapp.TablePlus/*", "~/Library/Caches/com.getpaw.Paw/*", "~/Library/Caches/com.charlesproxy.charles/*", "~/Library/Caches/com.proxyman.NSProxy/*" ] ), rule( id: "developer.misc-caches", choice: .developer, title: "Misc developer caches", risk: .medium, targets: [ "~/Library/Caches/com.unity3d.*/*", "~/Library/Caches/com.mongodb.compass/*", "~/Library/Caches/com.figma.Desktop/*", "~/Library/Caches/com.github.GitHubDesktop/*", "~/Library/Caches/SentryCrash/*", "~/Library/Caches/KSCrash/*", "~/Library/Caches/com.crashlytics.data/*", "~/Library/Application Support/Antigravity/Cache/*", "~/Library/Application Support/Antigravity/Code Cache/*", "~/Library/Application Support/Antigravity/GPUCache/*", "~/Library/Application Support/Antigravity/DawnGraphiteCache/*", "~/Library/Application Support/Antigravity/DawnWebGPUCache/*", "~/Library/Application Support/Codex/Cache/*", "~/Library/Application Support/Codex/Code Cache/*", "~/Library/Application Support/Codex/GPUCache/*", "~/Library/Application Support/Codex/DawnGraphiteCache/*", "~/Library/Application Support/Codex/DawnWebGPUCache/*", "~/Library/Application Support/Filo/production/Cache/*", "~/Library/Application Support/Filo/production/Code Cache/*", "~/Library/Application Support/Filo/production/GPUCache/*", "~/Library/Application Support/Filo/production/DawnGraphiteCache/*", "~/Library/Application Support/Filo/production/DawnWebGPUCache/*", "~/Library/Application Support/Claude/Cache/*", "~/Library/Application Support/Claude/Code Cache/*", "~/Library/Application Support/Claude/GPUCache/*", "~/Library/Application Support/Claude/DawnGraphiteCache/*", "~/Library/Application Support/Claude/DawnWebGPUCache/*", "~/Library/Application Support/Claude/sentry/*", "~/Library/Application Support/Claude/pending-uploads/*", "~/Library/Application Support/Qoder/Cache/*", "~/Library/Application Support/Qoder/CachedData/*", "~/Library/Application Support/Qoder/CachedExtensionVSIXs/*", "~/Library/Application Support/Qoder/Code Cache/*", "~/Library/Application Support/Qoder/GPUCache/*", "~/Library/Application Support/Qoder/DawnGraphiteCache/*", "~/Library/Application Support/Qoder/DawnWebGPUCache/*", "~/Library/Application Support/Qoder/logs/*", "~/.cache/prisma/*", "~/.cache/opencode/*" ] ), rule( id: "developer.shell-network-caches", choice: .developer, title: "Shell and network tool caches", risk: .low, targets: [ "~/.gitconfig.lock", "~/.gitconfig.bak*", "~/.oh-my-zsh/cache/*", "~/.config/fish/fish_history.bak*", "~/.bash_history.bak*", "~/.zsh_history.bak*", "~/.cache/pre-commit/*", "~/.cache/curl/*", "~/.cache/wget/*", "~/Library/Caches/curl/*", "~/Library/Caches/wget/*" ] ), rule( id: "developer.homebrew", choice: .developer, title: "Homebrew caches", risk: .medium, targets: [ "~/Library/Caches/Homebrew/*" ] ) ] private static let browserRules: [DiskCleanRule] = [ rule( id: "browser.safari", choice: .browser, title: "Safari cache", targets: [ "~/Library/Caches/com.apple.Safari/*" ] ), rule( id: "browser.chrome", choice: .browser, title: "Chrome and Chromium caches", targets: [ "~/Library/Caches/Google/Chrome/*", "~/Library/Application Support/Google/Chrome/*/Application Cache/*", "~/Library/Application Support/Google/Chrome/*/GPUCache/*", "~/Library/Application Support/Google/Chrome/component_crx_cache/*", "~/Library/Application Support/Google/Chrome/ShaderCache/*", "~/Library/Application Support/Google/Chrome/GrShaderCache/*", "~/Library/Application Support/Google/Chrome/GraphiteDawnCache/*", "~/Library/Application Support/Google/Chrome/*/Service Worker/ScriptCache/*", "~/Library/Application Support/Google/GoogleUpdater/crx_cache/*", "~/Library/Application Support/Google/GoogleUpdater/*.old", "~/Library/Caches/Chromium/*", "~/.cache/puppeteer/*" ], skipWhenProcessIsRunning: ["Google Chrome"] ), rule( id: "browser.edge", choice: .browser, title: "Edge cache", targets: [ "~/Library/Caches/com.microsoft.edgemac/*" ] ), rule( id: "browser.arc-dia", choice: .browser, title: "Arc and Dia caches", targets: [ "~/Library/Caches/company.thebrowser.Browser/*", "~/Library/Application Support/Arc/*/GPUCache/*", "~/Library/Application Support/Arc/ShaderCache/*", "~/Library/Application Support/Arc/GrShaderCache/*", "~/Library/Application Support/Arc/GraphiteDawnCache/*", "~/Library/Application Support/Arc/*/Service Worker/ScriptCache/*", "~/Library/Caches/company.thebrowser.dia/*" ], skipWhenProcessIsRunning: ["Arc"] ), rule( id: "browser.brave", choice: .browser, title: "Brave cache", targets: [ "~/Library/Caches/BraveSoftware/Brave-Browser/*", "~/Library/Application Support/BraveSoftware/Brave-Browser/*/Application Cache/*", "~/Library/Application Support/BraveSoftware/Brave-Browser/*/GPUCache/*", "~/Library/Application Support/BraveSoftware/Brave-Browser/component_crx_cache/*", "~/Library/Application Support/BraveSoftware/Brave-Browser/ShaderCache/*", "~/Library/Application Support/BraveSoftware/Brave-Browser/GrShaderCache/*", "~/Library/Application Support/BraveSoftware/Brave-Browser/GraphiteDawnCache/*", "~/Library/Application Support/BraveSoftware/Brave-Browser/*/Service Worker/ScriptCache/*" ], skipWhenProcessIsRunning: ["Brave Browser"] ), rule( id: "browser.helium-yandex", choice: .browser, title: "Helium and Yandex caches", targets: [ "~/Library/Caches/net.imput.helium/*", "~/Library/Application Support/net.imput.helium/*/GPUCache/*", "~/Library/Application Support/net.imput.helium/component_crx_cache/*", "~/Library/Application Support/net.imput.helium/extensions_crx_cache/*", "~/Library/Application Support/net.imput.helium/GrShaderCache/*", "~/Library/Application Support/net.imput.helium/GraphiteDawnCache/*", "~/Library/Application Support/net.imput.helium/ShaderCache/*", "~/Library/Application Support/net.imput.helium/*/Application Cache/*", "~/Library/Caches/Yandex/YandexBrowser/*", "~/Library/Application Support/Yandex/YandexBrowser/ShaderCache/*", "~/Library/Application Support/Yandex/YandexBrowser/GrShaderCache/*", "~/Library/Application Support/Yandex/YandexBrowser/GraphiteDawnCache/*", "~/Library/Application Support/Yandex/YandexBrowser/*/GPUCache/*" ] ), rule( id: "browser.firefox", choice: .browser, title: "Firefox cache", targets: [ "~/Library/Caches/Firefox/*", "~/Library/Application Support/Firefox/Profiles/*/cache2/*" ], skipWhenProcessIsRunning: ["Firefox"] ), rule( id: "browser.opera-vivaldi", choice: .browser, title: "Opera and Vivaldi caches", targets: [ "~/Library/Caches/com.operasoftware.Opera/*", "~/Library/Caches/com.vivaldi.Vivaldi/*", "~/Library/Application Support/Vivaldi/*/GPUCache/*", "~/Library/Application Support/Vivaldi/ShaderCache/*", "~/Library/Application Support/Vivaldi/GrShaderCache/*", "~/Library/Application Support/Vivaldi/GraphiteDawnCache/*", "~/Library/Application Support/Vivaldi/*/Service Worker/ScriptCache/*" ], skipWhenProcessIsRunning: ["Vivaldi"] ), rule( id: "browser.comet-orion-zen", choice: .browser, title: "Comet, Orion, and Zen caches", targets: [ "~/Library/Caches/Comet/*", "~/Library/Caches/com.kagi.kagimacOS/*", "~/Library/Caches/zen/*" ] ), DiskCleanRule( id: "browser.service-worker", choice: .browser, title: "Browser Service Worker caches", risk: .medium, targets: [.dynamic(.serviceWorkerCache)] ), DiskCleanRule( id: "browser.old-versions", choice: .browser, title: "Old browser versions", risk: .medium, targets: [.dynamic(.oldBrowserVersions)] ) ] private static func rule( id: String, choice: DiskCleanChoice, title: String, risk: DiskCleanRisk = .low, targets: [String], skipWhenProcessIsRunning: [String] = [], requiresAdmin: Bool = false ) -> DiskCleanRule { DiskCleanRule( id: id, choice: choice, title: title, risk: risk, targets: targets.map { .path($0) }, skipWhenProcessIsRunning: skipWhenProcessIsRunning, requiresAdmin: requiresAdmin ) } }