Borrowing it
Nothing to install: this file belongs to wintermeyer/heinzel. Take a copy, put it at the same path in your own repository, and replace the rules that are about this project with yours.
curl -O https://raw.githubusercontent.com/wintermeyer/heinzel/main/.claude/skills/heinzel-macos-cleanup/SKILL.mdgit clone --depth 1 https://github.com/wintermeyer/heinzelWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/wintermeyer/heinzel/heinzel-macos-cleanup)<a href="https://agentmods.dev/skills/wintermeyer/heinzel/heinzel-macos-cleanup"><img src="https://agentmods.dev/badge/skills/wintermeyer/heinzel/heinzel-macos-cleanup/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/wintermeyer/heinzel/heinzel-macos-cleanup"><img src="https://agentmods.dev/badge/skills/wintermeyer/heinzel/heinzel-macos-cleanup.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00112 | $0.01127 |
| Opus 5.5 | $0.00045 | $0.00451 |
| Sonnet 5.5 | $0.00022 | $0.00225 |
| Haiku 4.5 | $0.00011 | $0.00113 |
Grade C, and why
heinzel-macos-cleanup scanned grade C with 1 finding against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 26d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Recursive force deletehighDestructive command
rm -rf with a variable or a broad path is one typo away from removing the wrong tree.
`rm -rf`. How it starts
The opening of the file, as written. The whole thing — 109 lines — stays where its author put it; the contents beside it link to each section on GitHub.
heinzel-macos-cleanup
Two modes on a macOS machine, local or over SSH:
- Orphans: leftovers of apps that are no longer installed.
- Uninstall: one installed app with everything it created.
Never run automatically. Only on explicit user request. The heinzel first-connection pipeline still applies first.
Workflow
-
Load overrides. Apply the heinzel override chain (later wins):
memory/custom-rules/heinzel-macos-cleanup.mdif present.memory/servers/<hostname>/memory.md.memory/servers/<hostname>/rules.mdif present.memory/custom-rules/all.mdis already loaded by the session-start preflight.
-
Check the scanner runtime. The scanner needs the Python of the Command Line Tools. Probe:
xcode-select -p && /usr/bin/python3 --versionIf the probe fails, do not install anything. On a fresh Mac,
/usr/bin/python3opens an install dialog, and over SSH no one can answer it. Fall back to the manual probes inreferences/locations.mdand say so in the report. -
Scan. The scanner only reads. It prints JSON.
Local:
/usr/bin/python3 \ .claude/skills/heinzel-macos-cleanup/scripts/scan.py orphansRemote (script on stdin, SSH options from
CLAUDE.md):ssh <options> user@host /usr/bin/python3 - orphans \ < .claude/skills/heinzel-macos-cleanup/scripts/scan.pyLog in as the user whose apps you clean up, never as root: the scanner reads its own user's Library and refuses root. Ask for the user if the server memory names none.
/Libraryentries needsudoat removal (references/removal.md).For the uninstall mode, pass
app "<name>"instead oforphans. A name, bundle id or.apppath works. Over SSH, the remote shell splits the arguments again, so quote twice:app "'Microsoft Teams'". If the result listscandidates, ask which path is meant and rerun with that path. -
Read
unreadable. Paths listed there need Full Disk Access for the terminal app (or forsshd-keygen-wrapperover SSH). Report them. Do not guess their contents. -
Verify every candidate. The scanner classifies by name and bundle id. Before proposing a removal, confirm it on the live system (
rules/verify-before-reporting.md). The checks per class are inreferences/classification.md. -
Report in the format of
references/report-format.md. -
Ask per group. Propose removal for
orphanentries and forvendorentries that verification proved orphaned. Never proposeappleorinstalled. Offercacheas a separate group. Offercustomandunclearentries only one by one, with the finding that makes each one safe. -
Remove only what the user approved, as described in
references/removal.md. Always move to the Trash. Neverrm -rf. -
Verify absence. Test each approved path again, or rerun the scanner. Report what is gone and what failed.
-
Log. Journal and local changelog per
rules/changelog.md:
What ships with it
6 files beside SKILL.md in the same directory: the scripts, references and assets a skill reads on demand. Not counted in the per-session cost; read them before you install if any of them is executable.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 26d ago First seen · 109 lines · 112 tokens per session scan C db30bfb1e248
heinzel-macos-cleanup is a skill published in the GitHub repository wintermeyer/heinzel (101 stars, last pushed 6d ago), licensed MIT. It adds 112 tokens to every session and 1,127 once invoked, about $0.0004 per session on Opus 5.5. A static security scan graded it C with 1 finding (recursive force delete). No closer match exists in the catalogue, so it is treated as the original; first seen 2026-10-02.
Other skills, from other repositories
warpctrl
Control and inspect the currently running local Warp application with the warpctrl CLI. Use this skill whenever the user asks the agent to manipulate Warp's own windows, tabs, panes, sessions, input buffer, themes, or UI surfaces; open a file in Warp; inspect local Warp state; or explain how to invoke Warp Control…
change-keybinding
Customize Warp keyboard shortcuts (keybindings, keymappings) by editing the user's keybindings.yaml file. Use when the user asks to remap a key combination, rebind an action, change a shortcut, or remove a default keybinding (e.g. "change ctrl+space to ctrl+s", "rebind the command palette to cmd+p", "remove the…
create-tab-config
Create new Warp tab config TOML files from natural-language requests. Use when the user wants a new tab config, a new tab layout, or asks for a slash command to generate a tab config.
Google Workspace integration — Gmail, Drive, Calendar, Contacts, Tasks, and Sheets via gogcli.
notion
Read, create, update, and manage Notion pages, databases, and blocks.
options
Show the user several alternative pieces of content side by side — code, commands, config, message drafts, any markdown — as one tabbed card they can read and copy. Use it whenever you'd otherwise dump two or more variants of the same thing into your reply.