---
name: apple-ecosystem
description: "macOS Apple ecosystem automation: Notes, Reminders, FindMy, iMessage, and desktop computer-use. Platform-specific tools for macOS."
version: 1.0.0
author: Hermes Agent
license: MIT
platforms: [macos]
metadata:
  hermes:
    tags: [Apple, macOS, Notes, Reminders, FindMy, iMessage, Desktop-Automation, Computer-Use]
    related_skills: []
---

# Apple Ecosystem (macOS)

Unified skill for automating macOS-native services and the desktop. All tools below require a Mac (they rely on macOS-specific CLIs, AppleScript, or the `computer_use` tool).

> **Platform restriction:** These sections only work on macOS. On Linux/Windows, skip with a note to the user.

---

## 1. Apple Notes (`memo` CLI)

Create, search, and edit Apple Notes from the terminal using the `memo` CLI.

### Prerequisites

```bash
brew install memo        # or install from https://github.com/mrled/memo
memo --version           # verify
```

### List and Search Notes

```bash
memo list                             # all notes
memo list --folder "Work"             # notes in a folder
memo search "meeting"                 # full-text search
memo search --title "standup"         # search titles only
```

### Create a Note

```bash
memo create "Standup Notes - $(date +%Y-%m-%d)" \
  --folder "Work" \
  --body "$(cat <<'EOF'
- Backend sprint progress
- CI failures on feature branch
- Action: fix auth middleware
EOF
)"
```

### Edit a Note

```bash
memo edit "Meeting Notes" --append --body "- Follow-up sent to team"
memo edit "Meeting Notes" --body "$(cat updated_body.txt)" --replace
```

### Read a Note

```bash
memo show "Meeting Notes"             # plain text
memo show "Meeting Notes" --json      # structured output
```

### Pitfalls

- Notes folder names are case-sensitive.
- Body content that includes special characters (quotes, backslashes) needs careful shell escaping — prefer `cat <<'EOF'` heredocs.
- `memo` can create duplicate titles; disambiguate with folder or use `memo show` to read the exact one.

---

## 2. Apple Reminders (`remindctl`)

Manage reminders from the terminal via the `remindctl` CLI.

### Prerequisites

```bash
brew install remindctl                 # or install from source
remindctl --version                    # verify
```

### Add a Reminder

```bash
remindctl add "Review PR #123" \
  --list "Work" \
  --due "today 5pm" \
  --priority high

remindctl add "Buy milk" \
  --list "Personal" \
  --due "tomorrow 9am"
```

### List and Complete

```bash
remindctl list --list "Work"          # show incomplete
remindctl list --list "Work" --all      # include completed
remindctl complete "Review PR #123"    # mark done
remindctl delete "Buy milk"             # remove permanently
```

### Recurring Reminders

```bash
remindctl add "Weekly team standup" \
  --list "Work" \
  --due "Monday 10am" \
  --repeat weekly
```

### Pitfalls

- Lists must already exist in the Reminders app before you can target them.
- `--due` parsing varies by locale; test the exact format with `remindctl add --dry-run` if supported.
- Completed reminders remain in the store unless deleted; use `--all` when searching for old items.

---

## 3. Find My (`findmy` CLI)

Track Apple devices and AirTags from the terminal using the `findmy` CLI.

### Prerequisites

```bash
brew install findmy                    # or install from https://github.com/schwarzr/FindMy
findmy --version                       # verify
```

### List Devices and Items

```bash
findmy devices                        # all Apple devices (Mac, iPhone, iPad, Watch)
findmy items                          # all AirTags and Find My Network items
findmy location --device "iPhone"      # last known location
```

### Location History and Notifications

```bash
findmy history --item "Keys AirTag" --last 24h
findmy notify --when-left "Keys AirTag" --address "Home"
```

### Pitfalls

- Requires the user to be signed into iCloud with Find My enabled.
- Location data is approximate and refreshed on a delay; it's not real-time GPS.
- Device names must match exactly what's shown in the Find My app.

---

## 4. iMessage (`imsg` CLI)

Send and receive iMessages/SMS via the `imsg` CLI on macOS.

### Prerequisites

```bash
brew install imsg                      # or npm install -g imsg
imsg --version                         # verify
```

### Send a Message

```bash
imsg send "+1-555-123-4567" "Meeting starts in 5 minutes"
imsg send "user@icloud.com" "Can you review the latest draft?"
```

### Send Media (Images)

```bash
imsg send "+1-555-123-4567" --attachment ~/Desktop/screenshot.png
```

### Receive / Read Recent

```bash
imsg list --limit 20                  # recent conversations
imsg read "+1-555-123-4567" --last 5  # last 5 messages from a contact
```

### Pitfalls

- The first message to a new number may prompt macOS permission dialogs; the user may need to approve manually.
- Group messages require a comma-separated recipient list; formatting varies by macOS version.
- `imsg` relies on the Messages app's AppleScript bridge — if Messages is not running, messages may queue silently.

---

## 5. macOS Desktop Computer Use

Drive the macOS desktop programmatically — screenshots, mouse, keyboard, scroll, drag — without stealing the user's cursor or keyboard focus.

### Prerequisites

The `computer_use` tool must be available in your Hermes profile (requires the macOS `computer_use` MCP or native tool). Load this skill whenever `computer_use` is present.

### Capabilities

| Action | Tool call | Notes |
|--------|-----------|-------|
| Screenshot | `computer_use(action="screenshot")` | Full screen or region |
| Mouse move | `computer_use(action="mouse_move", coordinate=[x, y])` | Does not steal cursor |
| Click | `computer_use(action="click", coordinate=[x, y], button="left")` | Works in background |
| Type | `computer_use(action="type", text="hello")` | Simulates keystrokes without focus grab |
| Key press | `computer_use(action="key_press", key="command+c")` | Modifier combos supported |
| Scroll | `computer_use(action="scroll", coordinate=[x, y], scroll=-3)` | Negative = down |
| Drag | `computer_use(action="drag", start=[x1, y1], end=[x2, y2])` | Smooth drag |

### Workflow: Click through a UI

```python
computer_use(action="screenshot")                                    # see current state
computer_use(action="mouse_move", coordinate=[200, 150])             # hover
computer_use(action="click", coordinate=[200, 150], button="left")  # click
computer_use(action="type", text="search term")                      # type
computer_use(action="key_press", key="return")                       # submit
computer_use(action="screenshot")                                    # verify result
```

### Workflow: Drag-and-drop

```python
computer_use(action="drag", start=[100, 100], end=[300, 300])
```

### Pitfalls

- Coordinates are screen-relative, not window-relative. If the window moves, hardcoded coordinates break.
- Menubar coordinates shift with screen resolution — always screenshot first to locate.
- The tool does NOT bring the target window to focus; it operates in the background. If a modal or alert blocks the target, clicks may land on the modal.
- Screen recording permission is required; the user must grant it in System Preferences > Security & Privacy > Screen Recording.
- Some apps (especially games) may block synthetic input at the OS level.

---

## 6. Combined Workflows

### Morning briefing automation

```bash
remindctl list --list "Work" --all | head -10
memo show "Daily Standup Notes"
findmy devices | grep "iPhone"
```

### On-call alert pipeline

```bash
findmy notify --when-left "Work MacBook" --address "Office"
# + cron job that sends an iMessage if the device leaves the geofence
```

---

## Resources

- **Apple Notes deeper:** `memo` docs at https://github.com/mrled/memo
- **Apple Reminders deeper:** `remindctl` docs at https://github.com/sfsam/remindctl
- **Find My deeper:** `findmy` docs at https://github.com/schwarzr/FindMy
- **iMessage deeper:** `imsg` docs at https://github.com/iann0036/imessage
- **macOS computer use:** See `references/macos-computer-use.md` for extended coordinate tables, multi-screen handling, and accessibility permission troubleshooting (if loaded from archived skill).
