Help us improve
Share bugs, ideas, or general feedback.
From claude-mac-guardian
This skill should be used when the user asks to "check machine security", "run a security audit", "is my mac secure", "scan my machine", "audit my mac", or mentions SIP, Gatekeeper, FileVault, firewall, login items, launch agents, SSH keys, or authorized_keys. Performs a read-only macOS security posture audit and writes a structured JSON result to ~/.mac-guardian/data/.
npx claudepluginhub dennisonbertram/claude-mac-guardian --plugin claude-mac-guardianHow this skill is triggered — by the user, by Claude, or both
Slash command
/claude-mac-guardian:machine-security-checkThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Performs a read-only posture audit of a macOS machine across system protections, persistence points, and credential surfaces, then writes the result to the shared data directory.
Mandates invoking relevant skills via tools before any response in coding sessions. Covers access, priorities, and adaptations for Claude Code, Copilot CLI, Gemini CLI.
Share bugs, ideas, or general feedback.
Performs a read-only posture audit of a macOS machine across system protections, persistence points, and credential surfaces, then writes the result to the shared data directory.
Trigger on phrases like: "check machine security", "security audit", "is my mac secure", "scan my machine", "audit my mac".
Run each check as a read-only shell command. Never prompt for or request sudo. If a command needs elevation and is not available without it, record the check with severity info and a detail of "not available without elevation" rather than requesting privileges.
System protections (severity guidance in parens)
csrutil status. Expect "enabled". If disabled, severity critical.spctl --status. Expect "assessments enabled". If disabled, warn.fdesetup status. Expect "On". If "Off", critical. If not determinable, info.defaults read /Library/Preferences/com.apple.alf globalstate 2>/dev/null. 0 = off (warn), 1 or 2 = on (ok).defaults read /Library/Preferences/com.apple.SoftwareUpdate AutomaticCheckEnabled 2>/dev/null and related keys. Off is info.defaults read com.apple.screensaver askForPassword 2>/dev/null. Unset or 0 is warn.Persistence and startup
osascript -e 'tell application "System Events" to get the name of every login item' 2>/dev/null. List names; if any look unfamiliar, mark individual findings info.ls -la ~/Library/LaunchAgents 2>/dev/null. Report count and any with very recent mtime (<7 days) as info. Any unsigned binary target = warn.ls /Library/LaunchAgents /Library/LaunchDaemons 2>/dev/null. Report counts only (avoid flooding findings).crontab -l 2>/dev/null and atq 2>/dev/null. Any entries = info with the content in raw.Credential surfaces
~/.ssh/id_* (not .pub). For each, report type and whether it is encrypted (grep -q "ENCRYPTED" <key> or ssh-keygen -y -P "" -f <key> >/dev/null 2>&1). Unencrypted private keys = warn.~/.ssh/authorized_keys. Report line count. >0 entries = info with the comment fields (last field) listed.security list-keychains. Just report names as raw, no severity.Recent filesystem activity
find /Library/LaunchAgents /Library/LaunchDaemons ~/Library/LaunchAgents ~/.ssh -type f -mtime -7 2>/dev/null. Any result = info, list up to 20 paths.~/.zshrc ~/.bashrc ~/.bash_profile ~/.profile for curl | sh, wget | sh, eval \"\$(curl, or base64-decoded eval. Matches = warn.After collection, construct a single JSON envelope matching the shared schema:
{
"skill": "machine-security-check",
"timestamp": "<ISO8601 UTC>",
"severity": "<highest finding severity: ok|info|warn|critical>",
"summary": "<one-line human summary, e.g. 'All protections on. 2 informational items.'>",
"findings": [
{ "id": "sip", "severity": "ok", "title": "SIP enabled", "detail": "System Integrity Protection: enabled." }
],
"raw": { "<key>": "<trimmed raw output>" }
}
Write it to ~/.mac-guardian/data/machine-security-check-<ISOdate>.json. Use the helpers in ${CLAUDE_PLUGIN_ROOT}/scripts/_common.sh when scripting; or write directly using date +%Y-%m-%d for the filename.
After writing JSON:
daily-health-report), also render and open a standalone mini HTML report:
bash ${CLAUDE_PLUGIN_ROOT}/scripts/render-single.sh machine-security-checkdaily-health-report, return the JSON path only.sudo. If elevation would be required for a check, record it as informational.