Skill: bro3886/rem-cli (version 1.0.0)

--- name: rem description: Manages macOS Reminders from the terminal using the rem CLI. Creates, lists, updates, completes, deletes, searches, and exports reminders and lists. Supports natural language due dates, filtering, import/export, and multiple output formats. Use when the user wants to interact with Apple Reminders via command line, automate reminder workflows, or build scripts around macOS Reminders. metadata: author: BRO3886 version: "0.7.0" compatibility: Requires macOS with Reminders.app. Requires Xcode Command Line Tools for building from source. --- # rem — CLI for macOS Reminders A Go CLI that wraps macOS Reminders. Sub-200ms reads via cgo + EventKit. Single binary, no dependencies at runtime. ## Installation ```bash # macOS (recommended) curl -fsSL https://rem.sidv.dev/install | bash # Or via Go go install github.com/BRO3886/rem/cmd/rem@latest ``` Install this skill into your agent: ```bash # Claude Code or Codex rem skills install # OpenClaw rem skills install --agent openclaw ``` ## Quick Start ```bash # See all lists with reminder counts rem lists --count # Add a reminder with natural language date rem add "Buy groceries" --list Personal --due tomorrow --priority high # List incomplete reminders in a list rem list --list Work --incomplete # Search across all reminders rem search "meeting" # Complete a reminder by short ID rem complete abc12345 # View stats rem stats ``` ## Command Reference ### Reminder CRUD | Command | Aliases | Description | |---------|---------|-------------| | `rem add` | `create`, `new` | Create a reminder | | `rem list` | `ls` | List reminders with filters | | `rem show` | `get` | Show full details of one reminder | | `rem update` | `edit` | Update reminder properties | | `rem delete` | `rm`, `remove` | Delete a reminder | | `rem complete` | `done` | Mark reminder complete | | `rem uncomplete` | — | Mark reminder incomplete | | `rem flag` | — | Flag a reminder | | `rem unflag` | — | Remove flag | ### List Management | Command | Aliases | Description | |---------|---------|-------------| | `rem lists` | — | Show all lists | | `rem list-mgmt create` | `lm new` | Create a list | | `rem list-mgmt rename` | — | Rename a list | | `rem list-mgmt delete` | `lm rm` | Delete a list | ### Search & Analytics | Command | Description | |---------|-------------| | `rem search <query>` | Search title and notes | | `rem stats` | Show statistics and per-list breakdown | | `rem overdue` | Show overdue reminders | | `rem upcoming` | Show reminders due in next N days (default: 7) | ### Import/Export | Command | Description | |---------|-------------| | `rem export` | Export to JSON or CSV | | `rem import <file>` | Import from JSON or CSV file | ### Skills & Other | Command | Description | |---------|-------------| | `rem skills install` | Install rem skill for AI agents | | `rem skills uninstall` | Uninstall rem skill from AI agents | | `rem skills status` | Show skill installation status | | `rem interactive` / `rem i` | Interactive menu-driven mode | | `rem version` | Print version | | `rem completion` | Generate shell completions (bash/zsh/fish) | For full flag details on every command, see [references/commands.md](references/commands.md). ## Key Concepts ### Short IDs Reminders have UUIDs like `x-apple-reminder://AB12CD34-...`. The CLI displays the first 8 characters as a short ID (`AB12CD34`). You can pass any unique prefix to commands — `rem complete AB1` works if it matches exactly one reminder. ### Natural Language Dates The `--due` flag accepts natural language: ```bash rem add "Call dentist" --due tomorrow rem add "Submit report" --due "next friday at 2pm" rem add "Quick task" --due "in 30 minutes" rem add "Wrap up" --due eod ``` Supported patterns: `today`, `tomorrow`, `next monday`, `in 3 hours`, `eod`, `eow`, `5pm`, `2026-02-15`, and more. See [references/dates.md](references/dates.md) for the full list. ### Priority Levels | Level | Flag value | AppleScript value | |-------|-----------|-------------------| | High | `--priority high` | 1 (range 1-4) | | Medium | `--priority medium` | 5 | | Low | `--priority low` | 9 (range 6-9) | | None | `--priority none` | 0 | ### Output Formats All read commands support `-o` / `--output`: - **table** (default) — formatted table with borders - **json** — machine-readable JSON - **plain** — simple text, one item per line The `NO_COLOR` environment variable is respected. ### URL Storage macOS Reminders has no native URL field. rem stores URLs in the notes/body field with a `URL: ` prefix and extracts them for display. ## Common Workflows ### Daily review ```bash rem overdue # Check what's past due rem upcoming --days 1 # See today's reminders rem list --list Work --incomplete # Focus on work items ``` ### Batch operations with JSON ```bash rem export --list Work --format json > backup.json rem import backup.json --list "Work Archive" ``` ### Scripting with JSON output ```bash # Get overdue count rem overdue -o json | jq 'length' # List all incomplete reminder titles rem list --incomplete -o json | jq -r '.[].name' ``` ## Public Go API For programmatic access, use [`go-eventkit`](https://github.com/BRO3886/go-eventkit) directly: ```go import "github.com/BRO3886/go-eventkit/reminders" client, _ := reminders.New() r, _ := client.CreateReminder(reminders.CreateReminderInput{ Title: "Buy milk", ListName: "Shopping", Priority: reminders.PriorityHigh, }) items, _ := client.Reminders(reminders.WithCompleted(false)) ``` See [go-eventkit docs](https://github.com/BRO3886/go-eventkit) for the full API surface. ## Limitations - **macOS only** — requires EventKit framework and `osascript` - **No tags, subtasks, or recurrence** — not exposed by EventKit/AppleScript - **`--flagged` filter is slower** (~3-4s) — falls back to JXA since EventKit doesn't expose flagged - **List deletion** may fail on some macOS versions

path: references/commands.md
content: # Complete Command Reference

## rem add

Create a new reminder.

```bash
rem add "Buy groceries" --list Personal --due tomorrow --priority high
rem add "Review PR" --due "next friday at 2pm" --url https://github.com/org/repo/pull/123
rem add "Call dentist" --notes "Ask about cleaning"
rem add -i   # Interactive mode
```

| Flag | Short | Description | Default |
|------|-------|-------------|---------|
| `--list` | `-l` | Reminder list name | System default list |
| `--due` | `-d` | Due date (natural language or ISO) | None |
| `--priority` | `-p` | Priority: high, medium, low, none | none |
| `--notes` | `-n` | Notes/body text | Empty |
| `--url` | `-u` | URL to attach (stored in body) | None |
| `--flagged` | `-f` | Flag the reminder | false |
| `--interactive` | `-i` | Create interactively | false |

Aliases: `create`, `new`

---

## rem list

List reminders with optional filters.

```bash
rem list
rem list --list Work --incomplete
rem list --due-before "2026-02-15" --output json
rem list --flagged
rem list --completed --list Personal
rem list --due-after today --due-before "next week"
rem list --search "groceries"
```

| Flag | Short | Description | Default |
|------|-------|-------------|---------|
| `--list` | `-l` | Filter by list name | All lists |
| `--incomplete` | — | Show only incomplete | false |
| `--completed` | — | Show only completed | false |
| `--flagged` | — | Show only flagged | false |
| `--due-before` | — | Due before this date | None |
| `--due-after` | — | Due after this date | None |
| `--search` | `-s` | Search title and notes | None |
| `--output` | `-o` | Output format: table, json, plain | table |

Aliases: `ls`

---

## rem show

Display full details of a specific reminder.

```bash
rem show abc12345
rem show abc12345 --output json
```

| Flag | Short | Description | Default |
|------|-------|-------------|---------|
| `--output` | `-o` | Output format: table, json, plain | table |

Aliases: `get`

---

## rem update

Update properties of an existing reminder.

```bash
rem update abc12345 --due "next monday"
rem update abc12345 --notes "Updated notes" --priority medium
rem update abc12345 --name "New title"
rem update abc12345 --due none    # Clear due date
rem update abc12345 --flagged true
rem update abc12345 -i            # Interactive mode
```

| Flag | Short | Description | Default |
|------|-------|-------------|---------|
| `--name` | — | New title | — |
| `--due` | `-d` | New due date (use `none` to clear) | — |
| `--notes` | `-n` | New notes/body | — |
| `--priority` | `-p` | New priority: high, medium, low, none | — |
| `--url` | `-u` | New URL | — |
| `--flagged` | — | Set flagged: true/false | — |
| `--interactive` | `-i` | Update interactively | false |

Aliases: `edit`

---

## rem delete

Delete a reminder. Prompts for confirmation unless `--force` is used.

```bash
rem delete abc12345
rem rm abc12345 --force
```

| Flag | Short | Description | Default |
|------|-------|-------------|---------|
| `--force` | — | Skip confirmation | false |

Aliases: `rm`, `remove`

---

## rem complete

Mark a reminder as complete.

```bash
rem complete abc12345
rem done abc12345
```

Aliases: `done`

---

## rem uncomplete

Mark a reminder as incomplete.

```bash
rem uncomplete abc12345
```

---

## rem flag

Flag a reminder.

```bash
rem flag abc12345
```

---

## rem unflag

Remove flag from a reminder.

```bash
rem unflag abc12345
```

---

## rem lists

Show all reminder lists.

```bash
rem lists
rem lists --count
rem lists --output json
```

| Flag | Short | Description | Default |
|------|-------|-------------|---------|
| `--count` | `-c` | Show reminder count per list | false |
| `--output` | `-o` | Output format: table, json, plain | table |

---

## rem list-mgmt create

Create a new reminder list.

```bash
rem list-mgmt create "My List"
rem lm new "Shopping"
```

Aliases: `lm new`

---

## rem list-mgmt rename

Rename a reminder list.

```bash
rem list-mgmt rename "Old Name" "New Name"
```

---

## rem list-mgmt delete

Delete a reminder list and all its reminders. Prompts for confirmation.

```bash
rem list-mgmt delete "My List"
rem lm rm "My List" --force
```

| Flag | Short | Description | Default |
|------|-------|-------------|---------|
| `--force` | — | Skip confirmation | false |

Aliases: `lm rm`

---

## rem search

Search reminders by title and notes.

```bash
rem search "groceries"
rem search "meeting" --list Work --incomplete
rem search "report" -o json
```

| Flag | Short | Description | Default |
|------|-------|-------------|---------|
| `--list` | `-l` | Search within a specific list | All lists |
| `--incomplete` | — | Search only incomplete | false |
| `--output` | `-o` | Output format: table, json, plain | table |

---

## rem stats

Show reminder statistics.

```bash
rem stats
rem stats -o json
```

| Flag | Short | Description | Default |
|------|-------|-------------|---------|
| `--output` | `-o` | Output format: plain, json | plain |

Output includes: total, completed, incomplete, flagged, overdue counts, completion rate, list count, and per-list breakdown.

---

## rem overdue

Show overdue reminders (incomplete with due date in the past).

```bash
rem overdue
rem overdue -o json
```

| Flag | Short | Description | Default |
|------|-------|-------------|---------|
| `--output` | `-o` | Output format: table, json, plain | table |

---

## rem upcoming

Show upcoming reminders (due in the next N days).

```bash
rem upcoming
rem upcoming --days 14
rem upcoming -o json
```

| Flag | Short | Description | Default |
|------|-------|-------------|---------|
| `--days` | — | Number of days to look ahead | 7 |
| `--output` | `-o` | Output format: table, json, plain | table |

---

## rem export

Export reminders to JSON or CSV.

```bash
rem export > all.json
rem export --list Work --format json > work.json
rem export --format csv --output-file reminders.csv
rem export --incomplete --format json
```

| Flag | Short | Description | Default |
|------|-------|-------------|---------|
| `--list` | `-l` | Export from a specific list | All lists |
| `--format` | — | Export format: json, csv | json |
| `--output-file` | — | Output file path | stdout |
| `--incomplete` | — | Export only incomplete | false |

---

## rem import

Import reminders from a JSON or CSV file.

```bash
rem import work.json
rem import reminders.csv --list "Imported"
rem import --dry-run data.json
```

| Flag | Short | Description | Default |
|------|-------|-------------|---------|
| `--list` | `-l` | Import all into this list | Original list names |
| `--dry-run` | — | Preview without creating | false |

---

## rem interactive

Launch interactive menu-driven session.

```bash
rem interactive
rem i
```

Menu options: create reminder, list reminders, complete reminder, delete reminder, list all lists, create list, quit.

---

## rem completion

Generate shell completion scripts.

```bash
rem completion bash > /usr/local/etc/bash_completion.d/rem
rem completion zsh > "${fpath[1]}/_rem"
rem completion fish > ~/.config/fish/completions/rem.fish
```

---

## rem skills install

Install the rem agent skill for AI coding agents.

```bash
rem skills install                          # Interactive picker
rem skills install --agent claude           # Install for Claude Code only
rem skills install --agent codex            # Install for Codex CLI only
rem skills install --agent openclaw         # Install for OpenClaw only
rem skills install --agent all              # Install for all agents
```

| Flag | Description | Default |
|------|-------------|---------|
| `--agent` | Agent target: claude, codex, openclaw, or all | Interactive picker |

Supported targets:
- `claude`   → `~/.claude/skills/rem-cli/`    (Claude Code, Copilot, Cursor, OpenCode, Augment)
- `codex`    → `~/.agents/skills/rem-cli/`    (Codex CLI, Copilot, Windsurf, OpenCode, Augment)
- `openclaw` → `~/.openclaw/skills/rem-cli/`  (OpenClaw)

---

## rem skills uninstall

Remove the rem agent skill from AI coding agents.

```bash
rem skills uninstall                          # Interactive picker
rem skills uninstall --agent claude           # Uninstall from Claude Code only
rem skills uninstall --agent openclaw         # Uninstall from OpenClaw only
rem skills uninstall --agent all              # Uninstall from all agents
```

| Flag | Description | Default |
|------|-------------|---------|
| `--agent` | Agent target: claude, codex, openclaw, or all | Interactive picker |

---

## rem skills status

Show the installation status of the rem skill across all supported agents.

```bash
rem skills status
```

Displays installed version, location, and whether the skill is outdated compared to the binary.

---

## rem version

Print version information.

```bash
rem version
```

---

## Global Behavior

- All read commands accept `-o` / `--output` for format selection (table, json, plain)
- `NO_COLOR=1` environment variable disables color output
- `REM_NO_UPDATE_CHECK=1` environment variable disables the background update check
- ID arguments accept prefix matches — pass any unique prefix of a short ID


path: references/dates.md
content: # Natural Language Date Reference

The `--due` flag on `rem add` and `rem update` accepts natural language dates. All parsing is built-in with no external dependencies.

## Keywords

| Input | Resolves to |
|-------|-------------|
| `today` | Today at 9:00 AM |
| `tomorrow` | Tomorrow at 9:00 AM |
| `yesterday` | Yesterday at 9:00 AM |
| `next week` | 7 days from now at 9:00 AM |
| `next month` | 30 days from now at 9:00 AM |
| `eod` / `end of day` | Today at 5:00 PM |
| `eow` / `end of week` | Next Friday at 5:00 PM |

## Relative Time

Pattern: `in <number> <unit>`

| Input | Example result |
|-------|---------------|
| `in 5 minutes` / `in 5 mins` | 5 minutes from now |
| `in 3 hours` / `in 3 hrs` | 3 hours from now |
| `in 2 days` | 2 days from now |
| `in 1 week` | 7 days from now |
| `in 2 months` | 2 months from now |

## Weekday Patterns

| Input | Resolves to |
|-------|-------------|
| `next monday` | Next Monday at 9:00 AM |
| `next friday` | Next Friday at 9:00 AM |
| `next monday at 2pm` | Next Monday at 2:00 PM |
| `next fri at 3:30pm` | Next Friday at 3:30 PM |

Supports full names and 3-letter abbreviations: `sun`, `mon`, `tue`, `wed`, `thu`, `fri`, `sat`.

## Keyword + Time

| Input | Resolves to |
|-------|-------------|
| `today at 5pm` | Today at 5:00 PM |
| `tomorrow at 3:30pm` | Tomorrow at 3:30 PM |
| `yesterday at 9am` | Yesterday at 9:00 AM |

## Time Only

| Input | Resolves to |
|-------|-------------|
| `5pm` | Today at 5:00 PM (or tomorrow if already past) |
| `9am` | Today at 9:00 AM (or tomorrow if already past) |
| `5:30pm` | Today at 5:30 PM (or tomorrow if already past) |
| `17:00` | Today at 5:00 PM (or tomorrow if already past) |

## Standard Date Formats

| Format | Example |
|--------|---------|
| ISO date | `2026-02-15` |
| ISO datetime | `2026-02-15 14:30` |
| ISO with T | `2026-02-15T14:30` |
| 12-hour | `2026-02-15 2:30PM` |
| US format | `02/15/2026` |
| US with time | `02/15/2026 14:30` |
| Month name | `Feb 15, 2026` / `February 15, 2026` |
| Day-first | `15 Feb 2026` |

## Clearing a Due Date

Use `none` to clear an existing due date:

```bash
rem update abc12345 --due none
```


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: suspicious | SkillSpector: suspicious (MEDIUM)