-
Notifications
You must be signed in to change notification settings - Fork 4
feat: add a privacy-safe Folo RSS workflow #16
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,196 @@ | ||
| --- | ||
| name: folo-cli | ||
| description: Use Folo CLI to manage RSS subscriptions, lists, timeline entries, unread state, collections, feed discovery, and OPML imports or exports. Trigger when the user asks to inspect or change content in their Folo account. | ||
| --- | ||
|
|
||
| # Folo CLI Skill | ||
|
|
||
| Adapted for Codex from the | ||
| [official Folo CLI skill](https://github.com/RSSNext/Folo/blob/main/apps/cli/skill.md). | ||
|
|
||
| ## 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 let 1Password inject `FOLO_TOKEN` into the authorized process at runtime. | ||
|
|
||
| Never request, reveal, print, or persist a Folo session token. Do not place it in | ||
| repository files, shell history, command arguments, logs, or chat. Follow the | ||
| repository's 1Password policy whenever token-based authentication is necessary. | ||
|
|
||
| ## 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. | ||
| - Before mutations, inspect the exact target and confirm that it matches the user's request. | ||
| - Treat bulk removal, list deletion, OPML import, and batch mark-read operations as consequential changes; summarize their scope before executing them. | ||
|
|
||
| ## 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 <entryId>` | ||
| 3. Get readability content: | ||
| - `npx --yes folocli@latest entry read <entryId>` | ||
|
|
||
| ### 2. Subscription Management | ||
|
|
||
| 1. Discover: | ||
| - `npx --yes folocli@latest search discover <keyword>` | ||
| 2. Add subscription: | ||
| - `npx --yes folocli@latest subscription add --feed <url>` | ||
| - or `npx --yes folocli@latest subscription add --list <listId>` | ||
| 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 <entryId>` | ||
| - or batch: `npx --yes folocli@latest entry mark-all-read --view articles` | ||
|
|
||
| ### 4. Collection Operations | ||
|
|
||
| - Add: `npx --yes folocli@latest collection add <entryId>` | ||
| - Remove: `npx --yes folocli@latest collection remove <entryId>` | ||
| - 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 <nextCursor>` | ||
| 4. Repeat | ||
|
|
||
| ## Command Reference | ||
|
|
||
| - `npx --yes folocli@latest login [--timeout <seconds>]` | ||
| - `npx --yes folocli@latest logout` | ||
| - `npx --yes folocli@latest whoami` | ||
| - `npx --yes folocli@latest auth login [--timeout <seconds>]` | ||
| - `npx --yes folocli@latest auth logout` | ||
| - `npx --yes folocli@latest auth whoami` | ||
|
|
||
| - `npx --yes folocli@latest timeline [--view <type>] [--limit <n>] [--unread-only] [--cursor <datetime>]` | ||
| - `npx --yes folocli@latest timeline --feed <feedId> [--limit <n>] [--cursor <datetime>]` | ||
| - `npx --yes folocli@latest timeline --list <listId> [--limit <n>] [--cursor <datetime>]` | ||
| - `npx --yes folocli@latest timeline --category <name> [--view <type>] [--limit <n>]` | ||
|
|
||
| - `npx --yes folocli@latest subscription list [--view <type>] [--category <name>]` | ||
| - `npx --yes folocli@latest subscription add --feed <url> [--category <name>] [--view <type>] [--private]` | ||
| - `npx --yes folocli@latest subscription add --list <listId> [--category <name>] [--view <type>]` | ||
| - `npx --yes folocli@latest subscription remove <id> [--target feed|list|url]` | ||
| - `npx --yes folocli@latest subscription update <id> [--target feed|list] [--category <name>] [--title <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 with `npx --yes folocli@latest login`. | ||
| - If token-based login is required, use 1Password runtime injection for `FOLO_TOKEN`. | ||
| - `HTTP_4xx` / `HTTP_5xx` | ||
| - Retry with `--verbose` for request details, while ensuring no authentication material is included in captured output. | ||
| - Verify `--api-url` if using a non-default endpoint. | ||
| - `INVALID_ARGUMENT` | ||
| - Run `npx --yes folocli@latest <command> --help` to inspect accepted options. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
On Python 3.11, which is also explicitly selected elsewhere in this repository, the non-Folo count metrics reach this function as
intvalues andinthas nois_integer()method. As a result,python3 .github/scripts/audit.py --update README.mdcrashes while rendering the first integer-valued row, which also breaks the documented pre-commit hook on Python 3.11; normalize the value tofloator test it without calling this method directly.AGENTS.md reference: AGENTS.md:L36-L42
Useful? React with 👍 / 👎.