id = "mole" name = "Mole" homepage = "https://mole.fit" description = "Clean, uninstall, analyze, optimize, and monitor your Mac. Free open-source CLI, plus a native Mac app." # The 192px favicon from mole.fit. icon = "https://mole.fit/img/favicon-mole-192-ba32c29d.png" # The command a user types is `mo` — every example in the README runs it # (`mo clean`, `mo purge`, `mo --help`). Homebrew's formula is named `mole`, # so both spellings are here. executables = ["mo", "mole"] platforms = ["macos"] [dotfiles] # tw93/Mole's README (https://github.com/tw93/Mole), the section describing # `mo clean --whitelist` and `mo purge --paths`: # # ~/.config/mole/whitelist selections from `mo clean --whitelist` # ~/.config/mole/purge_paths custom scan directories for `mo purge --paths` # ~/Library/Logs/mole/operations.log cleanup activity log # # The Homebrew cask `mole-app` names the same directory in its `zap trash:` # list (~/.config/mole) alongside ~/Library/Logs/mole, which is corroboration # from a second place. # # Written as a literal ~/.config path, not [configHome]: nothing in Mole's # documentation says it reads $XDG_CONFIG_HOME, and Mole is macOS-only, where # [configHome] and ~/.config are the same directory anyway. paths = [ "~/.config/mole/whitelist", "~/.config/mole/purge_paths", ] # ~/Library/Logs/mole/operations.log is the activity log named in the same # README paragraph (it can be turned off with MO_NO_OPLOG=1). It is not under # any path listed above, so there is nothing to carve out of what is; it is # named here so a consumer syncing whole directories skips it. exclude = ["~/Library/Logs/mole/"] # Mole signs in to nothing and stores no credential. secret = [] # Each subcommand reads the file and exits. side_effect = false # No machine_lines. Both files are lists the user built by hand — the apps and # caches to spare, the project directories to scan — and carrying them to the # next Mac is the point of syncing them. They do contain absolute paths, but # unlike a cache-dir setting those paths *are* the content, so blanking them # would leave an empty file rather than a portable one. [commands] format = 1 label = "Mole" description = "Mole maintenance commands. Only the cleanup preview is covered." quality = "ai-draft" parser = { end_of_options = "--", interleave = "permute", long_equals = true, short_attached = false, short_bundles = false } [[commands.subcommand]] path = ["clean"] label = "Clean up disk space" description = "Remove caches, logs, temporary files and leftovers of uninstalled apps. Defaults to previewing with --dry-run; the whitelist editor is left out." [[commands.subcommand.source]] id = "help" kind = "help" revision = "mo clean --help" evidence = """Usage: mo clean [OPTIONS] Options: --dry-run, -n Preview cleanup without making changes --external PATH Clean OS metadata from a mounted external volume --debug Show detailed operation logs""" [[commands.subcommand.field]] id = "dry_run" label = "Preview only (dry run)" type = "boolean" option = ["--dry-run", "-n"] sources = ["help"] [[commands.subcommand.field]] id = "external" label = "External volume to clean" type = "path" option = ["--external"] path = { kind = "directory", role = "input" } sources = ["help"] [[commands.subcommand.field]] id = "debug" label = "Detailed logs" type = "boolean" option = ["--debug"] sources = ["help"] [[commands.subcommand.task]] id = "preview" label = "Preview cleanup" fields = ["dry_run"] required = ["dry_run"] set = { dry_run = [true] } [[commands.subcommand.group]] id = "basic" label = "Basic" fields = ["dry_run", "external", "debug"]