mirror of
https://github.com/openclaw/openclaw.git
synced 2026-03-12 07:20:45 +00:00
feat(skills): Add 'Use when / Don't use when' routing blocks (#14521)
* feat(skills): add 'Use when / Don't use when' blocks to skill descriptions Based on OpenAI's Shell + Skills + Compaction best practices article. Key changes: - Added clear routing logic to skill descriptions - Added negative examples to prevent misfires - Added templates/examples to github skill - Included Blake's specific setup notes for openhue Skills updated: - apple-reminders: Clarify vs Clawdbot cron - github: Clarify vs local git operations - imsg: Clarify vs other messaging channels - openhue: Add device inventory, room layout - tmux: Clarify vs exec tool - weather: Add location defaults, format codes Reference: https://developers.openai.com/blog/skills-shell-tips * fix(skills): restore metadata and generic CLI examples --------- Co-authored-by: Peter Steinberger <steipete@gmail.com>
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
name: apple-reminders
|
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
|
homepage: https://github.com/steipete/remindctl
|
||||||
metadata:
|
metadata:
|
||||||
{
|
{
|
||||||
@@ -25,63 +25,82 @@ metadata:
|
|||||||
|
|
||||||
# Apple Reminders CLI (remindctl)
|
# 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`
|
✅ **USE this skill when:**
|
||||||
- From source: `pnpm install && pnpm build` (binary at `./bin/remindctl`)
|
|
||||||
- macOS-only; grant Reminders permission when prompted.
|
|
||||||
|
|
||||||
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`
|
- Check status: `remindctl status`
|
||||||
- Request access: `remindctl authorize`
|
- Request access: `remindctl authorize`
|
||||||
|
|
||||||
View Reminders
|
## Common Commands
|
||||||
|
|
||||||
- Default (today): `remindctl`
|
### View Reminders
|
||||||
- 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`
|
|
||||||
|
|
||||||
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`
|
### Manage Lists
|
||||||
- Show list: `remindctl list Work`
|
|
||||||
- Create list: `remindctl list Projects --create`
|
|
||||||
- Rename list: `remindctl list Work --rename Office`
|
|
||||||
- Delete list: `remindctl list Work --delete`
|
|
||||||
|
|
||||||
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"`
|
### Create Reminders
|
||||||
- With list + due: `remindctl add --title "Call mom" --list Personal --due tomorrow`
|
|
||||||
|
|
||||||
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:
|
Accepted by `--due` and date filters:
|
||||||
|
|
||||||
- `today`, `tomorrow`, `yesterday`
|
- `today`, `tomorrow`, `yesterday`
|
||||||
@@ -89,8 +108,11 @@ Accepted by `--due` and date filters:
|
|||||||
- `YYYY-MM-DD HH:mm`
|
- `YYYY-MM-DD HH:mm`
|
||||||
- ISO 8601 (`2026-01-04T12:34:56Z`)
|
- ISO 8601 (`2026-01-04T12:34:56Z`)
|
||||||
|
|
||||||
Notes
|
## Example: Clarifying User Intent
|
||||||
|
|
||||||
- macOS-only.
|
User: "Remind me to check on the deploy in 2 hours"
|
||||||
- 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.
|
**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
|
||||||
|
|||||||
@@ -30,48 +30,134 @@ metadata:
|
|||||||
|
|
||||||
# GitHub Skill
|
# 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
|
```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
|
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
|
```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
|
gh run list --repo owner/repo --limit 10
|
||||||
```
|
|
||||||
|
|
||||||
View a run and see which steps failed:
|
# View specific run
|
||||||
|
|
||||||
```bash
|
|
||||||
gh run view <run-id> --repo owner/repo
|
gh run view <run-id> --repo owner/repo
|
||||||
```
|
|
||||||
|
|
||||||
View logs for failed steps only:
|
# View failed step logs only
|
||||||
|
|
||||||
```bash
|
|
||||||
gh run view <run-id> --repo owner/repo --log-failed
|
gh run view <run-id> --repo owner/repo --log-failed
|
||||||
|
|
||||||
|
# Re-run failed jobs
|
||||||
|
gh run rerun <run-id> --failed --repo owner/repo
|
||||||
```
|
```
|
||||||
|
|
||||||
## API for Advanced Queries
|
### API Queries
|
||||||
|
|
||||||
The `gh api` command is useful for accessing data not available through other subcommands.
|
|
||||||
|
|
||||||
Get PR with specific fields:
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
# Get PR with specific fields
|
||||||
gh api repos/owner/repo/pulls/55 --jq '.title, .state, .user.login'
|
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
|
## 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
|
```bash
|
||||||
gh issue list --repo owner/repo --json number,title --jq '.[] | "\(.number): \(.title)"'
|
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
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
name: imsg
|
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
|
homepage: https://imsg.to
|
||||||
metadata:
|
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`
|
## When NOT to Use
|
||||||
- `chatId` for history/watch (from `imsg chats --limit 10 --json`)
|
|
||||||
- `text` and optional `file` path for sends
|
|
||||||
|
|
||||||
## 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
|
```bash
|
||||||
imsg chats --limit 10 --json
|
imsg chats --limit 10 --json
|
||||||
```
|
```
|
||||||
|
|
||||||
### Fetch chat history
|
### View History
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
# By chat ID
|
||||||
|
imsg history --chat-id 1 --limit 20 --json
|
||||||
|
|
||||||
|
# With attachments info
|
||||||
imsg history --chat-id 1 --limit 20 --attachments --json
|
imsg history --chat-id 1 --limit 20 --attachments --json
|
||||||
```
|
```
|
||||||
|
|
||||||
### Watch a chat
|
### Watch for New Messages
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
imsg watch --chat-id 1 --attachments
|
imsg watch --chat-id 1 --attachments
|
||||||
```
|
```
|
||||||
|
|
||||||
### Send a message
|
### Send Messages
|
||||||
|
|
||||||
```bash
|
```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.
|
- `--service imessage` — Force iMessage (requires recipient has iMessage)
|
||||||
- Confirm recipient + message before sending.
|
- `--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.
|
1. **Always confirm recipient and message content** before sending
|
||||||
- Watch a high-signal chat to stream incoming messages.
|
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"
|
||||||
|
```
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
name: openhue
|
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
|
homepage: https://www.openhue.io/cli
|
||||||
metadata:
|
metadata:
|
||||||
{
|
{
|
||||||
@@ -24,28 +24,89 @@ metadata:
|
|||||||
|
|
||||||
# OpenHue CLI
|
# 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`
|
✅ **USE this skill when:**
|
||||||
- Guided setup: `openhue setup`
|
|
||||||
|
|
||||||
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`
|
## When NOT to Use
|
||||||
- `openhue get room --json`
|
|
||||||
- `openhue get scene --json`
|
|
||||||
|
|
||||||
Write
|
❌ **DON'T use this skill when:**
|
||||||
|
|
||||||
- Turn on: `openhue set light <id-or-name> --on`
|
- Non-Hue smart devices (other brands) → not supported
|
||||||
- Turn off: `openhue set light <id-or-name> --off`
|
- HomeKit scenes or Shortcuts → use Apple's ecosystem
|
||||||
- Brightness: `openhue set light <id> --on --brightness 50`
|
- TV or entertainment system control
|
||||||
- Color: `openhue set light <id> --on --rgb #3399FF`
|
- Thermostat or HVAC
|
||||||
- Scene: `openhue set scene <scene-id>`
|
- Smart plugs (unless Hue smart plugs)
|
||||||
|
|
||||||
Notes
|
## Common Commands
|
||||||
|
|
||||||
- You may need to press the Hue Bridge button during setup.
|
### List Resources
|
||||||
- Use `--room "Room Name"` when light names are ambiguous.
|
|
||||||
|
```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)
|
||||||
|
|||||||
@@ -5,131 +5,149 @@ metadata:
|
|||||||
{ "openclaw": { "emoji": "🧵", "os": ["darwin", "linux"], "requires": { "bins": ["tmux"] } } }
|
{ "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
|
```bash
|
||||||
SOCKET_DIR="${OPENCLAW_TMUX_SOCKET_DIR:-${CLAWDBOT_TMUX_SOCKET_DIR:-${TMPDIR:-/tmp}/openclaw-tmux-sockets}}"
|
tmux list-sessions
|
||||||
mkdir -p "$SOCKET_DIR"
|
tmux ls
|
||||||
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
|
|
||||||
```
|
```
|
||||||
|
|
||||||
After starting a session, always print monitor commands:
|
### Capture Output
|
||||||
|
|
||||||
```
|
|
||||||
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):
|
|
||||||
|
|
||||||
```bash
|
```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
|
### Send Keys
|
||||||
|
|
||||||
- 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:
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
SOCKET="${TMPDIR:-/tmp}/codex-army.sock"
|
# Send text (doesn't press Enter)
|
||||||
|
tmux send-keys -t shared "hello"
|
||||||
|
|
||||||
# Create multiple sessions
|
# Send text + Enter
|
||||||
for i in 1 2 3 4 5; do
|
tmux send-keys -t shared "y" Enter
|
||||||
tmux -S "$SOCKET" new-session -d -s "agent-$i"
|
|
||||||
|
# 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
|
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:**
|
### Send Task to Session
|
||||||
|
|
||||||
- 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.
|
|
||||||
|
|
||||||
```bash
|
```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)
|
## Notes
|
||||||
- `-p`/`--pattern` regex to match (required); add `-F` for fixed string
|
|
||||||
- `-T` timeout seconds (integer, default 15)
|
- Use `capture-pane -p` to print to stdout (essential for scripting)
|
||||||
- `-i` poll interval seconds (default 0.5)
|
- `-S -` captures entire scrollback history
|
||||||
- `-l` history lines to search (integer, default 1000)
|
- Target format: `session:window.pane` (e.g., `shared:0.0`)
|
||||||
|
- Sessions persist across SSH disconnects
|
||||||
|
|||||||
@@ -5,50 +5,108 @@ homepage: https://wttr.in/:help
|
|||||||
metadata: { "openclaw": { "emoji": "🌤️", "requires": { "bins": ["curl"] } } }
|
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
|
```bash
|
||||||
curl -s "wttr.in/London?format=3"
|
# One-line summary
|
||||||
# Output: London: ⛅️ +8°C
|
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
|
```bash
|
||||||
curl -s "wttr.in/London?format=%l:+%c+%t+%h+%w"
|
# 3-day forecast
|
||||||
# Output: London: ⛅️ +8°C 71% ↙5km/h
|
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
|
```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`
|
## Quick Responses
|
||||||
- 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`
|
|
||||||
|
|
||||||
## Open-Meteo (fallback, JSON)
|
**"What's the weather?"**
|
||||||
|
|
||||||
Free, no key, good for programmatic use:
|
|
||||||
|
|
||||||
```bash
|
```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`
|
||||||
|
|||||||
Reference in New Issue
Block a user