diff --git a/skills/apple-reminders/SKILL.md b/skills/apple-reminders/SKILL.md index 97da02761a..2f4d48cd42 100644 --- a/skills/apple-reminders/SKILL.md +++ b/skills/apple-reminders/SKILL.md @@ -1,6 +1,6 @@ --- name: apple-reminders -description: Manage Apple Reminders via the `remindctl` CLI on macOS (list, add, edit, complete, delete). Supports lists, date filters, and JSON/plain output. +description: Manage Apple Reminders via remindctl CLI (list, add, edit, complete, delete). Supports lists, date filters, and JSON/plain output. homepage: https://github.com/steipete/remindctl metadata: { @@ -25,63 +25,82 @@ metadata: # Apple Reminders CLI (remindctl) -Use `remindctl` to manage Apple Reminders directly from the terminal. It supports list filtering, date-based views, and scripting output. +Use `remindctl` to manage Apple Reminders directly from the terminal. -Setup +## When to Use -- Install (Homebrew): `brew install steipete/tap/remindctl` -- From source: `pnpm install && pnpm build` (binary at `./bin/remindctl`) -- macOS-only; grant Reminders permission when prompted. +✅ **USE this skill when:** -Permissions +- User explicitly mentions "reminder" or "Reminders app" +- Creating personal to-dos with due dates that sync to iOS +- Managing Apple Reminders lists +- User wants tasks to appear in their iPhone/iPad Reminders app +## When NOT to Use + +❌ **DON'T use this skill when:** + +- Scheduling Clawdbot tasks or alerts → use `cron` tool with systemEvent instead +- Calendar events or appointments → use Apple Calendar +- Project/work task management → use Notion, GitHub Issues, or task queue +- One-time notifications → use `cron` tool for timed alerts +- User says "remind me" but means a Clawdbot alert → clarify first + +## Setup + +- Install: `brew install steipete/tap/remindctl` +- macOS-only; grant Reminders permission when prompted - Check status: `remindctl status` - Request access: `remindctl authorize` -View Reminders +## Common Commands -- Default (today): `remindctl` -- Today: `remindctl today` -- Tomorrow: `remindctl tomorrow` -- Week: `remindctl week` -- Overdue: `remindctl overdue` -- Upcoming: `remindctl upcoming` -- Completed: `remindctl completed` -- All: `remindctl all` -- Specific date: `remindctl 2026-01-04` +### View Reminders -Manage Lists +```bash +remindctl # Today's reminders +remindctl today # Today +remindctl tomorrow # Tomorrow +remindctl week # This week +remindctl overdue # Past due +remindctl all # Everything +remindctl 2026-01-04 # Specific date +``` -- List all lists: `remindctl list` -- Show list: `remindctl list Work` -- Create list: `remindctl list Projects --create` -- Rename list: `remindctl list Work --rename Office` -- Delete list: `remindctl list Work --delete` +### Manage Lists -Create Reminders +```bash +remindctl list # List all lists +remindctl list Work # Show specific list +remindctl list Projects --create # Create list +remindctl list Work --delete # Delete list +``` -- Quick add: `remindctl add "Buy milk"` -- With list + due: `remindctl add --title "Call mom" --list Personal --due tomorrow` +### Create Reminders -Edit Reminders +```bash +remindctl add "Buy milk" +remindctl add --title "Call mom" --list Personal --due tomorrow +remindctl add --title "Meeting prep" --due "2026-02-15 09:00" +``` -- Edit title/due: `remindctl edit 1 --title "New title" --due 2026-01-04` +### Complete/Delete -Complete Reminders +```bash +remindctl complete 1 2 3 # Complete by ID +remindctl delete 4A83 --force # Delete by ID +``` -- Complete by id: `remindctl complete 1 2 3` +### Output Formats -Delete Reminders +```bash +remindctl today --json # JSON for scripting +remindctl today --plain # TSV format +remindctl today --quiet # Counts only +``` -- Delete by id: `remindctl delete 4A83 --force` +## Date Formats -Output Formats - -- JSON (scripting): `remindctl today --json` -- Plain TSV: `remindctl today --plain` -- Counts only: `remindctl today --quiet` - -Date Formats Accepted by `--due` and date filters: - `today`, `tomorrow`, `yesterday` @@ -89,8 +108,11 @@ Accepted by `--due` and date filters: - `YYYY-MM-DD HH:mm` - ISO 8601 (`2026-01-04T12:34:56Z`) -Notes +## Example: Clarifying User Intent -- macOS-only. -- If access is denied, enable Terminal/remindctl in System Settings → Privacy & Security → Reminders. -- If running over SSH, grant access on the Mac that runs the command. +User: "Remind me to check on the deploy in 2 hours" + +**Ask:** "Do you want this in Apple Reminders (syncs to your phone) or as a Clawdbot alert (I'll message you here)?" + +- Apple Reminders → use this skill +- Clawdbot alert → use `cron` tool with systemEvent diff --git a/skills/github/SKILL.md b/skills/github/SKILL.md index 043f2c0c81..c0d2eea623 100644 --- a/skills/github/SKILL.md +++ b/skills/github/SKILL.md @@ -30,48 +30,134 @@ metadata: # GitHub Skill -Use the `gh` CLI to interact with GitHub. Always specify `--repo owner/repo` when not in a git directory, or use URLs directly. +Use the `gh` CLI to interact with GitHub repositories, issues, PRs, and CI. -## Pull Requests +## When to Use -Check CI status on a PR: +✅ **USE this skill when:** + +- Checking PR status, reviews, or merge readiness +- Viewing CI/workflow run status and logs +- Creating, closing, or commenting on issues +- Creating or merging pull requests +- Querying GitHub API for repository data +- Listing repos, releases, or collaborators + +## When NOT to Use + +❌ **DON'T use this skill when:** + +- Local git operations (commit, push, pull, branch) → use `git` directly +- Non-GitHub repos (GitLab, Bitbucket, self-hosted) → different CLIs +- Cloning repositories → use `git clone` +- Reviewing actual code changes → use `coding-agent` skill +- Complex multi-file diffs → use `coding-agent` or read files directly + +## Setup ```bash +# Authenticate (one-time) +gh auth login + +# Verify +gh auth status +``` + +## Common Commands + +### Pull Requests + +```bash +# List PRs +gh pr list --repo owner/repo + +# Check CI status gh pr checks 55 --repo owner/repo + +# View PR details +gh pr view 55 --repo owner/repo + +# Create PR +gh pr create --title "feat: add feature" --body "Description" + +# Merge PR +gh pr merge 55 --squash --repo owner/repo ``` -List recent workflow runs: +### Issues ```bash +# List issues +gh issue list --repo owner/repo --state open + +# Create issue +gh issue create --title "Bug: something broken" --body "Details..." + +# Close issue +gh issue close 42 --repo owner/repo +``` + +### CI/Workflow Runs + +```bash +# List recent runs gh run list --repo owner/repo --limit 10 -``` -View a run and see which steps failed: - -```bash +# View specific run gh run view --repo owner/repo -``` -View logs for failed steps only: - -```bash +# View failed step logs only gh run view --repo owner/repo --log-failed + +# Re-run failed jobs +gh run rerun --failed --repo owner/repo ``` -## API for Advanced Queries - -The `gh api` command is useful for accessing data not available through other subcommands. - -Get PR with specific fields: +### API Queries ```bash +# Get PR with specific fields gh api repos/owner/repo/pulls/55 --jq '.title, .state, .user.login' + +# List all labels +gh api repos/owner/repo/labels --jq '.[].name' + +# Get repo stats +gh api repos/owner/repo --jq '{stars: .stargazers_count, forks: .forks_count}' ``` ## JSON Output -Most commands support `--json` for structured output. You can use `--jq` to filter: +Most commands support `--json` for structured output with `--jq` filtering: ```bash gh issue list --repo owner/repo --json number,title --jq '.[] | "\(.number): \(.title)"' +gh pr list --json number,title,state,mergeable --jq '.[] | select(.mergeable == "MERGEABLE")' ``` + +## Templates + +### PR Review Summary + +```bash +# Get PR overview for review +PR=55 REPO=owner/repo +echo "## PR #$PR Summary" +gh pr view $PR --repo $REPO --json title,body,author,additions,deletions,changedFiles \ + --jq '"**\(.title)** by @\(.author.login)\n\n\(.body)\n\n📊 +\(.additions) -\(.deletions) across \(.changedFiles) files"' +gh pr checks $PR --repo $REPO +``` + +### Issue Triage + +```bash +# Quick issue triage view +gh issue list --repo owner/repo --state open --json number,title,labels,createdAt \ + --jq '.[] | "[\(.number)] \(.title) - \([.labels[].name] | join(", ")) (\(.createdAt[:10]))"' +``` + +## Notes + +- Always specify `--repo owner/repo` when not in a git directory +- Use URLs directly: `gh pr view https://github.com/owner/repo/pull/55` +- Rate limits apply; use `gh api --cache 1h` for repeated queries diff --git a/skills/imsg/SKILL.md b/skills/imsg/SKILL.md index 776baa8a37..21c41ad1c3 100644 --- a/skills/imsg/SKILL.md +++ b/skills/imsg/SKILL.md @@ -1,6 +1,6 @@ --- name: imsg -description: iMessage/SMS CLI for listing chats, history, watch, and sending. +description: iMessage/SMS CLI for listing chats, history, and sending messages via Messages.app. homepage: https://imsg.to metadata: { @@ -23,52 +23,100 @@ metadata: } --- -# imsg Actions +# imsg -## Overview +Use `imsg` to read and send iMessage/SMS via macOS Messages.app. -Use `imsg` to read and send Messages.app iMessage/SMS on macOS. +## When to Use -Requirements: Messages.app signed in, Full Disk Access for your terminal, and Automation permission to control Messages.app for sending. +✅ **USE this skill when:** -## Inputs to collect +- User explicitly asks to send iMessage or SMS +- Reading iMessage conversation history +- Checking recent Messages.app chats +- Sending to phone numbers or Apple IDs -- Recipient handle (phone/email) for `send` -- `chatId` for history/watch (from `imsg chats --limit 10 --json`) -- `text` and optional `file` path for sends +## When NOT to Use -## Actions +❌ **DON'T use this skill when:** -### List chats +- Telegram messages → use `message` tool with `channel:telegram` +- Signal messages → use Signal channel if configured +- WhatsApp messages → use WhatsApp channel if configured +- Discord messages → use `message` tool with `channel:discord` +- Slack messages → use `slack` skill +- Group chat management (adding/removing members) → not supported +- Bulk/mass messaging → always confirm with user first +- Replying in current conversation → just reply normally (Clawdbot routes automatically) + +## Requirements + +- macOS with Messages.app signed in +- Full Disk Access for terminal +- Automation permission for Messages.app (for sending) + +## Common Commands + +### List Chats ```bash imsg chats --limit 10 --json ``` -### Fetch chat history +### View History ```bash +# By chat ID +imsg history --chat-id 1 --limit 20 --json + +# With attachments info imsg history --chat-id 1 --limit 20 --attachments --json ``` -### Watch a chat +### Watch for New Messages ```bash imsg watch --chat-id 1 --attachments ``` -### Send a message +### Send Messages ```bash -imsg send --to "+14155551212" --text "hi" --file /path/pic.jpg +# Text only +imsg send --to "+14155551212" --text "Hello!" + +# With attachment +imsg send --to "+14155551212" --text "Check this out" --file /path/to/image.jpg + +# Specify service +imsg send --to "+14155551212" --text "Hi" --service imessage +imsg send --to "+14155551212" --text "Hi" --service sms ``` -## Notes +## Service Options -- `--service imessage|sms|auto` controls delivery. -- Confirm recipient + message before sending. +- `--service imessage` — Force iMessage (requires recipient has iMessage) +- `--service sms` — Force SMS (green bubble) +- `--service auto` — Let Messages.app decide (default) -## Ideas to try +## Safety Rules -- Use `imsg chats --limit 10 --json` to discover chat ids. -- Watch a high-signal chat to stream incoming messages. +1. **Always confirm recipient and message content** before sending +2. **Never send to unknown numbers** without explicit user approval +3. **Be careful with attachments** — confirm file path exists +4. **Rate limit yourself** — don't spam + +## Example Workflow + +User: "Text mom that I'll be late" + +```bash +# 1. Find mom's chat +imsg chats --limit 20 --json | jq '.[] | select(.displayName | contains("Mom"))' + +# 2. Confirm with user +# "Found Mom at +1555123456. Send 'I'll be late' via iMessage?" + +# 3. Send after confirmation +imsg send --to "+1555123456" --text "I'll be late" +``` diff --git a/skills/openhue/SKILL.md b/skills/openhue/SKILL.md index 83e62739aa..fa471d596e 100644 --- a/skills/openhue/SKILL.md +++ b/skills/openhue/SKILL.md @@ -1,6 +1,6 @@ --- name: openhue -description: Control Philips Hue lights/scenes via the OpenHue CLI. +description: Control Philips Hue lights and scenes via the OpenHue CLI. homepage: https://www.openhue.io/cli metadata: { @@ -24,28 +24,89 @@ metadata: # OpenHue CLI -Use `openhue` to control Hue lights and scenes via a Hue Bridge. +Use `openhue` to control Philips Hue lights and scenes via a Hue Bridge. -Setup +## When to Use -- Discover bridges: `openhue discover` -- Guided setup: `openhue setup` +✅ **USE this skill when:** -Read +- "Turn on/off the lights" +- "Dim the living room lights" +- "Set a scene" or "movie mode" +- Controlling specific Hue rooms or zones +- Adjusting brightness, color, or color temperature -- `openhue get light --json` -- `openhue get room --json` -- `openhue get scene --json` +## When NOT to Use -Write +❌ **DON'T use this skill when:** -- Turn on: `openhue set light --on` -- Turn off: `openhue set light --off` -- Brightness: `openhue set light --on --brightness 50` -- Color: `openhue set light --on --rgb #3399FF` -- Scene: `openhue set scene ` +- Non-Hue smart devices (other brands) → not supported +- HomeKit scenes or Shortcuts → use Apple's ecosystem +- TV or entertainment system control +- Thermostat or HVAC +- Smart plugs (unless Hue smart plugs) -Notes +## Common Commands -- You may need to press the Hue Bridge button during setup. -- Use `--room "Room Name"` when light names are ambiguous. +### List Resources + +```bash +openhue get light # List all lights +openhue get room # List all rooms +openhue get scene # List all scenes +``` + +### Control Lights + +```bash +# Turn on/off +openhue set light "Bedroom Lamp" --on +openhue set light "Bedroom Lamp" --off + +# Brightness (0-100) +openhue set light "Bedroom Lamp" --on --brightness 50 + +# Color temperature (warm to cool: 153-500 mirek) +openhue set light "Bedroom Lamp" --on --temperature 300 + +# Color (by name or hex) +openhue set light "Bedroom Lamp" --on --color red +openhue set light "Bedroom Lamp" --on --rgb "#FF5500" +``` + +### Control Rooms + +```bash +# Turn off entire room +openhue set room "Bedroom" --off + +# Set room brightness +openhue set room "Bedroom" --on --brightness 30 +``` + +### Scenes + +```bash +# Activate scene +openhue set scene "Relax" --room "Bedroom" +openhue set scene "Concentrate" --room "Office" +``` + +## Quick Presets + +```bash +# Bedtime (dim warm) +openhue set room "Bedroom" --on --brightness 20 --temperature 450 + +# Work mode (bright cool) +openhue set room "Office" --on --brightness 100 --temperature 250 + +# Movie mode (dim) +openhue set room "Living Room" --on --brightness 10 +``` + +## Notes + +- Bridge must be on local network +- First run requires button press on Hue bridge to pair +- Colors only work on color-capable bulbs (not white-only) diff --git a/skills/tmux/SKILL.md b/skills/tmux/SKILL.md index 6502959666..fa589c0e2b 100644 --- a/skills/tmux/SKILL.md +++ b/skills/tmux/SKILL.md @@ -5,131 +5,149 @@ metadata: { "openclaw": { "emoji": "🧵", "os": ["darwin", "linux"], "requires": { "bins": ["tmux"] } } } --- -# tmux Skill (OpenClaw) +# tmux Session Control -Use tmux only when you need an interactive TTY. Prefer exec background mode for long-running, non-interactive tasks. +Control tmux sessions by sending keystrokes and reading output. Essential for managing Claude Code sessions. -## Quickstart (isolated socket, exec tool) +## When to Use + +✅ **USE this skill when:** + +- Monitoring Claude/Codex sessions in tmux +- Sending input to interactive terminal applications +- Scraping output from long-running processes in tmux +- Navigating tmux panes/windows programmatically +- Checking on background work in existing sessions + +## When NOT to Use + +❌ **DON'T use this skill when:** + +- Running one-off shell commands → use `exec` tool directly +- Starting new background processes → use `exec` with `background:true` +- Non-interactive scripts → use `exec` tool +- The process isn't in tmux +- You need to create a new tmux session → use `exec` with `tmux new-session` + +## Example Sessions + +| Session | Purpose | +| ----------------------- | --------------------------- | +| `shared` | Primary interactive session | +| `worker-2` - `worker-8` | Parallel worker sessions | + +## Common Commands + +### List Sessions ```bash -SOCKET_DIR="${OPENCLAW_TMUX_SOCKET_DIR:-${CLAWDBOT_TMUX_SOCKET_DIR:-${TMPDIR:-/tmp}/openclaw-tmux-sockets}}" -mkdir -p "$SOCKET_DIR" -SOCKET="$SOCKET_DIR/openclaw.sock" -SESSION=openclaw-python - -tmux -S "$SOCKET" new -d -s "$SESSION" -n shell -tmux -S "$SOCKET" send-keys -t "$SESSION":0.0 -- 'PYTHON_BASIC_REPL=1 python3 -q' Enter -tmux -S "$SOCKET" capture-pane -p -J -t "$SESSION":0.0 -S -200 +tmux list-sessions +tmux ls ``` -After starting a session, always print monitor commands: - -``` -To monitor: - tmux -S "$SOCKET" attach -t "$SESSION" - tmux -S "$SOCKET" capture-pane -p -J -t "$SESSION":0.0 -S -200 -``` - -## Socket convention - -- Use `OPENCLAW_TMUX_SOCKET_DIR` (legacy `CLAWDBOT_TMUX_SOCKET_DIR` also supported). -- Default socket path: `"$OPENCLAW_TMUX_SOCKET_DIR/openclaw.sock"`. - -## Targeting panes and naming - -- Target format: `session:window.pane` (defaults to `:0.0`). -- Keep names short; avoid spaces. -- Inspect: `tmux -S "$SOCKET" list-sessions`, `tmux -S "$SOCKET" list-panes -a`. - -## Finding sessions - -- List sessions on your socket: `{baseDir}/scripts/find-sessions.sh -S "$SOCKET"`. -- Scan all sockets: `{baseDir}/scripts/find-sessions.sh --all` (uses `OPENCLAW_TMUX_SOCKET_DIR`). - -## Sending input safely - -- Prefer literal sends: `tmux -S "$SOCKET" send-keys -t target -l -- "$cmd"`. -- Control keys: `tmux -S "$SOCKET" send-keys -t target C-c`. -- For interactive TUI apps like Claude Code/Codex, this guidance covers **how to send commands**. - Do **not** append `Enter` in the same `send-keys`. These apps may treat a fast text+Enter - sequence as paste/multi-line input and not submit; this is timing-dependent. Send text and - `Enter` as separate commands with a small delay (tune per environment; increase if needed, - or use `sleep 1` if sub-second sleeps aren't supported): +### Capture Output ```bash -tmux -S "$SOCKET" send-keys -t target -l -- "$cmd" && sleep 0.1 && tmux -S "$SOCKET" send-keys -t target Enter +# Last 20 lines of pane +tmux capture-pane -t shared -p | tail -20 + +# Entire scrollback +tmux capture-pane -t shared -p -S - + +# Specific pane in window +tmux capture-pane -t shared:0.0 -p ``` -## Watching output - -- Capture recent history: `tmux -S "$SOCKET" capture-pane -p -J -t target -S -200`. -- Wait for prompts: `{baseDir}/scripts/wait-for-text.sh -t session:0.0 -p 'pattern'`. -- Attaching is OK; detach with `Ctrl+b d`. - -## Spawning processes - -- For python REPLs, set `PYTHON_BASIC_REPL=1` (non-basic REPL breaks send-keys flows). - -## Windows / WSL - -- tmux is supported on macOS/Linux. On Windows, use WSL and install tmux inside WSL. -- This skill is gated to `darwin`/`linux` and requires `tmux` on PATH. - -## Orchestrating Coding Agents (Codex, Claude Code) - -tmux excels at running multiple coding agents in parallel: +### Send Keys ```bash -SOCKET="${TMPDIR:-/tmp}/codex-army.sock" +# Send text (doesn't press Enter) +tmux send-keys -t shared "hello" -# Create multiple sessions -for i in 1 2 3 4 5; do - tmux -S "$SOCKET" new-session -d -s "agent-$i" +# Send text + Enter +tmux send-keys -t shared "y" Enter + +# Send special keys +tmux send-keys -t shared Enter +tmux send-keys -t shared Escape +tmux send-keys -t shared C-c # Ctrl+C +tmux send-keys -t shared C-d # Ctrl+D (EOF) +tmux send-keys -t shared C-z # Ctrl+Z (suspend) +``` + +### Window/Pane Navigation + +```bash +# Select window +tmux select-window -t shared:0 + +# Select pane +tmux select-pane -t shared:0.1 + +# List windows +tmux list-windows -t shared +``` + +### Session Management + +```bash +# Create new session +tmux new-session -d -s newsession + +# Kill session +tmux kill-session -t sessionname + +# Rename session +tmux rename-session -t old new +``` + +## Sending Input Safely + +For interactive TUIs (Claude Code, Codex, etc.), split text and Enter into separate sends to avoid paste/multiline edge cases: + +```bash +tmux send-keys -t shared -l -- "Please apply the patch in src/foo.ts" +sleep 0.1 +tmux send-keys -t shared Enter +``` + +## Claude Code Session Patterns + +### Check if Session Needs Input + +```bash +# Look for prompts +tmux capture-pane -t worker-3 -p | tail -10 | grep -E "❯|Yes.*No|proceed|permission" +``` + +### Approve Claude Code Prompt + +```bash +# Send 'y' and Enter +tmux send-keys -t worker-3 'y' Enter + +# Or select numbered option +tmux send-keys -t worker-3 '2' Enter +``` + +### Check All Sessions Status + +```bash +for s in shared worker-2 worker-3 worker-4 worker-5 worker-6 worker-7 worker-8; do + echo "=== $s ===" + tmux capture-pane -t $s -p 2>/dev/null | tail -5 done - -# Launch agents in different workdirs -tmux -S "$SOCKET" send-keys -t agent-1 "cd /tmp/project1 && codex --yolo 'Fix bug X'" Enter -tmux -S "$SOCKET" send-keys -t agent-2 "cd /tmp/project2 && codex --yolo 'Fix bug Y'" Enter - -# When sending prompts to Claude Code/Codex TUI, split text + Enter with a delay -tmux -S "$SOCKET" send-keys -t agent-1 -l -- "Please make a small edit to README.md." && sleep 0.1 && tmux -S "$SOCKET" send-keys -t agent-1 Enter - -# Poll for completion (check if prompt returned) -for sess in agent-1 agent-2; do - if tmux -S "$SOCKET" capture-pane -p -t "$sess" -S -3 | grep -q "❯"; then - echo "$sess: DONE" - else - echo "$sess: Running..." - fi -done - -# Get full output from completed session -tmux -S "$SOCKET" capture-pane -p -t agent-1 -S -500 ``` -**Tips:** - -- Use separate git worktrees for parallel fixes (no branch conflicts) -- `pnpm install` first before running codex in fresh clones -- Check for shell prompt (`❯` or `$`) to detect completion -- Codex needs `--yolo` or `--full-auto` for non-interactive fixes - -## Cleanup - -- Kill a session: `tmux -S "$SOCKET" kill-session -t "$SESSION"`. -- Kill all sessions on a socket: `tmux -S "$SOCKET" list-sessions -F '#{session_name}' | xargs -r -n1 tmux -S "$SOCKET" kill-session -t`. -- Remove everything on the private socket: `tmux -S "$SOCKET" kill-server`. - -## Helper: wait-for-text.sh - -`{baseDir}/scripts/wait-for-text.sh` polls a pane for a regex (or fixed string) with a timeout. +### Send Task to Session ```bash -{baseDir}/scripts/wait-for-text.sh -t session:0.0 -p 'pattern' [-F] [-T 20] [-i 0.5] [-l 2000] +tmux send-keys -t worker-4 "Fix the bug in auth.js" Enter ``` -- `-t`/`--target` pane target (required) -- `-p`/`--pattern` regex to match (required); add `-F` for fixed string -- `-T` timeout seconds (integer, default 15) -- `-i` poll interval seconds (default 0.5) -- `-l` history lines to search (integer, default 1000) +## Notes + +- Use `capture-pane -p` to print to stdout (essential for scripting) +- `-S -` captures entire scrollback history +- Target format: `session:window.pane` (e.g., `shared:0.0`) +- Sessions persist across SSH disconnects diff --git a/skills/weather/SKILL.md b/skills/weather/SKILL.md index 15c88f45d8..bf86fb1605 100644 --- a/skills/weather/SKILL.md +++ b/skills/weather/SKILL.md @@ -5,50 +5,108 @@ homepage: https://wttr.in/:help metadata: { "openclaw": { "emoji": "🌤️", "requires": { "bins": ["curl"] } } } --- -# Weather +# Weather Skill -Two free services, no API keys needed. +Get current weather conditions and forecasts. -## wttr.in (primary) +## When to Use -Quick one-liner: +✅ **USE this skill when:** + +- "What's the weather?" +- "Will it rain today/tomorrow?" +- "Temperature in [city]" +- "Weather forecast for the week" +- Travel planning weather checks + +## When NOT to Use + +❌ **DON'T use this skill when:** + +- Historical weather data → use weather archives/APIs +- Climate analysis or trends → use specialized data sources +- Hyper-local microclimate data → use local sensors +- Severe weather alerts → check official NWS sources +- Aviation/marine weather → use specialized services (METAR, etc.) + +## Location + +Always include a city, region, or airport code in weather queries. + +## Commands + +### Current Weather ```bash -curl -s "wttr.in/London?format=3" -# Output: London: ⛅️ +8°C +# One-line summary +curl "wttr.in/London?format=3" + +# Detailed current conditions +curl "wttr.in/London?0" + +# Specific city +curl "wttr.in/New+York?format=3" ``` -Compact format: +### Forecasts ```bash -curl -s "wttr.in/London?format=%l:+%c+%t+%h+%w" -# Output: London: ⛅️ +8°C 71% ↙5km/h +# 3-day forecast +curl "wttr.in/London" + +# Week forecast +curl "wttr.in/London?format=v2" + +# Specific day (0=today, 1=tomorrow, 2=day after) +curl "wttr.in/London?1" ``` -Full forecast: +### Format Options ```bash -curl -s "wttr.in/London?T" +# One-liner +curl "wttr.in/London?format=%l:+%c+%t+%w" + +# JSON output +curl "wttr.in/London?format=j1" + +# PNG image +curl "wttr.in/London.png" ``` -Format codes: `%c` condition · `%t` temp · `%h` humidity · `%w` wind · `%l` location · `%m` moon +### Format Codes -Tips: +- `%c` — Weather condition emoji +- `%t` — Temperature +- `%f` — "Feels like" +- `%w` — Wind +- `%h` — Humidity +- `%p` — Precipitation +- `%l` — Location -- URL-encode spaces: `wttr.in/New+York` -- Airport codes: `wttr.in/JFK` -- Units: `?m` (metric) `?u` (USCS) -- Today only: `?1` · Current only: `?0` -- PNG: `curl -s "wttr.in/Berlin.png" -o /tmp/weather.png` +## Quick Responses -## Open-Meteo (fallback, JSON) - -Free, no key, good for programmatic use: +**"What's the weather?"** ```bash -curl -s "https://api.open-meteo.com/v1/forecast?latitude=51.5&longitude=-0.12¤t_weather=true" +curl -s "wttr.in/London?format=%l:+%c+%t+(feels+like+%f),+%w+wind,+%h+humidity" ``` -Find coordinates for a city, then query. Returns JSON with temp, windspeed, weathercode. +**"Will it rain?"** -Docs: https://open-meteo.com/en/docs +```bash +curl -s "wttr.in/London?format=%l:+%c+%p" +``` + +**"Weekend forecast"** + +```bash +curl "wttr.in/London?format=v2" +``` + +## Notes + +- No API key needed (uses wttr.in) +- Rate limited; don't spam requests +- Works for most global cities +- Supports airport codes: `curl wttr.in/ORD`