---
title: Skill Catalog
---

Wall-E ships with bundled skills that run on a schedule to keep your brain up to date.

## Bundled Skills

### google-calendar
**Schedule:** every 30m | **Execution:** script

Syncs macOS Calendar events (Google, iCloud, Outlook) into the brain via EventKit. Stores event title, attendees, location, notes, and calendar name. Deduplicates by event UID + start time.

**Config:**
- `days_back` (number, default: 1) — days of past events to include
- `days_ahead` (number, default: 14) — days of future events to include

---

### slack-sync
**Schedule:** every 15m | **Execution:** script

Incremental Slack message sync via MCP. Pulls new messages since the last checkpoint and stores them as memories with sender, channel, and direction metadata.

**Requires:** `SLACK_TOKEN`, `SLACK_OWNER_USER_ID`

---

### slack-backfill
**Schedule:** manual | **Execution:** script

Full Slack history backfill from 2022 to present. Paginates through all search results (up to 20 pages per month). Supports checkpoint/resume for interrupted runs.

**Usage:**
```bash
node scripts/slack-backfill.js              # full backfill
node scripts/slack-backfill.js incremental  # new messages only
node scripts/slack-backfill.js 2024-01      # single month
```

---

### email-sync
**Schedule:** every 30m | **Execution:** script

Syncs sent emails from macOS Mail via JXA (JavaScript for Automation). Captures subject, recipients, date, and body text. Deduplicates by message ID.

---

### email-digest
**Schedule:** daily at 7am | **Execution:** agent

AI-generated summary of recent email activity. Uses the LLM to synthesize patterns, key threads, and action items from email memories.

---

### morning-briefing
**Schedule:** daily at 7am | **Execution:** agent

Generates a comprehensive daily briefing by searching memories across all sources. Includes: today's meetings, pending action items, Slack mentions, and active threads.

---

### memory-search
**Schedule:** on-demand | **Execution:** script

Full-text search across all memories using SQLite FTS5. Available as a tool in Wall-E chat.

---

## Creating Custom Skills

Skills are defined as `SKILL.md` files with YAML frontmatter. Place them in `wall-e/skills/_bundled/your-skill/`.

### Minimal Example

```yaml
---
name: my-skill
description: What this skill does
version: 1.0.0
execution: script
entry: run.js
trigger:
  type: interval
  schedule: "every 1h"
tags: [custom]
permissions:
  - brain:write
---
# My Skill

Additional documentation here.
```

### Execution Modes

**Script mode** (`execution: script`): Deterministic, no LLM cost. The daemon runs your `entry` file (Node.js script) and captures stdout/stderr. Use for data ingestion, sync, and automation.

**Agent mode** (`execution: agent`): LLM-driven. The markdown body of SKILL.md becomes the agent's prompt. Use for summarization, synthesis, and tasks requiring judgment.

### Script Pattern

```javascript
#!/usr/bin/env node
'use strict';

const brain = require('../../brain');
brain.initDb();

// Read config from environment
const config = JSON.parse(process.env.WALL_E_SKILL_CONFIG || '{}');

// Do work, store results
const mem = {
  source: 'my-source',
  source_id: 'unique-id',
  memory_type: 'my_type',
  subject: 'Title',
  content: 'Human-readable content',
  metadata: JSON.stringify({ raw: 'data' }),
  importance: 0.5,
  timestamp: new Date().toISOString(),
};
brain.insertMemory(mem);

// Output JSON summary
console.log(JSON.stringify({ inserted: 1 }));
brain.closeDb();
```

### Key Conventions

- **Deduplication**: Always use `source` + `source_id` for dedup. Check existing before inserting.
- **Exit codes**: 0 = success, 1 = failure, 2 = partial success (checkpoint saved)
- **Checkpoints**: Emit `CHECKPOINT:value` lines to stdout for resumable tasks
- **Config**: Passed via `WALL_E_SKILL_CONFIG` env var (JSON string)
