[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6FH3HTREPCTM5J49CJB3XDV":3,"skill-same:01M6FH3HTREPCTM5J49CJB3XDV":47},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":20,"linkOnly":21,"markdownContent":22,"markdownBody":22,"frontMatter":23,"refName":24,"commitSha":25,"skillDirectory":26,"forksCount":27,"repositoryHtmlUrl":28,"repositoryHomepageUrl":29,"ownerHtmlUrl":30,"ownerBlogUrl":6,"ownerDescription":31,"updatedAt":32,"install":33,"resources":46},"01M6FH3HTREPCTM5J49CJB3XDV","x-bookmarks",null,"ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",66,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fsharbelxyz\u002Fx-bookmarks\u002Fx-bookmarks\u002FSKILL.md",[],[18,19],"bookmarks","x bookmarks","2026-11-10 10:12:30",false,"# X Bookmarks v2\n\nTurn X\u002FTwitter bookmarks from a graveyard of good intentions into actionable work.\n\n**Core philosophy:** Don't just summarize — propose actions the agent can execute.\n\n## Data Source Selection\n\nThis skill supports **two backends**. Pick the first one that works:\n\n### 1. bird CLI (preferred if available)\n- Fast, no API key needed, uses browser cookies\n- Install: `npm install -g bird-cli`\n- Test: `bird whoami` — if this prints a username, you're good\n\n### 2. X API v2 (fallback)\n- Works without bird CLI\n- Requires an X Developer account + OAuth 2.0 app\n- Setup: see [references\u002Fauth-setup.md](references\u002Fauth-setup.md) → \"X API Setup\"\n\n### Auto-detection logic\n\n```\n1. Check if `bird` command exists → try `bird whoami`\n2. If bird works → use bird CLI path\n3. If not → check for X API tokens (~\u002F.config\u002Fx-bookmarks\u002Ftokens.json)\n4. If tokens exist → use X API path (auto-refresh)\n5. If neither → guide user through setup (offer both options)\n```\n\n## Fetching Bookmarks\n\n### Via bird CLI\n\n```bash\n# Latest 20 bookmarks (default)\nbird bookmarks --json\n\n# Specific count\nbird bookmarks -n 50 --json\n\n# All bookmarks (paginated)\nbird bookmarks --all --json\n\n# With thread context\nbird bookmarks --include-parent --thread-meta --json\n\n# With Chrome cookie auth\nbird --chrome-profile \"Default\" bookmarks --json\n\n# With manual tokens\nbird --auth-token \"$AUTH_TOKEN\" --ct0 \"$CT0\" bookmarks --json\n```\n\nIf user has a `.env.bird` file or env vars `AUTH_TOKEN`\u002F`CT0`, source them first: `source .env.bird`\n\n### Via X API v2\n\n```bash\n# First-time setup (opens browser for OAuth)\npython3 scripts\u002Fx_api_auth.py --client-id \"YOUR_CLIENT_ID\" --client-secret \"YOUR_SECRET\"\n\n# Fetch bookmarks (auto-refreshes token)\npython3 scripts\u002Ffetch_bookmarks_api.py -n 20\n\n# All bookmarks\npython3 scripts\u002Ffetch_bookmarks_api.py --all\n\n# Since a specific tweet\npython3 scripts\u002Ffetch_bookmarks_api.py --since-id \"1234567890\"\n\n# Pretty print\npython3 scripts\u002Ffetch_bookmarks_api.py -n 50 --pretty\n```\n\nThe API script outputs the **same JSON format** as bird CLI, so all downstream workflows work identically.\n\n**Token management is automatic:** tokens are stored in `~\u002F.config\u002Fx-bookmarks\u002Ftokens.json` and refreshed via the saved refresh_token. If refresh fails, the agent should guide the user to re-run `x_api_auth.py`.\n\n### Environment variable override\n\nIf the user already has a Bearer token (e.g., from another tool), they can skip the OAuth dance:\n```bash\nX_API_BEARER_TOKEN=\"your_token\" python3 scripts\u002Ffetch_bookmarks_api.py -n 20\n```\n\n## JSON Output Format (both backends)\n\nEach bookmark returns:\n```json\n{\n  \"id\": \"tweet_id\",\n  \"text\": \"tweet content\",\n  \"createdAt\": \"2026-02-11T01:00:06.000Z\",\n  \"replyCount\": 46,\n  \"retweetCount\": 60,\n  \"likeCount\": 801,\n  \"bookmarkCount\": 12,\n  \"viewCount\": 50000,\n  \"author\": { \"username\": \"handle\", \"name\": \"Display Name\" },\n  \"media\": [{ \"type\": \"photo|video\", \"url\": \"...\" }],\n  \"quotedTweet\": { \"id\": \"...\" }\n}\n```\n\n## Core Workflows\n\n### 1. Action-First Digest (Primary Use Case)\n\nThe key differentiator: don't just summarize, **propose actions the agent can execute**.\n\n1. Fetch bookmarks (bird or API, auto-detected)\n2. Parse and categorize by topic (auto-detect: crypto, AI, marketing, tools, personal, etc.)\n3. For EACH category, propose specific actions:\n   - **Tool\u002Frepo bookmarks** → \"I can test this, set it up, or analyze the code\"\n   - **Strategy\u002Fadvice bookmarks** → \"Here are the actionable steps extracted — want me to implement any?\"\n   - **News\u002Ftrends** → \"This connects to [user's work]. Here's the angle for content\"\n   - **Content ideas** → \"This would make a great tweet\u002Fvideo in your voice. Here's a draft\"\n   - **Questions\u002Fdiscussions** → \"I can research this deeper and give you a summary\"\n4. Flag stale bookmarks (>2 weeks old) — \"Use it or lose it\"\n5. Deliver categorized digest with actions\n\nFormat output as:\n```\n? CATEGORY (count)\n• Bookmark summary (@author)\n→ ? I CAN: [specific action the agent can take]\n```\n\n### 2. Scheduled Digest (Cron)\n\nSet up a recurring bookmark check. Suggest this cron config to the user:\n\n```\nSchedule: daily or weekly\nPayload: \"Check my X bookmarks for new saves since last check.\n  Fetch bookmarks, compare against last digest, summarize only NEW ones.\n  Categorize and propose actions. Deliver to me.\"\n```\n\nTrack state by saving the most recent bookmark ID processed. Store in workspace:\n`memory\u002Fbookmark-state.json` → `{ \"lastSeenId\": \"...\", \"lastDigestAt\": \"...\" }`\n\n### 3. Content Recycling\n\nWhen user asks for content ideas from bookmarks:\n1. Fetch recent bookmarks\n2. Identify high-engagement tweets (>500 likes) with frameworks, tips, or insights\n3. Rewrite key ideas in the user's voice (if voice data available)\n4. Suggest posting times based on the bookmark's original engagement\n\n### 4. Pattern Detection\n\nWhen user has enough bookmark history:\n1. Fetch all bookmarks (`--all`)\n2. Cluster by topic\u002Fkeywords\n3. Report: \"You've bookmarked N tweets about [topic]. Want me to go deeper?\"\n4. Suggest: research reports, content series, or tools based on patterns\n\n### 5. Bookmark Cleanup\n\nFor stale bookmarks:\n1. Identify bookmarks older than a threshold (default: 30 days)\n2. For each: extract the TL;DR and one actionable takeaway\n3. Present: \"Apply it today or clear it\"\n4. User can unbookmark via: `bird unbookmark \u003Ctweet-id>` (bird only)\n\n## Error Handling\n\n| Error | Cause | Fix |\n|-------|-------|-----|\n| `bird: command not found` | bird CLI not installed | Use X API path instead, or `npm i -g bird-cli` |\n| \"No Twitter cookies found\" | Not logged into X in browser | Log into x.com in Chrome\u002FFirefox, or use X API |\n| EPERM on Safari cookies | macOS permissions | Use Chrome\u002FFirefox or X API instead |\n| Empty results | Cookies\u002Ftoken expired | Re-login or re-run `x_api_auth.py` |\n| Rate limit (429) | Too many API requests | Wait and retry, use `--count` to limit |\n| \"No X API token found\" | Haven't run auth setup | Run `x_api_auth.py --client-id YOUR_ID` |\n| Token refresh failed | Refresh token expired | Re-run `x_api_auth.py` to re-authorize |\n\n## Tips\n\n- Start with `-n 20` for quick digests, `--all` for deep analysis\n- bird: Use `--include-parent` for thread context on replies\n- API: includes `bookmarkCount` and `viewCount` (bird may not)\n- Bookmark folders supported via bird `--folder-id \u003Cid>`\n- Both backends output identical JSON — workflows are backend-agnostic\n",{},"main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002Fsharbelxyz\u002Fx-bookmarks\u002Fx-bookmarks",24,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub","https:\u002F\u002Fskillshub.wtf","https:\u002F\u002Fgithub.com\u002FComeOnOliver","AI & Blockchain Engineer\r\n","2026-06-24 22:07:19",{"source":7,"skillName":5,"commands":34,"prompt":44,"zipAvailable":45},[35,38,41],{"tool":36,"command":37},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill x-bookmarks",{"tool":39,"command":40},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill x-bookmarks",{"tool":42,"command":43},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill x-bookmarks","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fsharbelxyz\u002Fx-bookmarks\u002Fx-bookmarks\u002FSKILL.md",true,[],[48,62,72,81,87,94],{"skillNo":49,"name":50,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":51,"categories":52,"keywords":58,"publishedAt":20},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[53],{"categoryNo":54,"categoryName":55,"taxonomyType":56,"taxonomyTypeDesc":57},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[59,60,61],"model","model hierarchy","model hierarchy skill",{"skillNo":63,"name":64,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":65,"categories":66,"keywords":68,"publishedAt":20},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[67],{"categoryNo":54,"categoryName":55,"taxonomyType":56,"taxonomyTypeDesc":57},[69,70,71],"MCP","zoom","zoom mcp",{"skillNo":73,"name":74,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":75,"categories":76,"keywords":77,"publishedAt":20},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[78,79,80,70],"sdk","zoom apps sdk","apps",{"skillNo":82,"name":83,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":84,"categories":85,"keywords":86,"publishedAt":20},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[83],{"skillNo":88,"name":89,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":90,"categories":91,"keywords":93,"publishedAt":20},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[92],{"categoryNo":54,"categoryName":55,"taxonomyType":56,"taxonomyTypeDesc":57},[89],{"skillNo":95,"name":96,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":97,"categories":98,"keywords":99,"publishedAt":20},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[96]]