From spamhole
First-run setup for SpamHole. Creates the user's spam-corpus workspace (configurable path) and seeds the JSON inventories — tracking-domains, sender-blocklist, processed-emails, ad-trackers. Use when the user first installs the plugin or wants to point it at a different corpus location.
npx claudepluginhub danielrosehill/claude-code-plugins --plugin spamholeThis skill uses the workspace's default tool permissions.
Scaffold a per-user SpamHole corpus — the directory tree that holds spam samples, blocklists, and tracking inventories. Every other skill in this plugin reads/writes into this corpus.
Guides Next.js Cache Components and Partial Prerendering (PPR): 'use cache' directives, cacheLife(), cacheTag(), revalidateTag() for caching, invalidation, static/dynamic optimization. Auto-activates on cacheComponents: true.
Guides building MCP servers enabling LLMs to interact with external services via tools. Covers best practices, TypeScript/Node (MCP SDK), Python (FastMCP).
Share bugs, ideas, or general feedback.
Scaffold a per-user SpamHole corpus — the directory tree that holds spam samples, blocklists, and tracking inventories. Every other skill in this plugin reads/writes into this corpus.
Resolve in this order:
${CLAUDE_USER_DATA:-$HOME/.local/share/claude}/spamhole/config.json exists and has corpus_path, use that.${CLAUDE_USER_DATA:-$HOME/.local/share/claude}/spamhole/corpus/.If the user wants the corpus inside a private GitHub repo (recommended — raw .eml may contain personal data), ask for the repo path and use that. Make sure the corpus directory is gitignored or that the user understands the privacy trade-off.
Confirm the resolved path with the user. Create it if it doesn't exist.
Build the layout:
<corpus>/
├── inputs/
│ └── emails/
│ └── sanitised/ # Redacted samples safe to share
├── data/
│ ├── tracking-domains.json # array — pixel + click-tracker hosts
│ ├── ad-trackers.json # array — adsense / DSP / analytics pixel hosts
│ ├── sender-blocklist.json # array — blocked senders
│ └── processed-emails.json # array — analysis log
├── outputs/
│ └── analyses/ # per-email markdown reports
└── exports/ # generated DNS blocklists, filter rules, etc.
Initialize each JSON file as an empty array [] if it doesn't exist. Never overwrite an existing inventory.
Write <corpus>/README.md summarising what's in each directory and reminding the user this is their personal corpus.
Persist the resolved path to ${CLAUDE_USER_DATA:-$HOME/.local/share/claude}/spamhole/config.json so other skills can find it without re-prompting:
{ "corpus_path": "/abs/path/to/corpus" }
Suggest (do not require) committing the corpus to a private repo for backup, and offer to add a .gitignore that excludes raw .eml while tracking the JSON inventories and sanitised samples.
Report: corpus path, what was created vs already existed, suggested next step (capture-spam-sample).