@microcursor/node-axkit
Version:
Native macOS Accessibility API integration for Node.js
173 lines (128 loc) • 4.72 kB
Markdown
# node-axkit
A NodeJS module with native Swift code for macOS Accessibility API integration, providing TypeScript interfaces for seamless window management and automation.
## Features
- **macOS Accessibility API**: List and focus windows programmatically
- **Permission Management**: Request and wait for accessibility permissions
- **Native Swift Performance**: Leverage Swift's performance for system operations
- **TypeScript Support**: Full TypeScript definitions for type safety and IntelliSense
- **Async Support**: Properly typed async functions with Promise support
- **Cross-Platform Ready**: Designed for macOS (Swift runtime required)
## Installation
```bash
npm install @microcursor/node-axkit
```
## Usage
### TypeScript/ES6 Imports
```typescript
import {
checkAccessibilityPermission,
awaitAccessibilityPermission,
listWindows,
focusWindow
} from '@microcursor/node-axkit';
// Check if accessibility permissions are granted
if (!checkAccessibilityPermission()) {
console.log('Requesting accessibility permissions...');
// Request permissions and wait up to 60 seconds
const granted = await awaitAccessibilityPermission(60000);
if (!granted) {
console.log('Permissions required - restart app after granting');
return;
}
}
// List all Safari windows
const windows = await listWindows('com.apple.Safari');
console.log('Safari windows:', windows);
// Focus a specific window
if (windows.length > 0) {
await focusWindow('com.apple.Safari', windows[0]);
}
```
### CommonJS Require
```javascript
const {
checkAccessibilityPermission,
awaitAccessibilityPermission,
listWindows,
focusWindow
} = require('@microcursor/node-axkit');
// Check permissions and use async/await
async function main() {
if (!checkAccessibilityPermission()) {
const granted = await awaitAccessibilityPermission(60000);
if (!granted) return;
}
const windows = await listWindows('com.apple.finder');
if (windows.length > 0) {
await focusWindow('com.apple.finder', windows[0]);
}
}
main();
```
## API Reference
### `checkAccessibilityPermission(): boolean`
Check if accessibility permissions are granted.
- **Returns:** `true` if permissions are granted, `false` otherwise
### `requestAccessibilityPermission(): boolean`
Request accessibility permissions with system dialog.
- **Returns:** Current permission state (may require app restart to detect changes)
### `awaitAccessibilityPermission(timeout: number): Promise<boolean>`
Request permissions and wait for them to be granted.
- **Parameters:** `timeout` in milliseconds (default: 30000)
- **Returns:** Promise that resolves to `true` if granted, `false` if timeout
### `listWindows(bundleId: string): Promise<string[]>`
List all windows for a specific application.
- **Parameters:** Application bundle ID (e.g., "com.apple.Safari")
- **Returns:** Promise that resolves to array of window titles
### `focusWindow(bundleId: string, windowTitle: string): Promise<string>`
Focus a specific window.
- **Parameters:** Application bundle ID and exact window title
- **Returns:** Promise that resolves to success message
## Common Bundle IDs
- **Finder**: `com.apple.finder`
- **Safari**: `com.apple.Safari`
- **Chrome**: `com.google.Chrome`
- **VS Code**: `com.microsoft.VSCode`
- **Terminal**: `com.apple.Terminal`
- **iPhone Simulator**: `com.apple.iphonesimulator`
- **Xcode**: `com.apple.dt.Xcode`
## Permission Setup
1. **First run**: Your app will show a system dialog requesting accessibility permissions
2. **Grant permissions**: Click "Open System Preferences" and add your app to the Accessibility list
3. **Restart**: You may need to restart your application for permissions to be detected
4. **Verify**: Use `checkAccessibilityPermission()` to confirm permissions are granted
## Examples
See the [examples](./examples/) directory for comprehensive usage examples:
- **Basic Usage**: Complete TypeScript example with 7 different accessibility scenarios
- **Permission handling**: Request and wait for permissions
- **Window management**: List and focus windows across multiple applications
## Development
### Building the Package
```bash
# Build both Swift and TypeScript
pnpm run build
# Build Swift only (debug)
pnpm run build:swift:debug
# Build TypeScript only
pnpm run build:ts
# Development build (debug mode)
pnpm run build:debug
# Watch mode for development
pnpm run dev
```
### Testing
```bash
pnpm run test
```
### Cleaning
```bash
pnpm run clean
```
## Requirements
- Node.js 16+
- macOS (for Accessibility API)
- Swift runtime (included with macOS)
- TypeScript 5.8+ (for development)
- Accessibility permissions (granted on first use)
## License
[MIT](LICENSE)