commit 20e4722fb1060cc64de7c5fc28a5ba4364bb7366 Author: Harivansh Rathi Date: Mon Jan 19 01:11:28 2026 -0500 init diff --git a/skill-index/skills/1password/SKILL.md b/skill-index/skills/1password/SKILL.md new file mode 100644 index 0000000..7bac1be --- /dev/null +++ b/skill-index/skills/1password/SKILL.md @@ -0,0 +1,53 @@ +--- +name: 1password +description: Set up and use 1Password CLI (op). Use when installing the CLI, enabling desktop app integration, signing in (single or multi-account), or reading/injecting/running secrets via op. +homepage: https://developer.1password.com/docs/cli/get-started/ +metadata: {"clawdbot":{"emoji":"🔐","requires":{"bins":["op"]},"install":[{"id":"brew","kind":"brew","formula":"1password-cli","bins":["op"],"label":"Install 1Password CLI (brew)"}]}} +--- + +# 1Password CLI + +Follow the official CLI get-started steps. Don't guess install commands. + +## References + +- `references/get-started.md` (install + app integration + sign-in flow) +- `references/cli-examples.md` (real `op` examples) + +## Workflow + +1. Check OS + shell. +2. Verify CLI present: `op --version`. +3. Confirm desktop app integration is enabled (per get-started) and the app is unlocked. +4. REQUIRED: create a fresh tmux session for all `op` commands (no direct `op` calls outside tmux). +5. Sign in / authorize inside tmux: `op signin` (expect app prompt). +6. Verify access inside tmux: `op whoami` (must succeed before any secret read). +7. If multiple accounts: use `--account` or `OP_ACCOUNT`. + +## REQUIRED tmux session (T-Max) + +The shell tool uses a fresh TTY per command. To avoid re-prompts and failures, always run `op` inside a dedicated tmux session with a fresh socket/session name. + +Example (see `tmux` skill for socket conventions, do not reuse old session names): + +```bash +SOCKET_DIR="${CLAWDBOT_TMUX_SOCKET_DIR:-${TMPDIR:-/tmp}/clawdbot-tmux-sockets}" +mkdir -p "$SOCKET_DIR" +SOCKET="$SOCKET_DIR/clawdbot-op.sock" +SESSION="op-auth-$(date +%Y%m%d-%H%M%S)" + +tmux -S "$SOCKET" new -d -s "$SESSION" -n shell +tmux -S "$SOCKET" send-keys -t "$SESSION":0.0 -- "op signin --account my.1password.com" Enter +tmux -S "$SOCKET" send-keys -t "$SESSION":0.0 -- "op whoami" Enter +tmux -S "$SOCKET" send-keys -t "$SESSION":0.0 -- "op vault list" Enter +tmux -S "$SOCKET" capture-pane -p -J -t "$SESSION":0.0 -S -200 +tmux -S "$SOCKET" kill-session -t "$SESSION" +``` + +## Guardrails + +- Never paste secrets into logs, chat, or code. +- Prefer `op run` / `op inject` over writing secrets to disk. +- If sign-in without app integration is needed, use `op account add`. +- If a command returns "account is not signed in", re-run `op signin` inside tmux and authorize in the app. +- Do not run `op` outside tmux; stop and ask if tmux is unavailable. diff --git a/skill-index/skills/1password/references/cli-examples.md b/skill-index/skills/1password/references/cli-examples.md new file mode 100644 index 0000000..c8da097 --- /dev/null +++ b/skill-index/skills/1password/references/cli-examples.md @@ -0,0 +1,29 @@ +# op CLI examples (from op help) + +## Sign in + +- `op signin` +- `op signin --account ` + +## Read + +- `op read op://app-prod/db/password` +- `op read "op://app-prod/db/one-time password?attribute=otp"` +- `op read "op://app-prod/ssh key/private key?ssh-format=openssh"` +- `op read --out-file ./key.pem op://app-prod/server/ssh/key.pem` + +## Run + +- `export DB_PASSWORD="op://app-prod/db/password"` +- `op run --no-masking -- printenv DB_PASSWORD` +- `op run --env-file="./.env" -- printenv DB_PASSWORD` + +## Inject + +- `echo "db_password: {{ op://app-prod/db/password }}" | op inject` +- `op inject -i config.yml.tpl -o config.yml` + +## Whoami / accounts + +- `op whoami` +- `op account list` diff --git a/skill-index/skills/1password/references/get-started.md b/skill-index/skills/1password/references/get-started.md new file mode 100644 index 0000000..3c60f75 --- /dev/null +++ b/skill-index/skills/1password/references/get-started.md @@ -0,0 +1,17 @@ +# 1Password CLI get-started (summary) + +- Works on macOS, Windows, and Linux. + - macOS/Linux shells: bash, zsh, sh, fish. + - Windows shell: PowerShell. +- Requires a 1Password subscription and the desktop app to use app integration. +- macOS requirement: Big Sur 11.0.0 or later. +- Linux app integration requires PolKit + an auth agent. +- Install the CLI per the official doc for your OS. +- Enable desktop app integration in the 1Password app: + - Open and unlock the app, then select your account/collection. + - macOS: Settings > Developer > Integrate with 1Password CLI (Touch ID optional). + - Windows: turn on Windows Hello, then Settings > Developer > Integrate. + - Linux: Settings > Security > Unlock using system authentication, then Settings > Developer > Integrate. +- After integration, run any command to sign in (example in docs: `op vault list`). +- If multiple accounts: use `op signin` to pick one, or `--account` / `OP_ACCOUNT`. +- For non-integration auth, use `op account add`. diff --git a/skill-index/skills/apple-notes/SKILL.md b/skill-index/skills/apple-notes/SKILL.md new file mode 100644 index 0000000..441e226 --- /dev/null +++ b/skill-index/skills/apple-notes/SKILL.md @@ -0,0 +1,50 @@ +--- +name: apple-notes +description: Manage Apple Notes via the `memo` CLI on macOS (create, view, edit, delete, search, move, and export notes). Use when a user asks Clawdbot to add a note, list notes, search notes, or manage note folders. +homepage: https://github.com/antoniorodr/memo +metadata: {"clawdbot":{"emoji":"📝","os":["darwin"],"requires":{"bins":["memo"]},"install":[{"id":"brew","kind":"brew","formula":"antoniorodr/memo/memo","bins":["memo"],"label":"Install memo via Homebrew"}]}} +--- + +# Apple Notes CLI + +Use `memo notes` to manage Apple Notes directly from the terminal. Create, view, edit, delete, search, move notes between folders, and export to HTML/Markdown. + +Setup +- Install (Homebrew): `brew tap antoniorodr/memo && brew install antoniorodr/memo/memo` +- Manual (pip): `pip install .` (after cloning the repo) +- macOS-only; if prompted, grant Automation access to Notes.app. + +View Notes +- List all notes: `memo notes` +- Filter by folder: `memo notes -f "Folder Name"` +- Search notes (fuzzy): `memo notes -s "query"` + +Create Notes +- Add a new note: `memo notes -a` + - Opens an interactive editor to compose the note. +- Quick add with title: `memo notes -a "Note Title"` + +Edit Notes +- Edit existing note: `memo notes -e` + - Interactive selection of note to edit. + +Delete Notes +- Delete a note: `memo notes -d` + - Interactive selection of note to delete. + +Move Notes +- Move note to folder: `memo notes -m` + - Interactive selection of note and destination folder. + +Export Notes +- Export to HTML/Markdown: `memo notes -ex` + - Exports selected note; uses Mistune for markdown processing. + +Limitations +- Cannot edit notes containing images or attachments. +- Interactive prompts may require terminal access. + +Notes +- macOS-only. +- Requires Apple Notes.app to be accessible. +- For automation, grant permissions in System Settings > Privacy & Security > Automation. diff --git a/skill-index/skills/apple-reminders/SKILL.md b/skill-index/skills/apple-reminders/SKILL.md new file mode 100644 index 0000000..07e5e92 --- /dev/null +++ b/skill-index/skills/apple-reminders/SKILL.md @@ -0,0 +1,67 @@ +--- +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. +homepage: https://github.com/steipete/remindctl +metadata: {"clawdbot":{"emoji":"⏰","os":["darwin"],"requires":{"bins":["remindctl"]},"install":[{"id":"brew","kind":"brew","formula":"steipete/tap/remindctl","bins":["remindctl"],"label":"Install remindctl via Homebrew"}]}} +--- + +# Apple Reminders CLI (remindctl) + +Use `remindctl` to manage Apple Reminders directly from the terminal. It supports list filtering, date-based views, and scripting output. + +Setup +- Install (Homebrew): `brew install steipete/tap/remindctl` +- From source: `pnpm install && pnpm build` (binary at `./bin/remindctl`) +- macOS-only; grant Reminders permission when prompted. + +Permissions +- Check status: `remindctl status` +- Request access: `remindctl authorize` + +View Reminders +- 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` + +Manage Lists +- 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` + +Create Reminders +- Quick add: `remindctl add "Buy milk"` +- With list + due: `remindctl add --title "Call mom" --list Personal --due tomorrow` + +Edit Reminders +- Edit title/due: `remindctl edit 1 --title "New title" --due 2026-01-04` + +Complete Reminders +- Complete by id: `remindctl complete 1 2 3` + +Delete Reminders +- Delete by id: `remindctl delete 4A83 --force` + +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` +- `YYYY-MM-DD` +- `YYYY-MM-DD HH:mm` +- ISO 8601 (`2026-01-04T12:34:56Z`) + +Notes +- 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. diff --git a/skill-index/skills/bear-notes/SKILL.md b/skill-index/skills/bear-notes/SKILL.md new file mode 100644 index 0000000..fe4d716 --- /dev/null +++ b/skill-index/skills/bear-notes/SKILL.md @@ -0,0 +1,79 @@ +--- +name: bear-notes +description: Create, search, and manage Bear notes via grizzly CLI. +homepage: https://bear.app +metadata: {"clawdbot":{"emoji":"🐻","os":["darwin"],"requires":{"bins":["grizzly"]},"install":[{"id":"go","kind":"go","module":"github.com/tylerwince/grizzly/cmd/grizzly@latest","bins":["grizzly"],"label":"Install grizzly (go)"}]}} +--- + +# Bear Notes + +Use `grizzly` to create, read, and manage notes in Bear on macOS. + +Requirements +- Bear app installed and running +- For some operations (add-text, tags, open-note --selected), a Bear app token (stored in `~/.config/grizzly/token`) + +## Getting a Bear Token + +For operations that require a token (add-text, tags, open-note --selected), you need an authentication token: +1. Open Bear → Help → API Token → Copy Token +2. Save it: `echo "YOUR_TOKEN" > ~/.config/grizzly/token` + +## Common Commands + +Create a note +```bash +echo "Note content here" | grizzly create --title "My Note" --tag work +grizzly create --title "Quick Note" --tag inbox < /dev/null +``` + +Open/read a note by ID +```bash +grizzly open-note --id "NOTE_ID" --enable-callback --json +``` + +Append text to a note +```bash +echo "Additional content" | grizzly add-text --id "NOTE_ID" --mode append --token-file ~/.config/grizzly/token +``` + +List all tags +```bash +grizzly tags --enable-callback --json --token-file ~/.config/grizzly/token +``` + +Search notes (via open-tag) +```bash +grizzly open-tag --name "work" --enable-callback --json +``` + +## Options + +Common flags: +- `--dry-run` — Preview the URL without executing +- `--print-url` — Show the x-callback-url +- `--enable-callback` — Wait for Bear's response (needed for reading data) +- `--json` — Output as JSON (when using callbacks) +- `--token-file PATH` — Path to Bear API token file + +## Configuration + +Grizzly reads config from (in priority order): +1. CLI flags +2. Environment variables (`GRIZZLY_TOKEN_FILE`, `GRIZZLY_CALLBACK_URL`, `GRIZZLY_TIMEOUT`) +3. `.grizzly.toml` in current directory +4. `~/.config/grizzly/config.toml` + +Example `~/.config/grizzly/config.toml`: +```toml +token_file = "~/.config/grizzly/token" +callback_url = "http://127.0.0.1:42123/success" +timeout = "5s" +``` + +## Notes + +- Bear must be running for commands to work +- Note IDs are Bear's internal identifiers (visible in note info or via callbacks) +- Use `--enable-callback` when you need to read data back from Bear +- Some operations require a valid token (add-text, tags, open-note --selected) diff --git a/skill-index/skills/bird/SKILL.md b/skill-index/skills/bird/SKILL.md new file mode 100644 index 0000000..f4de65d --- /dev/null +++ b/skill-index/skills/bird/SKILL.md @@ -0,0 +1,25 @@ +--- +name: bird +description: X/Twitter CLI for reading, searching, and posting via cookies or Sweetistics. +homepage: https://bird.fast +metadata: {"clawdbot":{"emoji":"🐦","requires":{"bins":["bird"]},"install":[{"id":"brew","kind":"brew","formula":"steipete/tap/bird","bins":["bird"],"label":"Install bird (brew)"}]}} +--- + +# bird + +Use `bird` to read/search X and post tweets/replies. + +Quick start +- `bird whoami` +- `bird read ` +- `bird thread ` +- `bird search "query" -n 5` + +Posting (confirm with user first) +- `bird tweet "text"` +- `bird reply "text"` + +Auth sources +- Browser cookies (default: Firefox/Chrome) +- Sweetistics API: set `SWEETISTICS_API_KEY` or use `--engine sweetistics` +- Check sources: `bird check` diff --git a/skill-index/skills/blogwatcher/SKILL.md b/skill-index/skills/blogwatcher/SKILL.md new file mode 100644 index 0000000..f4b03dc --- /dev/null +++ b/skill-index/skills/blogwatcher/SKILL.md @@ -0,0 +1,46 @@ +--- +name: blogwatcher +description: Monitor blogs and RSS/Atom feeds for updates using the blogwatcher CLI. +homepage: https://github.com/Hyaxia/blogwatcher +metadata: {"clawdbot":{"emoji":"📰","requires":{"bins":["blogwatcher"]},"install":[{"id":"go","kind":"go","module":"github.com/Hyaxia/blogwatcher/cmd/blogwatcher@latest","bins":["blogwatcher"],"label":"Install blogwatcher (go)"}]}} +--- + +# blogwatcher + +Track blog and RSS/Atom feed updates with the `blogwatcher` CLI. + +Install +- Go: `go install github.com/Hyaxia/blogwatcher/cmd/blogwatcher@latest` + +Quick start +- `blogwatcher --help` + +Common commands +- Add a blog: `blogwatcher add "My Blog" https://example.com` +- List blogs: `blogwatcher blogs` +- Scan for updates: `blogwatcher scan` +- List articles: `blogwatcher articles` +- Mark an article read: `blogwatcher read 1` +- Mark all articles read: `blogwatcher read-all` +- Remove a blog: `blogwatcher remove "My Blog"` + +Example output +``` +$ blogwatcher blogs +Tracked blogs (1): + + xkcd + URL: https://xkcd.com +``` +``` +$ blogwatcher scan +Scanning 1 blog(s)... + + xkcd + Source: RSS | Found: 4 | New: 4 + +Found 4 new article(s) total! +``` + +Notes +- Use `blogwatcher --help` to discover flags and options. diff --git a/skill-index/skills/blucli/SKILL.md b/skill-index/skills/blucli/SKILL.md new file mode 100644 index 0000000..e100454 --- /dev/null +++ b/skill-index/skills/blucli/SKILL.md @@ -0,0 +1,27 @@ +--- +name: blucli +description: BluOS CLI (blu) for discovery, playback, grouping, and volume. +homepage: https://blucli.sh +metadata: {"clawdbot":{"emoji":"🫐","requires":{"bins":["blu"]},"install":[{"id":"go","kind":"go","module":"github.com/steipete/blucli/cmd/blu@latest","bins":["blu"],"label":"Install blucli (go)"}]}} +--- + +# blucli (blu) + +Use `blu` to control Bluesound/NAD players. + +Quick start +- `blu devices` (pick target) +- `blu --device status` +- `blu play|pause|stop` +- `blu volume set 15` + +Target selection (in priority order) +- `--device ` +- `BLU_DEVICE` +- config default (if set) + +Common tasks +- Grouping: `blu group status|add|remove` +- TuneIn search/play: `blu tunein search "query"`, `blu tunein play "query"` + +Prefer `--json` for scripts. Confirm the target device before changing playback. diff --git a/skill-index/skills/camsnap/SKILL.md b/skill-index/skills/camsnap/SKILL.md new file mode 100644 index 0000000..c158b1c --- /dev/null +++ b/skill-index/skills/camsnap/SKILL.md @@ -0,0 +1,25 @@ +--- +name: camsnap +description: Capture frames or clips from RTSP/ONVIF cameras. +homepage: https://camsnap.ai +metadata: {"clawdbot":{"emoji":"📸","requires":{"bins":["camsnap"]},"install":[{"id":"brew","kind":"brew","formula":"steipete/tap/camsnap","bins":["camsnap"],"label":"Install camsnap (brew)"}]}} +--- + +# camsnap + +Use `camsnap` to grab snapshots, clips, or motion events from configured cameras. + +Setup +- Config file: `~/.config/camsnap/config.yaml` +- Add camera: `camsnap add --name kitchen --host 192.168.0.10 --user user --pass pass` + +Common commands +- Discover: `camsnap discover --info` +- Snapshot: `camsnap snap kitchen --out shot.jpg` +- Clip: `camsnap clip kitchen --dur 5s --out clip.mp4` +- Motion watch: `camsnap watch kitchen --threshold 0.2 --action '...'` +- Doctor: `camsnap doctor --probe` + +Notes +- Requires `ffmpeg` on PATH. +- Prefer a short test capture before longer clips. diff --git a/skill-index/skills/clawdhub/SKILL.md b/skill-index/skills/clawdhub/SKILL.md new file mode 100644 index 0000000..d9e9fda --- /dev/null +++ b/skill-index/skills/clawdhub/SKILL.md @@ -0,0 +1,53 @@ +--- +name: clawdhub +description: Use the ClawdHub CLI to search, install, update, and publish agent skills from clawdhub.com. Use when you need to fetch new skills on the fly, sync installed skills to latest or a specific version, or publish new/updated skill folders with the npm-installed clawdhub CLI. +metadata: {"clawdbot":{"requires":{"bins":["clawdhub"]},"install":[{"id":"node","kind":"node","package":"clawdhub","bins":["clawdhub"],"label":"Install ClawdHub CLI (npm)"}]}} +--- + +# ClawdHub CLI + +Install +```bash +npm i -g clawdhub +``` + +Auth (publish) +```bash +clawdhub login +clawdhub whoami +``` + +Search +```bash +clawdhub search "postgres backups" +``` + +Install +```bash +clawdhub install my-skill +clawdhub install my-skill --version 1.2.3 +``` + +Update (hash-based match + upgrade) +```bash +clawdhub update my-skill +clawdhub update my-skill --version 1.2.3 +clawdhub update --all +clawdhub update my-skill --force +clawdhub update --all --no-input --force +``` + +List +```bash +clawdhub list +``` + +Publish +```bash +clawdhub publish ./my-skill --slug my-skill --name "My Skill" --version 1.2.0 --changelog "Fixes + docs" +``` + +Notes +- Default registry: https://clawdhub.com (override with CLAWDHUB_REGISTRY or --registry) +- Default workdir: cwd (falls back to Clawdbot workspace); install dir: ./skills (override with --workdir / --dir / CLAWDHUB_WORKDIR) +- Update command hashes local files, resolves matching version, and upgrades to latest unless --version is set diff --git a/skill-index/skills/coding-agent/SKILL.md b/skill-index/skills/coding-agent/SKILL.md new file mode 100644 index 0000000..2437d51 --- /dev/null +++ b/skill-index/skills/coding-agent/SKILL.md @@ -0,0 +1,274 @@ +--- +name: coding-agent +description: Run Codex CLI, Claude Code, OpenCode, or Pi Coding Agent via background process for programmatic control. +metadata: {"clawdbot":{"emoji":"🧩","requires":{"anyBins":["claude","codex","opencode","pi"]}}} +--- + +# Coding Agent (background-first) + +Use **bash background mode** for non-interactive coding work. For interactive coding sessions, use the **tmux** skill (always, except very simple one-shot prompts). + +## The Pattern: workdir + background + +```bash +# Create temp space for chats/scratch work +SCRATCH=$(mktemp -d) + +# Start agent in target directory ("little box" - only sees relevant files) +bash workdir:$SCRATCH background:true command:"" +# Or for project work: +bash workdir:~/project/folder background:true command:"" +# Returns sessionId for tracking + +# Monitor progress +process action:log sessionId:XXX + +# Check if done +process action:poll sessionId:XXX + +# Send input (if agent asks a question) +process action:write sessionId:XXX data:"y" + +# Kill if needed +process action:kill sessionId:XXX +``` + +**Why workdir matters:** Agent wakes up in a focused directory, doesn't wander off reading unrelated files (like your soul.md 😅). + +--- + +## Codex CLI + +**Model:** `gpt-5.2-codex` is the default (set in ~/.codex/config.toml) + +### Building/Creating (use --full-auto or --yolo) +```bash +# --full-auto: sandboxed but auto-approves in workspace +bash workdir:~/project background:true command:"codex exec --full-auto \"Build a snake game with dark theme\"" + +# --yolo: NO sandbox, NO approvals (fastest, most dangerous) +bash workdir:~/project background:true command:"codex --yolo \"Build a snake game with dark theme\"" + +# Note: --yolo is a shortcut for --dangerously-bypass-approvals-and-sandbox +``` + +### Reviewing PRs (vanilla, no flags) + +**⚠️ CRITICAL: Never review PRs in Clawdbot's own project folder!** +- Either use the project where the PR is submitted (if it's NOT ~/Projects/clawdbot) +- Or clone to a temp folder first + +```bash +# Option 1: Review in the actual project (if NOT clawdbot) +bash workdir:~/Projects/some-other-repo background:true command:"codex review --base main" + +# Option 2: Clone to temp folder for safe review (REQUIRED for clawdbot PRs!) +REVIEW_DIR=$(mktemp -d) +git clone https://github.com/clawdbot/clawdbot.git $REVIEW_DIR +cd $REVIEW_DIR && gh pr checkout 130 +bash workdir:$REVIEW_DIR background:true command:"codex review --base origin/main" +# Clean up after: rm -rf $REVIEW_DIR + +# Option 3: Use git worktree (keeps main intact) +git worktree add /tmp/pr-130-review pr-130-branch +bash workdir:/tmp/pr-130-review background:true command:"codex review --base main" +``` + +**Why?** Checking out branches in the running Clawdbot repo can break the live instance! + +### Batch PR Reviews (parallel army!) +```bash +# Fetch all PR refs first +git fetch origin '+refs/pull/*/head:refs/remotes/origin/pr/*' + +# Deploy the army - one Codex per PR! +bash workdir:~/project background:true command:"codex exec \"Review PR #86. git diff origin/main...origin/pr/86\"" +bash workdir:~/project background:true command:"codex exec \"Review PR #87. git diff origin/main...origin/pr/87\"" +bash workdir:~/project background:true command:"codex exec \"Review PR #95. git diff origin/main...origin/pr/95\"" +# ... repeat for all PRs + +# Monitor all +process action:list + +# Get results and post to GitHub +process action:log sessionId:XXX +gh pr comment --body "" +``` + +### Tips for PR Reviews +- **Fetch refs first:** `git fetch origin '+refs/pull/*/head:refs/remotes/origin/pr/*'` +- **Use git diff:** Tell Codex to use `git diff origin/main...origin/pr/XX` +- **Don't checkout:** Multiple parallel reviews = don't let them change branches +- **Post results:** Use `gh pr comment` to post reviews to GitHub + +--- + +## Claude Code + +```bash +bash workdir:~/project background:true command:"claude \"Your task\"" +``` + +--- + +## OpenCode + +```bash +bash workdir:~/project background:true command:"opencode run \"Your task\"" +``` + +--- + +## Pi Coding Agent + +```bash +# Install: npm install -g @mariozechner/pi-coding-agent +bash workdir:~/project background:true command:"pi \"Your task\"" +``` + +--- + +## Pi flags (common) + +- `--print` / `-p`: non-interactive; runs prompt and exits. +- `--provider `: pick provider (default: google). +- `--model `: pick model (default: gemini-2.5-flash). +- `--api-key `: override API key (defaults to env vars). + +Examples: + +```bash +# Set provider + model, non-interactive +bash workdir:~/project background:true command:"pi --provider openai --model gpt-4o-mini -p \"Summarize src/\"" +``` + +--- + +## tmux (interactive sessions) + +Use the tmux skill for interactive coding sessions (always, except very simple one-shot prompts). Prefer bash background mode for non-interactive runs. + +--- + +## Parallel Issue Fixing with git worktrees + tmux + +For fixing multiple issues in parallel, use git worktrees (isolated branches) + tmux sessions: + +```bash +# 1. Clone repo to temp location +cd /tmp && git clone git@github.com:user/repo.git repo-worktrees +cd repo-worktrees + +# 2. Create worktrees for each issue (isolated branches!) +git worktree add -b fix/issue-78 /tmp/issue-78 main +git worktree add -b fix/issue-99 /tmp/issue-99 main + +# 3. Set up tmux sessions +SOCKET="${TMPDIR:-/tmp}/codex-fixes.sock" +tmux -S "$SOCKET" new-session -d -s fix-78 +tmux -S "$SOCKET" new-session -d -s fix-99 + +# 4. Launch Codex in each (after pnpm install!) +tmux -S "$SOCKET" send-keys -t fix-78 "cd /tmp/issue-78 && pnpm install && codex --yolo 'Fix issue #78: . Commit and push.'" Enter +tmux -S "$SOCKET" send-keys -t fix-99 "cd /tmp/issue-99 && pnpm install && codex --yolo 'Fix issue #99: . Commit and push.'" Enter + +# 5. Monitor progress +tmux -S "$SOCKET" capture-pane -p -t fix-78 -S -30 +tmux -S "$SOCKET" capture-pane -p -t fix-99 -S -30 + +# 6. Check if done (prompt returned) +tmux -S "$SOCKET" capture-pane -p -t fix-78 -S -3 | grep -q "❯" && echo "Done!" + +# 7. Create PRs after fixes +cd /tmp/issue-78 && git push -u origin fix/issue-78 +gh pr create --repo user/repo --head fix/issue-78 --title "fix: ..." --body "..." + +# 8. Cleanup +tmux -S "$SOCKET" kill-server +git worktree remove /tmp/issue-78 +git worktree remove /tmp/issue-99 +``` + +**Why worktrees?** Each Codex works in isolated branch, no conflicts. Can run 5+ parallel fixes! + +**Why tmux over bash background?** Codex is interactive — needs TTY for proper output. tmux provides persistent sessions with full history capture. + +--- + +## ⚠️ Rules + +1. **Respect tool choice** — if user asks for Codex, use Codex. NEVER offer to build it yourself! +2. **Be patient** — don't kill sessions because they're "slow" +3. **Monitor with process:log** — check progress without interfering +4. **--full-auto for building** — auto-approves changes +5. **vanilla for reviewing** — no special flags needed +6. **Parallel is OK** — run many Codex processes at once for batch work +7. **NEVER start Codex in ~/clawd/** — it'll read your soul docs and get weird ideas about the org chart! Use the target project dir or /tmp for blank slate chats +8. **NEVER checkout branches in ~/Projects/clawdbot/** — that's the LIVE Clawdbot instance! Clone to /tmp or use git worktree for PR reviews + +--- + +## PR Template (The Razor Standard) + +When submitting PRs to external repos, use this format for quality & maintainer-friendliness: + +````markdown +## Original Prompt +[Exact request/problem statement] + +## What this does +[High-level description] + +**Features:** +- [Key feature 1] +- [Key feature 2] + +**Example usage:** +```bash +# Example +command example +``` + +## Feature intent (maintainer-friendly) +[Why useful, how it fits, workflows it enables] + +## Prompt history (timestamped) +- YYYY-MM-DD HH:MM UTC: [Step 1] +- YYYY-MM-DD HH:MM UTC: [Step 2] + +## How I tested +**Manual verification:** +1. [Test step] - Output: `[result]` +2. [Test step] - Result: [result] + +**Files tested:** +- [Detail] +- [Edge cases] + +## Session logs (implementation) +- [What was researched] +- [What was discovered] +- [Time spent] + +## Implementation details +**New files:** +- `path/file.ts` - [description] + +**Modified files:** +- `path/file.ts` - [change] + +**Technical notes:** +- [Detail 1] +- [Detail 2] + +--- +*Submitted by Razor 🥷 - Mariano's AI agent* +```` + +**Key principles:** +1. Human-written description (no AI slop) +2. Feature intent for maintainers +3. Timestamped prompt history +4. Session logs if using Codex/agent + +**Example:** https://github.com/steipete/bird/pull/22 diff --git a/skill-index/skills/discord/SKILL.md b/skill-index/skills/discord/SKILL.md new file mode 100644 index 0000000..0b64f14 --- /dev/null +++ b/skill-index/skills/discord/SKILL.md @@ -0,0 +1,474 @@ +--- +name: discord +description: Use when you need to control Discord from Clawdbot via the discord tool: send messages, react, post or upload stickers, upload emojis, run polls, manage threads/pins/search, create/edit/delete channels and categories, fetch permissions or member/role/channel info, or handle moderation actions in Discord DMs or channels. +--- + +# Discord Actions + +## Overview + +Use `discord` to manage messages, reactions, threads, polls, and moderation. You can disable groups via `discord.actions.*` (defaults to enabled, except roles/moderation). The tool uses the bot token configured for Clawdbot. + +## Inputs to collect + +- For reactions: `channelId`, `messageId`, and an `emoji`. +- For fetchMessage: `guildId`, `channelId`, `messageId`, or a `messageLink` like `https://discord.com/channels///`. +- For stickers/polls/sendMessage: a `to` target (`channel:` or `user:`). Optional `content` text. +- Polls also need a `question` plus 2–10 `answers`. +- For media: `mediaUrl` with `file:///path` for local files or `https://...` for remote. +- For emoji uploads: `guildId`, `name`, `mediaUrl`, optional `roleIds` (limit 256KB, PNG/JPG/GIF). +- For sticker uploads: `guildId`, `name`, `description`, `tags`, `mediaUrl` (limit 512KB, PNG/APNG/Lottie JSON). + +Message context lines include `discord message id` and `channel` fields you can reuse directly. + +**Note:** `sendMessage` uses `to: "channel:"` format, not `channelId`. Other actions like `react`, `readMessages`, `editMessage` use `channelId` directly. +**Note:** `fetchMessage` accepts message IDs or full links like `https://discord.com/channels///`. + +## Actions + +### React to a message + +```json +{ + "action": "react", + "channelId": "123", + "messageId": "456", + "emoji": "✅" +} +``` + +### List reactions + users + +```json +{ + "action": "reactions", + "channelId": "123", + "messageId": "456", + "limit": 100 +} +``` + +### Send a sticker + +```json +{ + "action": "sticker", + "to": "channel:123", + "stickerIds": ["9876543210"], + "content": "Nice work!" +} +``` + +- Up to 3 sticker IDs per message. +- `to` can be `user:` for DMs. + +### Upload a custom emoji + +```json +{ + "action": "emojiUpload", + "guildId": "999", + "name": "party_blob", + "mediaUrl": "file:///tmp/party.png", + "roleIds": ["222"] +} +``` + +- Emoji images must be PNG/JPG/GIF and <= 256KB. +- `roleIds` is optional; omit to make the emoji available to everyone. + +### Upload a sticker + +```json +{ + "action": "stickerUpload", + "guildId": "999", + "name": "clawdbot_wave", + "description": "Clawdbot waving hello", + "tags": "👋", + "mediaUrl": "file:///tmp/wave.png" +} +``` + +- Stickers require `name`, `description`, and `tags`. +- Uploads must be PNG/APNG/Lottie JSON and <= 512KB. + +### Create a poll + +```json +{ + "action": "poll", + "to": "channel:123", + "question": "Lunch?", + "answers": ["Pizza", "Sushi", "Salad"], + "allowMultiselect": false, + "durationHours": 24, + "content": "Vote now" +} +``` + +- `durationHours` defaults to 24; max 32 days (768 hours). + +### Check bot permissions for a channel + +```json +{ + "action": "permissions", + "channelId": "123" +} +``` + +## Ideas to try + +- React with ✅/⚠️ to mark status updates. +- Post a quick poll for release decisions or meeting times. +- Send celebratory stickers after successful deploys. +- Upload new emojis/stickers for release moments. +- Run weekly “priority check” polls in team channels. +- DM stickers as acknowledgements when a user’s request is completed. + +## Action gating + +Use `discord.actions.*` to disable action groups: +- `reactions` (react + reactions list + emojiList) +- `stickers`, `polls`, `permissions`, `messages`, `threads`, `pins`, `search` +- `emojiUploads`, `stickerUploads` +- `memberInfo`, `roleInfo`, `channelInfo`, `voiceStatus`, `events` +- `roles` (role add/remove, default `false`) +- `channels` (channel/category create/edit/delete/move, default `false`) +- `moderation` (timeout/kick/ban, default `false`) +### Read recent messages + +```json +{ + "action": "readMessages", + "channelId": "123", + "limit": 20 +} +``` + +### Fetch a single message + +```json +{ + "action": "fetchMessage", + "guildId": "999", + "channelId": "123", + "messageId": "456" +} +``` + +```json +{ + "action": "fetchMessage", + "messageLink": "https://discord.com/channels/999/123/456" +} +``` + +### Send/edit/delete a message + +```json +{ + "action": "sendMessage", + "to": "channel:123", + "content": "Hello from Clawdbot" +} +``` + +**With media attachment:** + +```json +{ + "action": "sendMessage", + "to": "channel:123", + "content": "Check out this audio!", + "mediaUrl": "file:///tmp/audio.mp3" +} +``` + +- `to` uses format `channel:` or `user:` for DMs (not `channelId`!) +- `mediaUrl` supports local files (`file:///path/to/file`) and remote URLs (`https://...`) +- Optional `replyTo` with a message ID to reply to a specific message + +```json +{ + "action": "editMessage", + "channelId": "123", + "messageId": "456", + "content": "Fixed typo" +} +``` + +```json +{ + "action": "deleteMessage", + "channelId": "123", + "messageId": "456" +} +``` + +### Threads + +```json +{ + "action": "threadCreate", + "channelId": "123", + "name": "Bug triage", + "messageId": "456" +} +``` + +```json +{ + "action": "threadList", + "guildId": "999" +} +``` + +```json +{ + "action": "threadReply", + "channelId": "777", + "content": "Replying in thread" +} +``` + +### Pins + +```json +{ + "action": "pinMessage", + "channelId": "123", + "messageId": "456" +} +``` + +```json +{ + "action": "listPins", + "channelId": "123" +} +``` + +### Search messages + +```json +{ + "action": "searchMessages", + "guildId": "999", + "content": "release notes", + "channelIds": ["123", "456"], + "limit": 10 +} +``` + +### Member + role info + +```json +{ + "action": "memberInfo", + "guildId": "999", + "userId": "111" +} +``` + +```json +{ + "action": "roleInfo", + "guildId": "999" +} +``` + +### List available custom emojis + +```json +{ + "action": "emojiList", + "guildId": "999" +} +``` + +### Role changes (disabled by default) + +```json +{ + "action": "roleAdd", + "guildId": "999", + "userId": "111", + "roleId": "222" +} +``` + +### Channel info + +```json +{ + "action": "channelInfo", + "channelId": "123" +} +``` + +```json +{ + "action": "channelList", + "guildId": "999" +} +``` + +### Channel management (disabled by default) + +Create, edit, delete, and move channels and categories. Enable via `discord.actions.channels: true`. + +**Create a text channel:** + +```json +{ + "action": "channelCreate", + "guildId": "999", + "name": "general-chat", + "type": 0, + "parentId": "888", + "topic": "General discussion" +} +``` + +- `type`: Discord channel type integer (0 = text, 2 = voice, 4 = category; other values supported) +- `parentId`: category ID to nest under (optional) +- `topic`, `position`, `nsfw`: optional + +**Create a category:** + +```json +{ + "action": "categoryCreate", + "guildId": "999", + "name": "Projects" +} +``` + +**Edit a channel:** + +```json +{ + "action": "channelEdit", + "channelId": "123", + "name": "new-name", + "topic": "Updated topic" +} +``` + +- Supports `name`, `topic`, `position`, `parentId` (null to remove from category), `nsfw`, `rateLimitPerUser` + +**Move a channel:** + +```json +{ + "action": "channelMove", + "guildId": "999", + "channelId": "123", + "parentId": "888", + "position": 2 +} +``` + +- `parentId`: target category (null to move to top level) + +**Delete a channel:** + +```json +{ + "action": "channelDelete", + "channelId": "123" +} +``` + +**Edit/delete a category:** + +```json +{ + "action": "categoryEdit", + "categoryId": "888", + "name": "Renamed Category" +} +``` + +```json +{ + "action": "categoryDelete", + "categoryId": "888" +} +``` + +### Voice status + +```json +{ + "action": "voiceStatus", + "guildId": "999", + "userId": "111" +} +``` + +### Scheduled events + +```json +{ + "action": "eventList", + "guildId": "999" +} +``` + +### Moderation (disabled by default) + +```json +{ + "action": "timeout", + "guildId": "999", + "userId": "111", + "durationMinutes": 10 +} +``` + +## Discord Writing Style Guide + +**Keep it conversational!** Discord is a chat platform, not documentation. + +### Do +- Short, punchy messages (1-3 sentences ideal) +- Multiple quick replies > one wall of text +- Use emoji for tone/emphasis 🦞 +- Lowercase casual style is fine +- Break up info into digestible chunks +- Match the energy of the conversation + +### Don't +- No markdown tables (Discord renders them as ugly raw `| text |`) +- No `## Headers` for casual chat (use **bold** or CAPS for emphasis) +- Avoid multi-paragraph essays +- Don't over-explain simple things +- Skip the "I'd be happy to help!" fluff + +### Formatting that works +- **bold** for emphasis +- `code` for technical terms +- Lists for multiple items +- > quotes for referencing +- Wrap multiple links in `<>` to suppress embeds + +### Example transformations + +❌ Bad: +``` +I'd be happy to help with that! Here's a comprehensive overview of the versioning strategies available: + +## Semantic Versioning +Semver uses MAJOR.MINOR.PATCH format where... + +## Calendar Versioning +CalVer uses date-based versions like... +``` + +✅ Good: +``` +versioning options: semver (1.2.3), calver (2026.01.04), or yolo (`latest` forever). what fits your release cadence? +``` diff --git a/skill-index/skills/eightctl/SKILL.md b/skill-index/skills/eightctl/SKILL.md new file mode 100644 index 0000000..aeffa0b --- /dev/null +++ b/skill-index/skills/eightctl/SKILL.md @@ -0,0 +1,29 @@ +--- +name: eightctl +description: Control Eight Sleep pods (status, temperature, alarms, schedules). +homepage: https://eightctl.sh +metadata: {"clawdbot":{"emoji":"🎛️","requires":{"bins":["eightctl"]},"install":[{"id":"go","kind":"go","module":"github.com/steipete/eightctl/cmd/eightctl@latest","bins":["eightctl"],"label":"Install eightctl (go)"}]}} +--- + +# eightctl + +Use `eightctl` for Eight Sleep pod control. Requires auth. + +Auth +- Config: `~/.config/eightctl/config.yaml` +- Env: `EIGHTCTL_EMAIL`, `EIGHTCTL_PASSWORD` + +Quick start +- `eightctl status` +- `eightctl on|off` +- `eightctl temp 20` + +Common tasks +- Alarms: `eightctl alarm list|create|dismiss` +- Schedules: `eightctl schedule list|create|update` +- Audio: `eightctl audio state|play|pause` +- Base: `eightctl base info|angle` + +Notes +- API is unofficial and rate-limited; avoid repeated logins. +- Confirm before changing temperature or alarms. diff --git a/skill-index/skills/food-order/SKILL.md b/skill-index/skills/food-order/SKILL.md new file mode 100644 index 0000000..8e27125 --- /dev/null +++ b/skill-index/skills/food-order/SKILL.md @@ -0,0 +1,41 @@ +--- +name: food-order +description: Reorder Foodora orders + track ETA/status with ordercli. Never confirm without explicit user approval. Triggers: order food, reorder, track ETA. +homepage: https://ordercli.sh +metadata: {"clawdbot":{"emoji":"🥡","requires":{"bins":["ordercli"]},"install":[{"id":"go","kind":"go","module":"github.com/steipete/ordercli/cmd/ordercli@latest","bins":["ordercli"],"label":"Install ordercli (go)"}]}} +--- + +# Food order (Foodora via ordercli) + +Goal: reorder a previous Foodora order safely (preview first; confirm only on explicit user “yes/confirm/place the order”). + +Hard safety rules +- Never run `ordercli foodora reorder ... --confirm` unless user explicitly confirms placing the order. +- Prefer preview-only steps first; show what will happen; ask for confirmation. +- If user is unsure: stop at preview and ask questions. + +Setup (once) +- Country: `ordercli foodora countries` → `ordercli foodora config set --country AT` +- Login (password): `ordercli foodora login --email you@example.com --password-stdin` +- Login (no password, preferred): `ordercli foodora session chrome --url https://www.foodora.at/ --profile "Default"` + +Find what to reorder +- Recent list: `ordercli foodora history --limit 10` +- Details: `ordercli foodora history show ` +- If needed (machine-readable): `ordercli foodora history show --json` + +Preview reorder (no cart changes) +- `ordercli foodora reorder ` + +Place reorder (cart change; explicit confirmation required) +- Confirm first, then run: `ordercli foodora reorder --confirm` +- Multiple addresses? Ask user for the right `--address-id` (take from their Foodora account / prior order data) and run: + - `ordercli foodora reorder --confirm --address-id ` + +Track the order +- ETA/status (active list): `ordercli foodora orders` +- Live updates: `ordercli foodora orders --watch` +- Single order detail: `ordercli foodora order ` + +Debug / safe testing +- Use a throwaway config: `ordercli --config /tmp/ordercli.json ...` diff --git a/skill-index/skills/gemini/SKILL.md b/skill-index/skills/gemini/SKILL.md new file mode 100644 index 0000000..6ef31ba --- /dev/null +++ b/skill-index/skills/gemini/SKILL.md @@ -0,0 +1,23 @@ +--- +name: gemini +description: Gemini CLI for one-shot Q&A, summaries, and generation. +homepage: https://ai.google.dev/ +metadata: {"clawdbot":{"emoji":"♊️","requires":{"bins":["gemini"]},"install":[{"id":"brew","kind":"brew","formula":"gemini-cli","bins":["gemini"],"label":"Install Gemini CLI (brew)"}]}} +--- + +# Gemini CLI + +Use Gemini in one-shot mode with a positional prompt (avoid interactive mode). + +Quick start +- `gemini "Answer this question..."` +- `gemini --model "Prompt..."` +- `gemini --output-format json "Return JSON"` + +Extensions +- List: `gemini --list-extensions` +- Manage: `gemini extensions ` + +Notes +- If auth is required, run `gemini` once interactively and follow the login flow. +- Avoid `--yolo` for safety. diff --git a/skill-index/skills/gifgrep/SKILL.md b/skill-index/skills/gifgrep/SKILL.md new file mode 100644 index 0000000..6b1ee31 --- /dev/null +++ b/skill-index/skills/gifgrep/SKILL.md @@ -0,0 +1,47 @@ +--- +name: gifgrep +description: Search GIF providers with CLI/TUI, download results, and extract stills/sheets. +homepage: https://gifgrep.com +metadata: {"clawdbot":{"emoji":"🧲","requires":{"bins":["gifgrep"]},"install":[{"id":"brew","kind":"brew","formula":"steipete/tap/gifgrep","bins":["gifgrep"],"label":"Install gifgrep (brew)"},{"id":"go","kind":"go","module":"github.com/steipete/gifgrep/cmd/gifgrep@latest","bins":["gifgrep"],"label":"Install gifgrep (go)"}]}} +--- + +# gifgrep + +Use `gifgrep` to search GIF providers (Tenor/Giphy), browse in a TUI, download results, and extract stills or sheets. + +GIF-Grab (gifgrep workflow) +- Search → preview → download → extract (still/sheet) for fast review and sharing. + +Quick start +- `gifgrep cats --max 5` +- `gifgrep cats --format url | head -n 5` +- `gifgrep search --json cats | jq '.[0].url'` +- `gifgrep tui "office handshake"` +- `gifgrep cats --download --max 1 --format url` + +TUI + previews +- TUI: `gifgrep tui "query"` +- CLI still previews: `--thumbs` (Kitty/Ghostty only; still frame) + +Download + reveal +- `--download` saves to `~/Downloads` +- `--reveal` shows the last download in Finder + +Stills + sheets +- `gifgrep still ./clip.gif --at 1.5s -o still.png` +- `gifgrep sheet ./clip.gif --frames 9 --cols 3 -o sheet.png` +- Sheets = single PNG grid of sampled frames (great for quick review, docs, PRs, chat). +- Tune: `--frames` (count), `--cols` (grid width), `--padding` (spacing). + +Providers +- `--source auto|tenor|giphy` +- `GIPHY_API_KEY` required for `--source giphy` +- `TENOR_API_KEY` optional (Tenor demo key used if unset) + +Output +- `--json` prints an array of results (`id`, `title`, `url`, `preview_url`, `tags`, `width`, `height`) +- `--format` for pipe-friendly fields (e.g., `url`) + +Environment tweaks +- `GIFGREP_SOFTWARE_ANIM=1` to force software animation +- `GIFGREP_CELL_ASPECT=0.5` to tweak preview geometry diff --git a/skill-index/skills/github/SKILL.md b/skill-index/skills/github/SKILL.md new file mode 100644 index 0000000..03b2a00 --- /dev/null +++ b/skill-index/skills/github/SKILL.md @@ -0,0 +1,47 @@ +--- +name: github +description: "Interact with GitHub using the `gh` CLI. Use `gh issue`, `gh pr`, `gh run`, and `gh api` for issues, PRs, CI runs, and advanced queries." +--- + +# 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. + +## Pull Requests + +Check CI status on a PR: +```bash +gh pr checks 55 --repo owner/repo +``` + +List recent workflow runs: +```bash +gh run list --repo owner/repo --limit 10 +``` + +View a run and see which steps failed: +```bash +gh run view --repo owner/repo +``` + +View logs for failed steps only: +```bash +gh run view --repo owner/repo --log-failed +``` + +## API for Advanced Queries + +The `gh api` command is useful for accessing data not available through other subcommands. + +Get PR with specific fields: +```bash +gh api repos/owner/repo/pulls/55 --jq '.title, .state, .user.login' +``` + +## JSON Output + +Most commands support `--json` for structured output. You can use `--jq` to filter: + +```bash +gh issue list --repo owner/repo --json number,title --jq '.[] | "\(.number): \(.title)"' +``` diff --git a/skill-index/skills/gog/SKILL.md b/skill-index/skills/gog/SKILL.md new file mode 100644 index 0000000..35768e6 --- /dev/null +++ b/skill-index/skills/gog/SKILL.md @@ -0,0 +1,90 @@ +--- +name: gog +description: Google Workspace CLI for Gmail, Calendar, Drive, Contacts, Sheets, and Docs. +homepage: https://gogcli.sh +metadata: {"clawdbot":{"emoji":"🎮","requires":{"bins":["gog"]},"install":[{"id":"brew","kind":"brew","formula":"steipete/tap/gogcli","bins":["gog"],"label":"Install gog (brew)"}]}} +--- + +# gog + +Use `gog` for Gmail/Calendar/Drive/Contacts/Sheets/Docs. Requires OAuth setup. + +Setup (once) +- `gog auth credentials /path/to/client_secret.json` +- `gog auth add you@gmail.com --services gmail,calendar,drive,contacts,sheets,docs` +- `gog auth list` + +Common commands +- Gmail search: `gog gmail search 'newer_than:7d' --max 10` +- Gmail send (plain): `gog gmail send --to a@b.com --subject "Hi" --body "Hello"` +- Gmail send (multi-line): `gog gmail send --to a@b.com --subject "Hi" --body-file ./message.txt` +- Gmail send (stdin): `gog gmail send --to a@b.com --subject "Hi" --body-file -` +- Gmail send (HTML): `gog gmail send --to a@b.com --subject "Hi" --body-html "

Hello

"` +- Gmail draft: `gog gmail drafts create --to a@b.com --subject "Hi" --body-file ./message.txt` +- Gmail send draft: `gog gmail drafts send ` +- Gmail reply: `gog gmail send --to a@b.com --subject "Re: Hi" --body "Reply" --reply-to-message-id ` +- Calendar list events: `gog calendar events --from --to ` +- Calendar create event: `gog calendar create --summary "Title" --from --to ` +- Calendar create with color: `gog calendar create --summary "Title" --from --to --event-color 7` +- Calendar update event: `gog calendar update --summary "New Title" --event-color 4` +- Calendar show colors: `gog calendar colors` +- Drive search: `gog drive search "query" --max 10` +- Contacts: `gog contacts list --max 20` +- Sheets get: `gog sheets get "Tab!A1:D10" --json` +- Sheets update: `gog sheets update "Tab!A1:B2" --values-json '[["A","B"],["1","2"]]' --input USER_ENTERED` +- Sheets append: `gog sheets append "Tab!A:C" --values-json '[["x","y","z"]]' --insert INSERT_ROWS` +- Sheets clear: `gog sheets clear "Tab!A2:Z"` +- Sheets metadata: `gog sheets metadata --json` +- Docs export: `gog docs export --format txt --out /tmp/doc.txt` +- Docs cat: `gog docs cat ` + +Calendar Colors +- Use `gog calendar colors` to see all available event colors (IDs 1-11) +- Add colors to events with `--event-color ` flag +- Event color IDs (from `gog calendar colors` output): + - 1: #a4bdfc + - 2: #7ae7bf + - 3: #dbadff + - 4: #ff887c + - 5: #fbd75b + - 6: #ffb878 + - 7: #46d6db + - 8: #e1e1e1 + - 9: #5484ed + - 10: #51b749 + - 11: #dc2127 + +Email Formatting +- Prefer plain text. Use `--body-file` for multi-paragraph messages (or `--body-file -` for stdin). +- Same `--body-file` pattern works for drafts and replies. +- `--body` does not unescape `\n`. If you need inline newlines, use a heredoc or `$'Line 1\n\nLine 2'`. +- Use `--body-html` only when you need rich formatting. +- HTML tags: `

` for paragraphs, `
` for line breaks, `` for bold, `` for italic, `` for links, `