[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6N3V693KVG1NBC8EXJWX4XS":3,"skill-same:01M6N3V693KVG1NBC8EXJWX4XS":99},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":14,"categories":15,"keywords":21,"publishedAt":25,"linkOnly":26,"markdownContent":27,"markdownBody":27,"frontMatter":28,"refName":29,"commitSha":30,"skillDirectory":31,"forksCount":32,"repositoryHtmlUrl":33,"repositoryHomepageUrl":6,"ownerHtmlUrl":34,"ownerBlogUrl":6,"ownerDescription":35,"updatedAt":36,"install":37,"resources":50},"01M6N3V693KVG1NBC8EXJWX4XS","x-bookmark-archiver",null,"Kernel8901\u002Fai-agent-skills-classification","Kernel8901","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F72647553?v=4","01M6KV388J2H5PNC8D8P940BJD","01M6KV38CS5B3AY63RKZB410YM",7,"MIT","https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F人工智能与大型语言模型\u002Fx-bookmark-archiver\u002FSKILL.md",[16],{"categoryNo":17,"categoryName":18,"taxonomyType":19,"taxonomyTypeDesc":20},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",[22,23,24],"bookmark","archiver","x bookmark archiver","2026-11-10 10:12:30",false,"# X Bookmark Archiver\n\nArchive your X (Twitter) bookmarks into categorized markdown files with AI-generated summaries.\n\n## Overview\n\nThis skill fetches your X bookmarks using the [bird CLI](https:\u002F\u002Fgithub.com\u002Fsteipete\u002Fbird), categorizes them by URL patterns, generates AI summaries using OpenAI, and saves them as organized markdown files.\n\n## Prerequisites\n\n1. **bird CLI** - Install from [steipete\u002Fbird](https:\u002F\u002Fgithub.com\u002Fsteipete\u002Fbird)\n2. **OpenAI API Key** (optional) - Set `OPENAI_API_KEY` for AI-generated summaries\n3. **Node.js 18+**\n\n## Installation\n\n```bash\n# Ensure bird CLI is installed and authenticated\nbird --version\n\n# Set OpenAI API key (optional, for AI summaries)\nexport OPENAI_API_KEY=\"sk-...\"\n```\n\n## Commands\n\n### `run` - Full Pipeline\n\nFetches new bookmarks and processes them:\n\n```bash\nnode skills\u002Fx-bookmark-archiver\u002Fscripts\u002Frun.cjs\n```\n\n### `run --force` - Process Existing\n\nSkip fetch, process only pending bookmarks:\n\n```bash\nnode skills\u002Fx-bookmark-archiver\u002Fscripts\u002Frun.cjs --force\n```\n\n### `fetch` - Download Bookmarks Only\n\n```bash\nnode skills\u002Fx-bookmark-archiver\u002Fscripts\u002Ffetch.cjs\n```\n\n### `process` - Archive Pending Only\n\n```bash\nnode skills\u002Fx-bookmark-archiver\u002Fscripts\u002Fprocess.cjs\n```\n\n## Category Mapping\n\nBookmarks are automatically categorized based on URL patterns:\n\n| Category | Domains |\n|----------|---------|\n| **tools** | github.com, gitlab.com, github.io, huggingface.co, replicate.com, vercel.com, npmjs.com, pypi.org |\n| **articles** | medium.com, substack.com, dev.to, hashnode.dev, x.com\u002Fi\u002Farticle, blog.*, towardsdatascience.com |\n| **videos** | youtube.com, youtu.be, vimeo.com, twitch.tv |\n| **research** | arxiv.org, paperswithcode.com, semanticscholar.org, researchgate.net, dl.acm.org, ieee.org |\n| **news** | techcrunch.com, theverge.com, hn.algolia.com, news.ycombinator.com, wired.com, arstechnica.com |\n| **bookmarks** | *fallback for unmatched URLs* |\n\n## Output Location\n\nMarkdown files are created in the **OpenClaw workspace** at:\n\n**Legacy installs (old name):**\n```\n~\u002Fclawd\u002FX-knowledge\u002F\n```\n\n**New installs:**\n```\n~\u002F.openclaw\u002Fworkspace\u002FX-knowledge\u002F\n```\n\n**With profile (`OPENCLAW_PROFILE=prod`):**\n```\n~\u002F.openclaw\u002Fworkspace-prod\u002FX-knowledge\u002F\n```\n\n**Override with environment variable:**\n```bash\nexport OPENCLAW_WORKSPACE=\u002Fcustom\u002Fpath\nnode skills\u002Fx-bookmark-archiver\u002Fscripts\u002Frun.cjs\n# Creates: \u002Fcustom\u002Fpath\u002FX-knowledge\u002F\n```\n\n## Output Structure\n\n```\n~\u002F.openclaw\u002Fworkspace\u002FX-knowledge\u002F\n├── tools\u002F\n│   ├── awesome-ai-project.md\n│   └── useful-cli-tool.md\n├── articles\u002F\n│   ├── how-to-build-x.md\n│   └── ml-best-practices.md\n├── videos\u002F\n│   └── conference-talk.md\n├── research\u002F\n│   └── attention-is-all-you-need.md\n├── news\u002F\n│   └── latest-tech-announcement.md\n└── bookmarks\u002F\n    └── misc-link.md\n```\n\n## Markdown Template\n\nEach archived bookmark gets a markdown file with frontmatter:\n\n```markdown\n---\ntitle: \"Awesome AI Project\"\ntype: tool\ndate_archived: 2026-01-31\nsource_tweet: https:\u002F\u002Fx.com\u002Fi\u002Fweb\u002Fstatus\u002F1234567890\nlink: https:\u002F\u002Fgithub.com\u002Fuser\u002Frepo\ntags: [\"ai\", \"machine-learning\", \"github\"]\n---\n\nThis project implements a novel approach to... (AI-generated summary)\n```\n\n## State Management\n\nState files track processing progress:\n\n```\n\u002Froot\u002Fclawd\u002F.state\u002F\n├── x-bookmark-pending.json     # Bookmarks waiting to be processed\n└── x-bookmark-processed.json   # IDs of already-archived bookmarks\n```\n\n## Environment Variables\n\n| Variable | Required | Description |\n|----------|----------|-------------|\n| `OPENAI_API_KEY` | No | API key for AI-generated summaries |\n\n## Workflow\n\n1. **Fetch**: Downloads latest 50 bookmarks from X\n2. **Filter**: Removes already-processed bookmarks\n3. **Expand**: Resolves t.co shortened URLs\n4. **Categorize**: Assigns category based on URL domain\n5. **Enrich**: Generates title, summary, tags (AI or fallback)\n6. **Write**: Saves as markdown in `X-knowledge\u002F{category}\u002F`\n7. **Track**: Updates processed IDs, clears pending\n\n## Customization\n\n### Adding Categories\n\nEdit `scripts\u002Flib\u002Fcategorize.cjs`:\n\n```javascript\nconst CATEGORIES = {\n  tools: ['github.com', '...'],\n  your_category: ['example.com', '...'],\n  \u002F\u002F ...\n};\n```\n\n### Changing Output Directory\n\nEdit `scripts\u002Fprocess.cjs`:\n\n```javascript\nconst KNOWLEDGE_DIR = 'your-directory-name';\n```\n\n### Using Different AI Provider\n\nModify the `generateMetadata()` function in `scripts\u002Fprocess.cjs` to use your preferred API.\n\n## Testing\n\nRun the test suite:\n\n```bash\n# Run all tests\ncd skills\u002Fx-bookmark-archiver\u002Ftests\nnode test-all.cjs\n\n# Run individual test suites\nnode lib\u002Fcategorize.test.cjs\nnode lib\u002Fstate.test.cjs\nnode integration.test.cjs\n```\n\n### Test Coverage\n\n- **Unit tests**: `categorize.js` (21 tests) - URL pattern matching\n- **Unit tests**: `state.js` (9 tests) - JSON read\u002Fwrite operations\n- **Integration tests** (12 tests) - Full pipeline with mock data\n\n### Manual Testing\n\nWithout bird CLI, you can test with mock data:\n\n```bash\n# Create mock pending data\ncat > \u002Ftmp\u002Ftest-pending.json \u003C\u003C 'EOF'\n[\n  {\n    \"id\": \"test123\",\n    \"url\": \"https:\u002F\u002Fgithub.com\u002Ftest\u002Frepo\",\n    \"text\": \"Test bookmark\"\n  }\n]\nEOF\n\n# Copy to state directory and process\nmkdir -p \u002Froot\u002Fclawd\u002F.state\ncp \u002Ftmp\u002Ftest-pending.json \u002Froot\u002Fclawd\u002F.state\u002Fx-bookmark-pending.json\nnode skills\u002Fx-bookmark-archiver\u002Fscripts\u002Fprocess.cjs\n```\n\n## Troubleshooting\n\n| Issue | Solution |\n|-------|----------|\n| `bird: command not found` | Install bird CLI from GitHub releases |\n| No bookmarks fetched | Ensure you're logged into X in bird |\n| AI summaries not generating | Check `OPENAI_API_KEY` is set |\n| t.co links not expanding | May be network\u002Ftimeout issues; will use original URL |\n\n## File Structure\n\n```\nskills\u002Fx-bookmark-archiver\u002F\n├── SKILL.md\n├── scripts\u002F\n│   ├── fetch.cjs          # Download bookmarks from X (CommonJS)\n│   ├── process.cjs        # Generate markdown files (CommonJS)\n│   ├── run.cjs            # Orchestrate fetch → process (CommonJS)\n│   └── lib\u002F\n│       ├── categorize.cjs # URL → category mapping (CommonJS)\n│       └── state.cjs      # JSON state management (CommonJS)\n└── tests\u002F\n    ├── test-all.cjs\n    ├── lib\u002F\n    │   ├── categorize.test.cjs\n│   │   └── state.test.cjs\n    ├── integration.test.cjs\n    └── fixtures\u002F\n        └── sample-bookmarks.json\n```\n\n## License\n\nMIT\n",{},"main","f4cb2d49f7667e79ef7804f50396d5aaffdf1f56","人工智能与大型语言模型\u002Fx-bookmark-archiver",1,"https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification","https:\u002F\u002Fgithub.com\u002FKernel8901","a little little little dobe in life but science geek","2026-04-05 16:43:56",{"source":7,"skillName":5,"commands":38,"prompt":48,"zipAvailable":49},[39,42,45],{"tool":40,"command":41},"npx","npx skills add Kernel8901\u002Fai-agent-skills-classification --skill x-bookmark-archiver",{"tool":43,"command":44},"bunx","bunx skills add Kernel8901\u002Fai-agent-skills-classification --skill x-bookmark-archiver",{"tool":46,"command":47},"pnpm","pnpm dlx skills add Kernel8901\u002Fai-agent-skills-classification --skill x-bookmark-archiver","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F人工智能与大型语言模型\u002Fx-bookmark-archiver\u002FSKILL.md",true,[51,57,63,67,71,75,79,83,87,91,95],{"path":52,"resourceType":53,"resourceTypeDesc":54,"sizeBytes":55,"sourceHtmlUrl":56},"_meta.json","REFERENCE","参考文档",292,"https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F人工智能与大型语言模型\u002Fx-bookmark-archiver\u002F_meta.json",{"path":58,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":61,"sourceHtmlUrl":62},"scripts\u002Ffetch.cjs","SCRIPT","脚本",1716,"https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F人工智能与大型语言模型\u002Fx-bookmark-archiver\u002Fscripts\u002Ffetch.cjs",{"path":64,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":65,"sourceHtmlUrl":66},"scripts\u002Flib\u002Fcategorize.cjs",1291,"https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F人工智能与大型语言模型\u002Fx-bookmark-archiver\u002Fscripts\u002Flib\u002Fcategorize.cjs",{"path":68,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":69,"sourceHtmlUrl":70},"scripts\u002Flib\u002Fstate.cjs",2166,"https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F人工智能与大型语言模型\u002Fx-bookmark-archiver\u002Fscripts\u002Flib\u002Fstate.cjs",{"path":72,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":73,"sourceHtmlUrl":74},"scripts\u002Fprocess.cjs",8158,"https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F人工智能与大型语言模型\u002Fx-bookmark-archiver\u002Fscripts\u002Fprocess.cjs",{"path":76,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":77,"sourceHtmlUrl":78},"scripts\u002Frun.cjs",1775,"https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F人工智能与大型语言模型\u002Fx-bookmark-archiver\u002Fscripts\u002Frun.cjs",{"path":80,"resourceType":53,"resourceTypeDesc":54,"sizeBytes":81,"sourceHtmlUrl":82},"tests\u002Ffixtures\u002Fsample-bookmarks.json",891,"https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F人工智能与大型语言模型\u002Fx-bookmark-archiver\u002Ftests\u002Ffixtures\u002Fsample-bookmarks.json",{"path":84,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":85,"sourceHtmlUrl":86},"tests\u002Fintegration.test.cjs",6861,"https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F人工智能与大型语言模型\u002Fx-bookmark-archiver\u002Ftests\u002Fintegration.test.cjs",{"path":88,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":89,"sourceHtmlUrl":90},"tests\u002Flib\u002Fcategorize.test.cjs",3629,"https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F人工智能与大型语言模型\u002Fx-bookmark-archiver\u002Ftests\u002Flib\u002Fcategorize.test.cjs",{"path":92,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":93,"sourceHtmlUrl":94},"tests\u002Flib\u002Fstate.test.cjs",4627,"https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F人工智能与大型语言模型\u002Fx-bookmark-archiver\u002Ftests\u002Flib\u002Fstate.test.cjs",{"path":96,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":97,"sourceHtmlUrl":98},"tests\u002Ftest-all.cjs",1448,"https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F人工智能与大型语言模型\u002Fx-bookmark-archiver\u002Ftests\u002Ftest-all.cjs",[100,124,158,169,179,209],{"skillNo":101,"name":102,"nameZh":6,"description":103,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":104,"categories":105,"keywords":106,"publishedAt":25},"01M6Q5R6WZ06RRB9RQTW54B34B","zyfai","Earn yield on any Ethereum wallet on Base, Arbitrum, and Plasma. Use when a user wants passive DeFi yield on their funds. Deploys a non-custodial subaccount (Safe) linked to their EOA, enables automated yield optimization, and lets them deposit\u002Fwithdraw anytime.","https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F金融\u002Fzyfai-sdk\u002FSKILL.md",[],[102,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123],"safe","ethereum","defi","Optimization","user","use","Wallet","base","deposit","withdraw","yield","arbitrum","non-custodial","passive","defi yield","earn","yield optimization",{"skillNo":125,"name":126,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":127,"categories":128,"keywords":140,"publishedAt":25},"01M6Q5R337B5JSNER4P4YS03TN","zerion-api","https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F金融\u002Fzerion-api\u002FSKILL.md",[129,132,135],{"categoryNo":130,"categoryName":131,"taxonomyType":19,"taxonomyTypeDesc":20},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":133,"categoryName":134,"taxonomyType":19,"taxonomyTypeDesc":20},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":136,"categoryName":137,"taxonomyType":138,"taxonomyTypeDesc":139},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[141,142,143,144,145,146,147,109,148,113,149,150,151,152,153,154,155,156,157],"api","zerion api","zerion","MCP","mcp server","server","blockchain","transactions","crypto wallet","crypto","evm","solana","query","across","positions","token","prices",{"skillNo":159,"name":160,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":161,"categories":162,"keywords":166,"publishedAt":25},"01M6Q5QZFYTDAZMZ27BN5VZXAR","zerion-api-skill","https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F金融\u002Fzerion-api-skill\u002FSKILL.md",[163,164,165],{"categoryNo":130,"categoryName":131,"taxonomyType":19,"taxonomyTypeDesc":20},{"categoryNo":133,"categoryName":134,"taxonomyType":19,"taxonomyTypeDesc":20},{"categoryNo":136,"categoryName":137,"taxonomyType":138,"taxonomyTypeDesc":139},[141,167,168,142,143,144,145,146,147,109,148,113,150,151,152,153,154,155,156,157],"api skill","zerion api skill",{"skillNo":170,"name":171,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":172,"categories":173,"keywords":177,"publishedAt":25},"01M6Q5QW17QW98RA3FE45E4RD8","zerion-api-mcp","https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F金融\u002Fzerion-api-mcp\u002FSKILL.md",[174,175,176],{"categoryNo":130,"categoryName":131,"taxonomyType":19,"taxonomyTypeDesc":20},{"categoryNo":133,"categoryName":134,"taxonomyType":19,"taxonomyTypeDesc":20},{"categoryNo":136,"categoryName":137,"taxonomyType":138,"taxonomyTypeDesc":139},[144,141,178,142,143,145,146,109,148,113,149,150,151,152,153,154,155,156,157],"zerion api mcp",{"skillNo":180,"name":181,"nameZh":6,"description":182,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":183,"categories":184,"keywords":188,"publishedAt":25},"01M6Q5QQYZB7A501BDEQWKGSJT","yahoo-finance-forex","Fetches real-time FOREX news and market data from Yahoo Finance for major currency pairs (EUR\u002FUSD, GBP\u002FUSD, USD\u002FJPY, etc.). Analyzes sentiment and provides trading context.","https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F金融\u002Fyahoo-finance-forex\u002FSKILL.md",[185],{"categoryNo":186,"categoryName":187,"taxonomyType":138,"taxonomyTypeDesc":139},"01JBSEEDCAT000000000000040","财务",[189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208],"finance","yahoo finance","forex","yahoo","yahoo finance forex","github","https","sentiment","real-time","python3","install","Market","usd","news","time","currency","gbp","pip","market data","for",{"skillNo":210,"name":211,"nameZh":6,"description":212,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":213,"categories":214,"keywords":216,"publishedAt":25},"01M6Q5QM6VS84WZVM7BKXXPF32","yahoo-finance","This skill should be used when the user asks to \"get stock prices\", \"check stock quotes\", \"look up earnings\", \"get financial data\", \"find trending stocks\", or needs stock market data from Yahoo Finance.","https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F金融\u002Fyahoo-finance-cli\u002FSKILL.md",[215],{"categoryNo":186,"categoryName":187,"taxonomyType":138,"taxonomyTypeDesc":139},[189,190,192,217,218,219,220,221,222,200,223,224,225,226,227,228,229,230,157,207],"cli","homebrew","find","check","brew","up","local","get","stock","link","trending","sf","quotes","ln"]