Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Generate entitlements.plist with appropriate sandbox capabilities for macOS applications
.claude/skills/a5c-ai-macos-entitlements-generator/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 253% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 268% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 267% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 27% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 201% | 0% |
Generate entitlements.plist with appropriate sandbox capabilities for macOS applications. This skill configures the App Sandbox, hardened runtime, and specific entitlements required for app functionality.
json{ "type": "object", "properties": { "projectPath": { "type": "string", "description": "Path to the Xcode project" }, "appFeatures": { "type": "array", "items": { "enum": [ "network-client", "network-server", "file-read", "file-write", "downloads-read", "downloads-write", "pictures-read", "pictures-write", "music-read", "music-write", "movies-read", "movies-write", "user-selected-files", "camera", "microphone", "usb", "bluetooth", "print", "calendar", "contacts", "location", "apple-events", "jit", "unsigned-memory" ] } }, "appGroups": { "type": "array", "items": { "type": "string" }, "description": "App group identifiers" }, "keychainGroups": { "type": "array", "items": { "type": "string" }, "description": "Keychain access groups" }, "disableSandbox": { "type": "boolean", "default": false, "description": "Disable sandbox (not recommended)" }, "isMASApp": { "type": "boolean", "default": false, "description": "Target Mac App Store" } }, "required": ["projectPath", "appFeatures"] }
json{ "type": "object", "properties": { "success": { "type": "boolean" }, "files": { "type": "array", "items": { "type": "object", "properties": { "path": { "type": "string" }, "type": { "enum": ["entitlements", "info-plist-additions"] } } } }, "warnings": { "type": "array", "items": { "type": "string" } } }, "required": ["success"] }
xml<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <!-- App Sandbox --> <key>com.apple.security.app-sandbox</key> <true/> <!-- Network access --> <key>com.apple.security.network.client</key> <true/> <!-- User-selected files (via Open/Save panels) --> <key>com.apple.security.files.user-selected.read-write</key> <true/> </dict> </plist>
xml<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>com.apple.security.app-sandbox</key> <true/> <!-- Camera access --> <key>com.apple.security.device.camera</key> <true/> <!-- Microphone access --> <key>com.apple.security.device.microphone</key> <true/> <!-- Network for streaming --> <key>com.apple.security.network.client</key> <true/> <key>com.apple.security.network.server</key> <true/> <!-- Save recordings --> <key>com.apple.security.files.user-selected.read-write</key> <true/> <key>com.apple.security.files.movies.read-write</key> <true/> </dict> </plist>
xml<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>com.apple.security.app-sandbox</key> <true/> <!-- JIT compilation (NOT allowed in Mac App Store) --> <key>com.apple.security.cs.allow-jit</key> <true/> <!-- Disable library validation for plugins --> <key>com.apple.security.cs.disable-library-validation</key> <true/> <!-- File access --> <key>com.apple.security.files.user-selected.read-write</key> <true/> <key>com.apple.security.network.client</key> <true/> </dict> </plist>
xml<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <!-- Hardened runtime (required for notarization) --> <key>com.apple.security.cs.allow-jit</key> <false/> <key>com.apple.security.cs.allow-unsigned-executable-memory</key> <false/> <key>com.apple.security.cs.disable-library-validation</key> <false/> <!-- App-specific needs --> <key>com.apple.security.automation.apple-events</key> <true/> <key>com.apple.security.device.audio-input</key> <true/> </dict> </plist>
xml<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>com.apple.security.app-sandbox</key> <true/> <!-- App Groups for sharing data with extensions --> <key>com.apple.security.application-groups</key> <array> <string>$(TeamIdentifierPrefix)com.mycompany.myapp</string> </array> <!-- Keychain access groups --> <key>keychain-access-groups</key> <array> <string>$(AppIdentifierPrefix)com.mycompany.myapp</string> </array> <key>com.apple.security.network.client</key> <true/> </dict> </plist>
| Key | Description | |-----|-------------| | files.user-selected.read-only | Read user-selected files | | files.user-selected.read-write | Read/write user-selected files | | files.downloads.read-only | Read Downloads folder | | files.downloads.read-write | Read/write Downloads folder | | files.pictures.read-only | Read Pictures folder | | files.music.read-only | Read Music folder | | files.movies.read-only | Read Movies folder |
| Key | Description | |-----|-------------| | network.client | Outgoing connections | | network.server | Incoming connections |
| Key | Description | |-----|-------------| | device.camera | Camera access | | device.microphone | Microphone access | | device.usb | USB device access | | device.bluetooth | Bluetooth access | | print | Printing |
| Key | Description | |-----|-------------| | cs.allow-jit | Allow JIT compilation | | cs.allow-unsigned-executable-memory | Allow unsigned executable memory | | cs.disable-library-validation | Load arbitrary plugins | | cs.disable-executable-page-protection | Disable W^X |
When using certain entitlements, add corresponding privacy descriptions:
xml<!-- Info.plist additions --> <key>NSCameraUsageDescription</key> <string>This app needs camera access for video calls.</string> <key>NSMicrophoneUsageDescription</key> <string>This app needs microphone access for audio recording.</string> <key>NSAppleEventsUsageDescription</key> <string>This app needs to control other applications for automation.</string> <key>NSLocationUsageDescription</key> <string>This app needs your location for local weather.</string>
macos-notarization-workflow - Code signing and notarizationmacos-codesign-workflow - Code signingsecurity-hardening process - Security auditswiftui-macos-expert - macOS developmentdesktop-security-auditor - Security review| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 5,958 | 9,645 | +62% | 1 | 1 | 0% | 1,369 | 4,833 | +253% | 0 | 0 | — |
case-02 | fail→pass | 4,262 | 3,031 | -29% | 1 | 1 | 0% | 830 | 3,051 | +268% | 0 | 0 | — |
case-03 | pass→pass | 7,330 | 3,403 | -54% | 1 | 1 | 0% | 1,487 | 3,083 | +107% | 0 | 0 | — |
case-04 | pass→pass | 7,537 | 4,026 | -47% | 1 | 1 | 0% | 1,612 | 3,147 | +95% | 0 | 0 | — |
case-05 | fail→pass | 4,468 | 2,394 | -46% | 1 | 1 | 0% | 780 | 2,862 | +267% | 0 | 0 | — |
case-06 | pass→pass | 3,808 | 3,884 | +2% | 1 | 1 | 0% | 685 | 3,160 | +361% | 0 | 0 | — |
case-07 | fail→pass | 14,613 | 4,786 | -67% | 1 | 1 | 0% | 2,617 | 3,317 | +27% | 0 | 0 | — |
case-08 | pass→pass | 7,043 | 3,045 | -57% | 1 | 1 | 0% | 1,370 | 2,991 | +118% | 0 | 0 | — |
case-09 | pass→pass | 4,072 | 2,531 | -38% | 1 | 1 | 0% | 762 | 2,869 | +277% | 0 | 0 | — |
case-10 | pass→pass | 2,272 | 2,381 | +5% | 1 | 1 | 0% | 385 | 2,796 | +626% | 0 | 0 | — |
case-11 | pass→pass | 2,678 | 2,667 | -0% | 1 | 1 | 0% | 439 | 2,864 | +552% | 0 | 0 | — |
case-12 | pass→pass | 2,955 | 2,261 | -23% | 1 | 1 | 0% | 500 | 2,829 | +466% | 0 | 0 | — |
case-13 | fail→pass | 5,188 | 2,854 | -45% | 1 | 1 | 0% | 971 | 2,924 | +201% | 0 | 0 | — |
case-14 | pass→pass | 3,386 | 3,503 | +3% | 1 | 1 | 0% | 557 | 3,040 | +446% | 0 | 0 | — |
case-15 | pass→pass | 4,016 | 3,229 | -20% | 1 | 1 | 0% | 662 | 2,966 | +348% | 0 | 0 | — |
case-16 | pass→pass | 3,868 | 3,675 | -5% | 1 | 1 | 0% | 704 | 3,113 | +342% | 0 | 0 | — |
case-17 | fail→pass | 4,490 | 2,142 | -52% | 1 | 1 | 0% | 867 | 2,883 | +233% | 0 | 0 | — |
case-18 | fail→pass | 5,153 | 2,045 | -60% | 1 | 1 | 0% | 986 | 2,810 | +185% | 0 | 0 | — |
case-19 | pass→pass | 7,776 | 5,793 | -26% | 1 | 1 | 0% | 1,259 | 3,245 | +158% | 0 | 0 | — |
case-20 | pass→pass | 4,885 | 2,266 | -54% | 1 | 1 | 0% | 884 | 2,777 | +214% | 0 | 0 | — |
case-21 | pass→pass | 3,628 | 3,669 | +1% | 1 | 1 | 0% | 616 | 3,103 | +404% | 0 | 0 | — |
case-22 | pass→pass | 9,680 | 6,234 | -36% | 1 | 1 | 0% | 1,705 | 3,669 | +115% | 0 | 0 | — |
case-23 | pass→pass | 3,660 | 4,203 | +15% | 1 | 1 | 0% | 553 | 3,235 | +485% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted. The headline lift of +30 percentage points is the difference between those two pass rates over the 23 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.