macOS Tahoe: ClaudeNotifier.app lacks NSAppleEventsUsageDescription — Ghostty exact-tab focus silently denied (follow-up to #47/#72)
#113 opened on Jul 13, 2026
Repository metrics
- Stars
- (759 stars)
- PR merge metrics
- (PR metrics pending)
Description
Summary
On macOS Tahoe (Darwin 25.x), Ghostty exact-tab click-to-focus never works and always falls back to AXDocument window-level focus, because ClaudeNotifier.app ships without NSAppleEventsUsageDescription in its Info.plist. macOS silently denies Apple Events from app bundles that lack the usage-description key — no Automation prompt is ever shown, and (until the key is added) no entry is even recorded in System Settings → Privacy & Security → Automation, so the user cannot grant the permission at all.
This is the same class of problem as #47, but one layer deeper: #47 moved regular terminals off -execute osascript, while the Ghostty exact-tab path (added in v1.37.0 for #72) still runs osascript from the ClaudeNotifier context at click time — where TCC needs the plist key to attribute (and record) the request.
Environment
- Plugin v1.40.0
- macOS Tahoe (Darwin 25.4.0, arm64)
- Ghostty 1.3.1 (AppleScript dictionary available)
- Terminal ID present in session state (verified) — so the by-ID path was taken and failed
Current Info.plist (v1.40.0 ClaudeNotifier.app)
CFBundleExecutable, CFBundleIconFile, CFBundleIconName, CFBundleIdentifier,
CFBundleName, CFBundlePackageType, CFBundleShortVersionString, CFBundleVersion,
LSMinimumSystemVersion, NSUserNotificationAlertStyle
No NSAppleEventsUsageDescription.
Repro
- Install plugin on macOS Tahoe, Ghostty ≥ 1.3, get a session's
ghostty_terminal_idcaptured. - Click a notification from a different Ghostty tab.
- Observed: window-level focus only (last-active tab shown); no Automation prompt; no ClaudeNotifier entry under Privacy & Security → Automation.
Fix (verified locally)
Add to ClaudeNotifier.app's Info.plist at build time:
<key>NSAppleEventsUsageDescription</key>
<string>Claude Notifier focuses the exact terminal tab of the Claude Code session when you click a notification.</string>
After patching the plist (and re-signing), the denial is finally recorded, the ClaudeNotifier → Ghostty toggle appears in the Automation pane, and once enabled, exact-tab focus works reliably. Note Tahoe still doesn't show the interactive prompt from a notification-click context — but with the key present the recorded entry gives users a way to grant it. Consider also pre-requesting Automation on first launch from a normal context (as suggested in #72) so the prompt appears somewhere the user can say yes.