automating-mac-apps — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited automating-mac-apps (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
JXA and AppleScript are legacy (last major updates: 2015-2016). Modern alternatives:
Test scripts on target macOS due to:
1) Identify target app + dictionary using Script Editor. 2) Prototype a minimal command that works.
tell application "Finder" to get name of first item in desktop3) Decide language using the rules above. 4) Harden: add error handling, timeouts, and permission checks.
try { ... } catch (e) { console.log('Error:', e.message); }try ... on error errMsg ... end try5) Validate: run a read-only command and check outputs.
osascript -e 'tell application "Finder" to get name of home'6) Integrate via osascript for CLI or pipeline use. 7) UI scripting fallback only when the dictionary is missing/incomplete.
tell application "System Events" to click button 1 of window 1 of process "App"Application('System Events').processes.byName('App').windows[0].buttons[0].click()Application("App").running() returns trueskills/automating-mac-apps/scripts/request_automation_permissions.sh (or .py).skills/automating-<app>/scripts/set_up_<app>_automation.{sh,py} (calendar, notes, mail, keynote, excel, reminders).skills/automating-voice-memos/scripts/set_up_voice_memos_automation.sh to activate app + check data paths; enable Accessibility + consider Full Disk Access.PyXA (Python for macOS Automation) - Preferred for new projects:
app.lists().reminders().title()# Install PyXA
pip install mac-pyxa
# Or with pip3 explicitly
pip3 install mac-pyxa
# Requirements:
# - Python 3.10+ (check with: python3 --version)
# - macOS 12+ (Monterey or later recommended)
# - PyObjC is installed automatically as a dependency
# Verify installation
python3 -c "import PyXA; print(f'PyXA {PyXA.__version__} installed successfully')"Note: All app-specific skills in this plugin that show PyXA examples assume PyXA is installed. See this section for installation.
import PyXA
# Launch Safari and navigate
safari = PyXA.Safari()
safari.activate()
safari.open_location("https://example.com")
# Get current tab URL
current_url = safari.current_tab.url
print(f"Current URL: {current_url}")import PyXA
reminders = PyXA.Reminders()
work_list = reminders.lists().by_name("Work")
# Add new reminder
new_reminder = work_list.reminders().push({
"name": "Review PyXA documentation",
"body": "Explore modern macOS automation options"
})PyXA Official Resources:
PyObjC (Python-Objective-C Bridge) - For Low-Level macOS Integration:
pip install pyobjc
# Installs bridges for major frameworksfrom Foundation import NSAppleScript
# Execute AppleScript from Python
script_source = '''
tell application "Safari"
return URL of current tab
end tell
'''
script = NSAppleScript.alloc().initWithSource_(script_source)
result, error = script.executeAndReturnError_(None)
if error:
print(f"Error: {error}")
else:
print(f"Current Safari URL: {result.stringValue()}")from ScriptingBridge import SBApplication
# Control Mail app
mail = SBApplication.applicationWithBundleIdentifier_("com.apple.Mail")
inbox = mail.inboxes()[0] # Access first inbox
# Get unread message count
unread_count = inbox.unreadCount()
print(f"Unread messages: {unread_count}")PyObjC Official Resources:
JXA has no updates since 2016. Use PyXA for new projects when possible.
automating-[app] skills as needed)ci-cd-tcc for advanced permission management in automated environmentsmastering-applescript for AppleScript-focused workflowsPermission Management:
Official Apple Security Guidance:
JSON.stringify(result) in JXA.console.log(JSON.stringify({files: files, count: files.length}))osascript exits with 0 for success, non-zero for failure.automating-mac-apps/references/basics.mdautomating-mac-apps/references/applescript-basics.mdautomating-mac-apps/references/recipes.mdautomating-mac-apps/references/cookbook.mdautomating-mac-apps/references/applescript-performance.mdautomating-mac-apps/references/ci-cd-tcc.mdautomating-mac-apps/references/shell-environment.mdautomating-mac-apps/references/ui-scripting-inspector.mdautomating-mac-apps/references/pyxa-core-api-reference.mdautomating-mac-apps/references/pyxa-basics.md (Modern Python automation fundamentals)automating-mac-apps/references/applescript-to-pyxa-conversion.md (Migration guide with examples)automating-mac-apps/references/translation-checklist.md (Comprehensive guide with examples and pitfalls)automating-mac-apps/references/helpers.jswhose Batching Patterns: automating-mac-apps/references/whos-batching.mdautomating-mac-apps/references/dictionary-strategies.mdautomating-mac-apps/references/applescript-asobjc.mdRelated Skills:
web-browser-automation: Complete browser automation guide (Chrome, Edge, Brave, Arc)~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.