# Folo CLI Skill ## Trigger Conditions Use this skill when a user asks to: - Manage RSS subscriptions - Browse timeline entries - Read entry details or readability content - Mark entries as read/unread - Search feeds/lists or trending sources - Import/export OPML - Check unread counts ## Preconditions 1. Node.js and npm are installed so the CLI can be executed with `npx`. 2. Authentication is configured: - `npx --yes folocli@latest login` (recommended, opens browser and auto-logins) - or `npx --yes folocli@latest login --token ` - or set `FOLO_TOKEN=` ## Execution Policy - Prefer `npx --yes folocli@latest ...` for all agent runs. - Do not require `npm install -g folocli`. - No separate update preflight is needed. Using `folocli@latest` is the update strategy. - If a user already has a working global `folo` binary, it is acceptable, but `npx --yes folocli@latest` remains the recommended default in docs and automation. ## Output Contract Default output is JSON with a stable envelope: ```json { "ok": true, "data": {}, "error": null } ``` Errors return: ```json { "ok": false, "data": null, "error": { "code": "UNAUTHORIZED", "message": "Token is invalid or expired." } } ``` You can switch output mode: - `--format json` (default) - `--format table` - `--format plain` ## Core Workflows ### 1. Timeline Reading 1. Fetch timeline: - `npx --yes folocli@latest timeline --limit 10` 2. Get entry detail: - `npx --yes folocli@latest entry get ` 3. Get readability content: - `npx --yes folocli@latest entry read ` ### 2. Subscription Management 1. Discover: - `npx --yes folocli@latest search discover ` 2. Add subscription: - `npx --yes folocli@latest subscription add --feed ` - or `npx --yes folocli@latest subscription add --list ` 3. List subscriptions: - `npx --yes folocli@latest subscription list` ### 3. Unread Processing 1. Check unread total: - `npx --yes folocli@latest unread count` 2. List unread subscriptions: - `npx --yes folocli@latest unread list` 3. Read unread entries: - `npx --yes folocli@latest timeline --unread-only --limit 20` 4. Mark read: - `npx --yes folocli@latest entry mark-read ` - or batch: `npx --yes folocli@latest entry mark-all-read --view articles` ### 4. Collection Operations - Add: `npx --yes folocli@latest collection add ` - Remove: `npx --yes folocli@latest collection remove ` - List: `npx --yes folocli@latest collection list --limit 20` ### 5. OPML Import / Export - Export: - `npx --yes folocli@latest opml export --output backup.opml` - Import: - `npx --yes folocli@latest opml import feeds.opml` ## Pagination Pattern `npx --yes folocli@latest timeline` returns: - `entries` - `nextCursor` - `hasNext` Loop until `hasNext` is `false`: 1. `npx --yes folocli@latest timeline --limit 20` 2. Read `nextCursor` 3. `npx --yes folocli@latest timeline --limit 20 --cursor ` 4. Repeat ## Command Reference - `npx --yes folocli@latest login [--timeout ] [--token ]` - `npx --yes folocli@latest logout` - `npx --yes folocli@latest whoami` - `npx --yes folocli@latest auth login [--timeout ] [--token ]` - `npx --yes folocli@latest auth logout` - `npx --yes folocli@latest auth whoami` - `npx --yes folocli@latest timeline [--view ] [--limit ] [--unread-only] [--cursor ]` - `npx --yes folocli@latest timeline --feed [--limit ] [--cursor ]` - `npx --yes folocli@latest timeline --list [--limit ] [--cursor ]` - `npx --yes folocli@latest timeline --category [--view ] [--limit ]` - `npx --yes folocli@latest subscription list [--view ] [--category ]` - `npx --yes folocli@latest subscription add --feed [--category ] [--view ] [--private]` - `npx --yes folocli@latest subscription add --list [--category ] [--view ]` - `npx --yes folocli@latest subscription remove [--target feed|list|url]` - `npx --yes folocli@latest subscription update [--target feed|list] [--category ] [--title ] [--view <type>] [--private|--public]` - `npx --yes folocli@latest entry get <entryId>` - `npx --yes folocli@latest entry read <entryId>` - `npx --yes folocli@latest entry mark-read <entryId>` - `npx --yes folocli@latest entry mark-unread <entryId>` - `npx --yes folocli@latest entry mark-all-read [--feed <feedId>] [--list <listId>] [--view <type>]` - `npx --yes folocli@latest feed get <feedId|feedUrl>` - `npx --yes folocli@latest feed refresh <feedId>` - `npx --yes folocli@latest feed analytics <feedId>` - `npx --yes folocli@latest list ls` - `npx --yes folocli@latest list get <listId>` - `npx --yes folocli@latest list create --title <title> [--description <desc>] [--view <type>] [--fee <n>]` - `npx --yes folocli@latest list update <listId> [--title <title>] [--description <desc>] [--view <type>] [--fee <n>]` - `npx --yes folocli@latest list delete <listId>` - `npx --yes folocli@latest list add-feed <listId> --feed <feedId>` - `npx --yes folocli@latest list remove-feed <listId> --feed <feedId>` - `npx --yes folocli@latest search discover <keyword> [--type feeds|lists]` - `npx --yes folocli@latest search rsshub <keyword> [--lang <lang>]` - `npx --yes folocli@latest search trending [--range 1d|3d|7d|30d] [--view <type>] [--limit <n>] [--language eng|cmn] [--category <keyword>]` - `npx --yes folocli@latest collection list [--limit <n>] [--cursor <datetime>]` - `npx --yes folocli@latest collection add <entryId> [--view <type>]` - `npx --yes folocli@latest collection remove <entryId>` - `npx --yes folocli@latest opml export [--output <file>]` - `npx --yes folocli@latest opml import <file> [--items <url1,url2,...>]` - `npx --yes folocli@latest unread count` - `npx --yes folocli@latest unread list [--view <type>]` ## Error Recovery - `UNAUTHORIZED` - Re-login: `npx --yes folocli@latest login` - or `npx --yes folocli@latest login --token <token>` - Or set `FOLO_TOKEN` - `HTTP_4xx` / `HTTP_5xx` - Retry with `--verbose` for request details - Verify `--api-url` if using non-default endpoint - `INVALID_ARGUMENT` - Run `npx --yes folocli@latest <command> --help` to inspect accepted options