#898 by GitHub stars

joeseesun/qiaomu-opencli-skills

Use opencli CLI to interact with social/content websites (Bilibili, Zhihu, Twitter/X, YouTube, Weibo, 小红书, V2EX, Reddit, HackerNews, 雪球, BOSS直聘 etc.)

History

Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.

View weekly changes

qiaomu-opencli-autofix/SKILL.md

Week of Nov 2, 2026 · +0 / −0 lines

Before Network or broad shell → After Network or broad shell

4d9a08ebff74 → 4d9a08ebff74

Compare on GitHub

Week of Oct 26, 2026 · Line counts unavailable

Before Not checked yet → After Network or broad shell

First observation → 4d9a08ebff74

No earlier version was observed for comparison.

Compare on GitHub

qiaomu-opencli-browser/SKILL.md

Week of Nov 2, 2026 · +0 / −0 lines

Before Network or broad shell → After Network or broad shell

4d9a08ebff74 → 4d9a08ebff74

Compare on GitHub

Week of Oct 26, 2026 · Line counts unavailable

Before Not checked yet → After Network or broad shell

First observation → 4d9a08ebff74

No earlier version was observed for comparison.

Compare on GitHub

qiaomu-opencli-explorer/SKILL.md

Week of Nov 2, 2026 · +0 / −0 lines

Before Network or broad shell → After Network or broad shell

4d9a08ebff74 → 4d9a08ebff74

Compare on GitHub

Week of Oct 26, 2026 · Line counts unavailable

Before Not checked yet → After Network or broad shell

First observation → 4d9a08ebff74

No earlier version was observed for comparison.

Compare on GitHub

qiaomu-opencli-oneshot/SKILL.md

Week of Nov 2, 2026 · +0 / −0 lines

Before Network or broad shell → After Network or broad shell

4d9a08ebff74 → 4d9a08ebff74

Compare on GitHub

Week of Oct 26, 2026 · Line counts unavailable

Before Not checked yet → After Network or broad shell

First observation → 4d9a08ebff74

No earlier version was observed for comparison.

Compare on GitHub

qiaomu-opencli-usage/SKILL.md

Week of Nov 2, 2026 · +0 / −0 lines

Before Network or broad shell → After Network or broad shell

4d9a08ebff74 → 4d9a08ebff74

Compare on GitHub

Week of Oct 26, 2026 · Line counts unavailable

Before Not checked yet → After Network or broad shell

First observation → 4d9a08ebff74

No earlier version was observed for comparison.

Compare on GitHub

qiaomu-smart-search/SKILL.md

Week of Nov 2, 2026 · +0 / −0 lines

Before Instructions only → After Instructions only

4d9a08ebff74 → 4d9a08ebff74

Compare on GitHub

Week of Oct 26, 2026 · Line counts unavailable

Before Not checked yet → After Instructions only

First observation → 4d9a08ebff74

No earlier version was observed for comparison.

Compare on GitHub

View on GitHubAdd to my skills

Verified commit 4d9a08ebff749e5b12ab544d6a72f82bbe78f43d

998GitHub stars
1star in 7 days
6skills in this repository
0commits in 30 days

Heat

1.4
  • Star growth, last 7 daysAhead of 36% of tracked repositories
  • Star growth, last 24 hoursAhead of 3% of tracked repositories
  • Rank movement, last 7 daysAhead of 1% of tracked repositories
  • Commits, last 30 daysAhead of 0% of tracked repositories
  • Accounts asking about it through MCP, last 7 daysNot available
  • Hot votes this weekAhead of 0% of tracked repositories

Heat never changes the order by stars, and sponsorship never touches it. How heat works

Stars over time

Aug 2, 2026Nov 5, 2026998

Individual skills in this repository

How it works

qiaomu-opencli-autofix

When your agent uses it

Automatically fix broken OpenCLI adapters when commands fail. Load this skill when an opencli command fails — it guides you through diagnosing the failure via OPENCLI_DIAGNOSTIC, patching the adapter, and retrying. Works with any AI agent.

What it loads into context

Frontmatter

92 tokens

Always available to the agent

SKILL.md

2,356 tokens

When the skill is activated

Reference documents

0 tokens

Loaded on request

Token counts are estimates. Scripts run separately; they are not counted as reference context.

The playbook

  1. Safety Boundaries
  2. Prerequisites
  3. When to Use This Skill
  4. Before Entering Repair: "Empty" ≠ "Broken"
  5. Step 1: Collect Diagnostic Context
  6. Step 2: Analyze the Failure
  7. Step 3: Explore the Current Website
  8. Step 4: Patch the Adapter
  9. Step 5: Verify the Fix
  10. When to Stop
  11. Example Repair Session

Files

  • SKILL.mdcore9,715 bytes
  • SKILL.mdcore9,715 bytes
  • SKILL.mdcore9,715 bytes
  • SKILL.mdcore9,715 bytes
  • SKILL.mdcore9,715 bytes
  • SKILL.mdcore9,715 bytes
  • SKILL.mdcore9,715 bytes
  • SKILL.mdcore9,715 bytes
  • SKILL.mdcore9,715 bytes
  • SKILL.mdcore9,715 bytes
Read SKILL.md

# OpenCLI AutoFix — Automatic Adapter Self-Repair

When an `opencli` command fails because a website changed its DOM, API, or response schema, **automatically diagnose, fix the adapter, and retry** — don't just report the error.

## Safety Boundaries

**Before starting any repair, check these hard stops:**

- **`AUTH_REQUIRED`** (exit code 77) — **STOP.** Do not modify code. Tell the user to log into the site in Chrome.
- **`BROWSER_CONNECT`** (exit code 69) — **STOP.** Do not modify code. Tell the user to run `opencli doctor`.
- **CAPTCHA / rate limiting** — **STOP.** Not an adapter issue.

**Scope constraint:**
- **Only modify the file at `RepairContext.adapter.sourcePath`** — this is the authoritative adapter location (may be `clis/<site>/` in repo or `~/.opencli/clis/<site>/` for npm installs)
View the complete source on GitHub

Skills included

  • qiaomu-opencli-autofix
  • qiaomu-opencli-browser
  • qiaomu-opencli-explorer
  • qiaomu-opencli-oneshot
  • qiaomu-opencli-usage
  • qiaomu-smart-search

Repository facts

License
MIT
Created
Mar 16, 2026
Last pushed
Apr 9, 2026
Forks
78
Open issues
6
Project activity
Slowing

Rank over the last 12 weeks

Now #898 · best #582 · down 238 in 30 days

  1. #882 on Nov 2
  2. #887 on Nov 3
  3. #891 on Nov 4
  4. #892 on Nov 5
  5. #894 on Nov 6
  6. #898 since Nov 7
27 earlier periods
  1. #545 on Aug 2
  2. #567 on Aug 6
  3. #574 from Aug 10 to Aug 11
  4. #582 on Aug 17
  5. #589 on Aug 20
  6. #598 on Aug 21
  7. #608 on Aug 24
  8. #596 on Aug 29
  9. #635 on Sep 1
  10. #624 on Sep 2
  11. #629 on Sep 7
  12. #641 on Sep 9
  13. #636 on Sep 12
  14. #664 on Sep 17
  15. #681 on Sep 22
  16. #671 on Sep 27
  17. #660 on Oct 1
  18. #702 on Oct 10
  19. #699 on Oct 11
  20. #716 on Oct 12
  21. #710 on Oct 18
  22. #841 on Oct 25
  23. #858 on Oct 28
  24. #863 on Oct 29
  25. #865 on Oct 30
  26. #870 on Oct 31
  27. #872 on Nov 1

Before you install

Network or broad shell

Automated signals, not a guarantee

Checked Nov 4, 2026

Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.

Show 42 notes
  • qiaomu-opencli-autofix/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • qiaomu-opencli-autofix/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • qiaomu-opencli-autofix/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • qiaomu-opencli-autofix/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • qiaomu-opencli-autofix/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • qiaomu-opencli-autofix/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • qiaomu-opencli-autofix/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • qiaomu-opencli-autofix/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • qiaomu-opencli-autofix/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • qiaomu-opencli-browser/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • qiaomu-opencli-browser/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • qiaomu-opencli-browser/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • qiaomu-opencli-browser/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • qiaomu-opencli-browser/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • qiaomu-opencli-browser/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • qiaomu-opencli-browser/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • qiaomu-opencli-browser/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • qiaomu-opencli-browser/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • qiaomu-opencli-browser/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • qiaomu-opencli-browser/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
Show all 163 signals by file

qiaomu-opencli-autofix/SKILL.md

  • Network accessline 76
    },   "page": {     "url": "https://example.com/search",
  • Network accessline 77
    "page": {     "url": "https://example.com/search",     "snapshot": "// DOM snapshot with [N] indices",
  • Network accessline 78
    "url": "https://example.com/search",
  • Network accessline 119
    # Open the page and inspect current DOM opencli browser open https://example.com/target-page && opencli browser state
  • Network accessline 120
    opencli browser open https://example.com/target-page && opencli browser state
  • Network accessline 129
    # Open page with network interceptor, then trigger the action manually opencli browser open https://example.com/target-page && opencli browser state
  • Network accessline 130
    opencli browser open https://example.com/target-page && opencli browser state
  • Network accessline 158
    // Before: const resp = await page.evaluate(`fetch('/api/v1/old-endpoint')...`)
  • Network accessline 159
    // After:  const resp = await page.evaluate(`fetch('/api/v2/new-endpoint')...`)
  • Network accessline 216
    4. AI explores: opencli browser open https://www.zhihu.com/hot && opencli browser state

qiaomu-opencli-browser/SKILL.md

  • Dangerous shell operationline 24
    2. **ALWAYS use `click`/`type`/`select` for interaction, NEVER use `eval` to click or type** — `eval "el.click()"` bypasses scrollIntoView and CDP click pipeline, causing failures on off-screen elements. Use `state` to find the `[N]` index,
  • Dangerous shell operationline 28
    6. **`eval` is read-only** — use `eval` ONLY for data extraction (`JSON.stringify(...)`), never for clicking, typing, or navigating. Always wrap in IIFE to avoid variable conflicts: `eval "(function(){ const x = ...; return JSON.stringify(x
  • Network accessline 46
    # GOOD: open + inspect in one call (saves 1 round trip) opencli browser open https://example.com && opencli browser state
  • Network accessline 47
    opencli browser open https://example.com && opencli browser state
  • Dangerous shell operationline 136
    opencli browser eval "document.title"
  • Dangerous shell operationline 137
    opencli browser eval "JSON.stringify([...document.querySelectorAll('h2')].map(e => e.textContent))"
  • Dangerous shell operationline 140
    opencli browser eval "(function(){ const items = [...document.querySelectorAll('.item')]; return JSON.stringify(items.map(e => e.textContent)); })()"
  • Dangerous shell operationline 146
    opencli browser eval "document.querySelector('.title').textContent"
  • Dangerous shell operationline 149
    opencli browser eval "(document.querySelector('.title') || document.querySelector('h1') || {textContent:''}).textContent"
  • Dangerous shell operationline 150
    opencli browser eval "document.querySelector('.title')?.textContent ?? 'not found'"
  • Network accessline 181
    opencli browser open https://news.ycombinator.com
  • Dangerous shell operationline 183
    opencli browser eval "JSON.stringify([...document.querySelectorAll('.titleline a')].slice(0,5).map(a => ({title: a.textContent, url: a.href})))"
  • Network accessline 190
    opencli browser open https://httpbin.org/forms/post
  • Network accessline 202
    # 1. Explore the website opencli browser open https://news.ycombinator.com
  • Network accessline 203
    opencli browser open https://news.ycombinator.com
  • Network accessline 206
    # 2. Discover APIs (crucial for high-quality adapters) opencli browser eval "fetch('/api/...').then(r=>r.json())"   # Trigger API calls
  • Dangerous shell operationline 207
    opencli browser eval "fetch('/api/...').then(r=>r.json())"   # Trigger API calls
  • Network accessline 207
    opencli browser eval "fetch('/api/...').then(r=>r.json())"   # Trigger API calls
  • Network accessline 214
    # 4. Edit the adapter (fill in func logic) # - If API found: use fetch() directly (Strategy.PUBLIC or COOKIE)
  • Network accessline 215
    # - If API found: use fetch() directly (Strategy.PUBLIC or COOKIE)
  • Network accessline 241
    func: async (_page, kwargs) => {     const limit = Math.min(Math.max(1, kwargs.limit ?? 5), 50);     const resp = await fetch('https://hacker-news.firebaseio.com/v0/topstories.json');
  • Network accessline 242
    const limit = Math.min(Math.max(1, kwargs.limit ?? 5), 50);     const resp = await fetch('https://hacker-news.firebaseio.com/v0/topstories.json');     const ids = await resp.json();
  • Network accessline 243
    const resp = await fetch('https://hacker-news.firebaseio.com/v0/topstories.json');
  • Network accessline 245
    return Promise.all(       ids.slice(0, limit).map(async (id: number, i: number) => {         const item = await (await fetch(`https://hacker-news.firebaseio.com/v0/item/${id}.json`)).json();
  • Network accessline 246
    ids.slice(0, limit).map(async (id: number, i: number) => {         const item = await (await fetch(`https://hacker-news.firebaseio.com/v0/item/${id}.json`)).json();         return { rank: i + 1, title: item.title, score: item.score, url: it
  • Network accessline 247
    const item = await (await fetch(`https://hacker-news.firebaseio.com/v0/item/${id}.json`)).json();
  • Network accessline 265
    **Always prefer API over UI** — if you discovered an API during browsing, use `fetch()` directly.
  • Dangerous shell operationline 271
    3. **Use `eval` for data extraction** — `eval "JSON.stringify(...)"` is faster than multiple `get` calls
  • Dangerous shell operationline 280
    opencli browser eval "document.querySelector('form').submit()"
  • Network accessline 280
    opencli browser eval "document.querySelector('form').submit()"    # GOOD: construct the URL and navigate    opencli browser open "https://github.com/search?q=opencli&type=repositories"
  • Network accessline 282
    opencli browser open "https://github.com/search?q=opencli&type=repositories"
  • Network accessline 291
    5. **`evaluate` runs in browser context** — `page.evaluate()` in adapters executes inside the browser. Node.js APIs (`fs`, `path`, `process`) are NOT available. Use `fetch()` for network calls, DOM APIs for page data.

qiaomu-opencli-explorer/SKILL.md

  • Network accessline 42
    | 3. 模拟交互 | `browser_click` + `browser_wait_for` | 点击"字幕""评论""关注"等按钮 | | 4. 二次抓包 | `browser_network_requests` | 对比步骤 2,找出新触发的 API | | 5. 验证 API | `browser_evaluate` | `fetch(url, {credentials:'include'})` 测试返回结构 |
  • Network accessline 43
    | 4. 二次抓包 | `browser_network_requests` | 对比步骤 2,找出新触发的 API | | 5. 验证 API | `browser_evaluate` | `fetch(url, {credentials:'include'})` 测试返回结构 | | 6. 写代码 | — | 基于确认的 API 写适配器 |
  • Network accessline 44
    | 5. 验证 API | `browser_evaluate` | `fetch(url, {credentials:'include'})` 测试返回结构 |
  • Network accessline 50
    |------------|------------| | 只用 `opencli explore` 命令,等结果自动出来 | 用浏览器工具打开页面,主动浏览 | | 直接在代码里 `fetch(url)`,不看浏览器实际请求 | 先在浏览器中确认 API 可用,再写代码 |
  • Network accessline 51
    | 只用 `opencli explore` 命令,等结果自动出来 | 用浏览器工具打开页面,主动浏览 | | 直接在代码里 `fetch(url)`,不看浏览器实际请求 | 先在浏览器中确认 API 可用,再写代码 | | 页面打开后直接抓包,期望所有 API 都出现 | 模拟点击交互(展开评论/切换标签/加载更多) |
  • Network accessline 52
    | 直接在代码里 `fetch(url)`,不看浏览器实际请求 | 先在浏览器中确认 API 可用,再写代码 |
  • Network accessline 62
    1. browser_navigate → https://space.bilibili.com/{uid}/fans/follow
  • Network accessline 65
    GET /x/relation/stat?vmid={uid}                    →  [200] 3. browser_evaluate → 验证 API:    fetch('/x/relation/followings?vmid=137702077&pn=1&ps=5', {credentials:'include'})
  • Network accessline 66
    3. browser_evaluate → 验证 API:    fetch('/x/relation/followings?vmid=137702077&pn=1&ps=5', {credentials:'include'})    → { code: 0, data: { total: 1342, list: [{mid, uname, sign, ...}] } }
  • Network accessline 67
    fetch('/x/relation/followings?vmid=137702077&pn=1&ps=5', {credentials:'include'})
  • Network accessline 98
    opencli explore https://www.example.com --site mysite
  • Network accessline 115
    # 在浏览器中打开目标页面,观察网络请求 opencli explore https://www.example.com --site mysite -v
  • Network accessline 116
    opencli explore https://www.example.com --site mysite -v
  • Network accessline 162
    opencli cascade https://api.example.com/hot
  • Network accessline 168
    直接 fetch(url) 能拿到数据?
  • Network accessline 169
    → ✅ Tier 1: public(公开 API,不需要浏览器)   → ❌ fetch(url, {credentials:'include'}) 带 Cookie 能拿到?        → ✅ Tier 2: cookie(最常见,evaluate 步骤内 fetch)
  • Network accessline 170
    → ❌ fetch(url, {credentials:'include'}) 带 Cookie 能拿到?
  • Network accessline 260
    const ps = Math.min(kwargs.limit ?? 50, 50); // 尊重 API 的 ps 上限   const payload = await fetchJson(page,     `https://api.example.com/list?pn=${pn}&ps=${ps}`
  • Network accessline 261
    const payload = await fetchJson(page,     `https://api.example.com/list?pn=${pn}&ps=${ps}`   );
  • Network accessline 262
    `https://api.example.com/list?pn=${pn}&ps=${ps}`
  • Network accessline 290
    columns: ['rank', 'title', 'replies'],   func: async (_page, kwargs) => {     const res = await fetch('https://www.v2ex.com/api/topics/hot.json');
  • Network accessline 291
    func: async (_page, kwargs) => {     const res = await fetch('https://www.v2ex.com/api/topics/hot.json');     const data = await res.json();
  • Network accessline 292
    const res = await fetch('https://www.v2ex.com/api/topics/hot.json');
  • Network accessline 319
    columns: ['rank', 'title', 'heat', 'answers'],   func: async (page, kwargs) => {     await page.goto('https://www.zhihu.com');  // 先加载页面建立 session
  • Network accessline 320
    func: async (page, kwargs) => {     await page.goto('https://www.zhihu.com');  // 先加载页面建立 session     const data = await page.evaluate(`(async () => {
  • Network accessline 321
    await page.goto('https://www.zhihu.com');  // 先加载页面建立 session     const data = await page.evaluate(`(async () => {       const res = await fetch('/api/v3/feed/topstory/hot-lists/total?limit=50', {
  • Network accessline 322
    const data = await page.evaluate(`(async () => {       const res = await fetch('/api/v3/feed/topstory/hot-lists/total?limit=50', {         credentials: 'include'
  • Network accessline 323
    const res = await fetch('/api/v3/feed/topstory/hot-lists/total?limit=50', {
  • Network accessline 365
    columns: ['rank', 'title', 'type', 'author', 'votes'],   func: async (page, kwargs) => {     await page.goto('https://www.zhihu.com');
  • Network accessline 366
    func: async (page, kwargs) => {     await page.goto('https://www.zhihu.com');     const data = await page.evaluate(`(async () => {
  • Network accessline 367
    await page.goto('https://www.zhihu.com');
  • Network accessline 368
    const data = await page.evaluate(`(async () => {       const q = encodeURIComponent('${kwargs.query}');       const res = await fetch('/api/v4/search_v3?q=' + q + '&t=general&limit=${kwargs.limit}', {
  • Network accessline 369
    const q = encodeURIComponent('${kwargs.query}');       const res = await fetch('/api/v4/search_v3?q=' + q + '&t=general&limit=${kwargs.limit}', {         credentials: 'include'
  • Network accessline 370
    const res = await fetch('/api/v4/search_v3?q=' + q + '&t=general&limit=${kwargs.limit}', {
  • Network accessline 410
    columns: ['rank', 'user', 'action', 'content', 'note', 'time'],   func: async (page, kwargs) => {     await page.goto('https://www.xiaohongshu.com/notification');
  • Network accessline 411
    func: async (page, kwargs) => {     await page.goto('https://www.xiaohongshu.com/notification');     await page.wait(3);
  • Network accessline 412
    await page.goto('https://www.xiaohongshu.com/notification');
  • Network accessline 466
    columns: ['rank', 'author', 'text', 'likes'],   func: async (page, kwargs) => {     await page.goto('https://x.com');
  • Network accessline 467
    func: async (page, kwargs) => {     await page.goto('https://x.com');     const data = await page.evaluate(`
  • Network accessline 468
    await page.goto('https://x.com');
  • Network accessline 484
    const variables = JSON.stringify({ rawQuery: '${kwargs.query}', count: 20 });         const url = '/i/api/graphql/xxx/SearchTimeline?variables=' + encodeURIComponent(variables);         const res = await fetch(url, { headers, credentials: '
  • Network accessline 485
    const url = '/i/api/graphql/xxx/SearchTimeline?variables=' + encodeURIComponent(variables);         const res = await fetch(url, { headers, credentials: 'include' });         return await res.json();
  • Network accessline 486
    const res = await fetch(url, { headers, credentials: 'include' });
  • Network accessline 507
    columns: ['rank', 'title', 'likes', 'url'],   func: async (page, kwargs) => {     await page.goto(`https://www.xiaohongshu.com/user/profile/${kwargs.id}`);
  • Network accessline 508
    func: async (page, kwargs) => {     await page.goto(`https://www.xiaohongshu.com/user/profile/${kwargs.id}`);     await page.wait(5);
  • Network accessline 509
    await page.goto(`https://www.xiaohongshu.com/user/profile/${kwargs.id}`);
  • Network accessline 527
    title: note.display_title || '',              likes: note.interact_info?.liked_count || '0',              url: `https://explore/${note.note_id || note.id}`
  • Network accessline 528
    likes: note.interact_info?.liked_count || '0',              url: `https://explore/${note.note_id || note.id}`            });
  • Network accessline 529
    url: `https://explore/${note.note_id || note.id}`
  • Network accessline 652
    // Step 1: 建立 Session     await page.goto(`https://www.bilibili.com/video/${kwargs.bvid}/`);
  • Network accessline 653
    await page.goto(`https://www.bilibili.com/video/${kwargs.bvid}/`);
  • Network accessline 672
    // Step 5: 拉取最终数据 (CDN JSON)     const items = await page.evaluate(`(async () => {       const res = await fetch(${JSON.stringify('https:' + url)});
  • Network accessline 673
    const items = await page.evaluate(`(async () => {       const res = await fetch(${JSON.stringify('https:' + url)});       const json = await res.json();
  • Network accessline 674
    const res = await fetch(${JSON.stringify('https:' + url)});
  • Network accessline 720
    # 一键:探索 → 分析 → 合成 → 注册 opencli generate https://www.example.com --goal "hot"
  • Network accessline 721
    opencli generate https://www.example.com --goal "hot"
  • Network accessline 723
    # 或分步执行: opencli explore https://www.example.com --site mysite           # 发现 API
  • Network accessline 724
    opencli explore https://www.example.com --site mysite           # 发现 API
  • Network accessline 725
    opencli explore https://www.example.com --auto --click "字幕,CC"  # 模拟点击触发懒加载 API
  • Network accessline 757
    # 1. 启动录制(建议 --timeout 给足操作时间) opencli record "https://example.com/page" --timeout 120000
  • Network accessline 758
    opencli record "https://example.com/page" --timeout 120000
  • Network accessline 793
    browser: true pipeline:   - navigate: https://...
  • Network accessline 794
    pipeline:   - navigate: https://...   - evaluate: |
  • Network accessline 795
    - navigate: https://...
  • Network accessline 796
    - evaluate: |       (async () => {         const res = await fetch('/approval/getList.json?procInsId=...', { credentials: 'include' });
  • Network accessline 797
    (async () => {         const res = await fetch('/approval/getList.json?procInsId=...', { credentials: 'include' });         const data = await res.json();
  • Network accessline 798
    const res = await fetch('/approval/getList.json?procInsId=...', { credentials: 'include' });
  • Network accessline 818
    columns: ['step', 'operator', 'action', 'time'],   func: async (page, kwargs) => {     await page.goto('https://tae.alibaba-inc.com/expense/pc.html?_authType=SAML');
  • Network accessline 819
    func: async (page, kwargs) => {     await page.goto('https://tae.alibaba-inc.com/expense/pc.html?_authType=SAML');     await page.wait(2);
  • Network accessline 820
    await page.goto('https://tae.alibaba-inc.com/expense/pc.html?_authType=SAML');
  • Network accessline 821
    await page.wait(2);     const result = await page.evaluate(`(async () => {       const res = await fetch('/approval/getList.json?taskId=&procInsId=${kwargs.proc_ins_id}', {
  • Network accessline 822
    const result = await page.evaluate(`(async () => {       const res = await fetch('/approval/getList.json?taskId=&procInsId=${kwargs.proc_ins_id}', {         credentials: 'include'
  • Network accessline 823
    const res = await fetch('/approval/getList.json?taskId=&procInsId=${kwargs.proc_ins_id}', {
  • Network accessline 848
    | 现象 | 原因 | 解法 | |------|------|------| | 捕获 0 条请求 | 拦截器注入失败,或页面无 JSON API | 检查 daemon 是否运行:`curl localhost:19825/status` |
  • Network accessline 849
    |------|------|------| | 捕获 0 条请求 | 拦截器注入失败,或页面无 JSON API | 检查 daemon 是否运行:`curl localhost:19825/status` | | 捕获量少(1~3 条) | 页面是只读详情页,首屏数据已在注入前发出 | 手动操作触发更多请求(搜索/翻页),或换用列表页 |
  • Network accessline 850
    | 捕获 0 条请求 | 拦截器注入失败,或页面无 JSON API | 检查 daemon 是否运行:`curl localhost:19825/status` |

qiaomu-opencli-oneshot/SKILL.md

  • Network accessline 18
    | 项目 | 示例 | |------|------| | **URL** | `https://x.com/jakevin7/lists` |
  • Network accessline 19
    |------|------| | **URL** | `https://x.com/jakevin7/lists` | | **Goal** | 获取我的 Twitter Lists |
  • Network accessline 20
    | **URL** | `https://x.com/jakevin7/lists` |
  • Network accessline 54
    // Tier 2 (Cookie): 大多数情况 fetch('/api/endpoint', { credentials: 'include' }).then(r => r.json())
  • Network accessline 55
    fetch('/api/endpoint', { credentials: 'include' }).then(r => r.json())
  • Network accessline 57
    // Tier 3 (Header): 如 Twitter 需要额外 header const ct0 = document.cookie.match(/ct0=([^;]+)/)?.[1]; fetch('/api/endpoint', {
  • Network accessline 58
    [Credential-related source omitted]
  • Network accessline 59
    fetch('/api/endpoint', {
  • Network accessline 77
    fetch(url) 直接能拿到?              → Tier 1: public   (TS pipeline, browser: false)
  • Network accessline 78
    fetch(url, {credentials:'include'})? → Tier 2: cookie   (TS pipeline 或 func())
  • Access to secretsline 98
    [Credential-related source omitted]
  • Network accessline 103
    columns: ['rank', 'title', 'value'],   func: async (page, kwargs) => {     await page.goto('https://www.example.com/target-page');
  • Network accessline 104
    func: async (page, kwargs) => {     await page.goto('https://www.example.com/target-page');     const data = await page.evaluate(`(async () => {
  • Network accessline 105
    await page.goto('https://www.example.com/target-page');     const data = await page.evaluate(`(async () => {       const res = await fetch('/api/target', { credentials: 'include' });
  • Network accessline 106
    const data = await page.evaluate(`(async () => {       const res = await fetch('/api/target', { credentials: 'include' });       const d = await res.json();
  • Network accessline 107
    const res = await fetch('/api/target', { credentials: 'include' });
  • Network accessline 140
    func: async (page, kwargs) => {     // 1. 导航     await page.goto('https://www.example.com/target-page');
  • Network accessline 141
    // 1. 导航     await page.goto('https://www.example.com/target-page');     await page.wait(3);
  • Network accessline 142
    await page.goto('https://www.example.com/target-page');
  • Network accessline 185
    columns: ['rank', 'name', 'value'],   func: async (page, kwargs) => {     await page.goto('https://x.com');
  • Network accessline 186
    func: async (page, kwargs) => {     await page.goto('https://x.com');     const data = await page.evaluate(`(async () => {
  • Network accessline 187
    await page.goto('https://x.com');
  • Network accessline 190
    if (!ct0) return { error: 'Not logged in' };       const bearer = 'AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D...';       const res = await fetch('/i/api/graphql/QUERY_ID/Endpoint', {
  • Network accessline 191
    const bearer = 'AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D...';       const res = await fetch('/i/api/graphql/QUERY_ID/Endpoint', {         headers: {
  • Network accessline 192
    const res = await fetch('/i/api/graphql/QUERY_ID/Endpoint', {

qiaomu-opencli-usage/commands.md

  • Network accessline 106
    # Browser (login required) opencli bloomberg news "https://..."      # 阅读 Bloomberg 文章全文 (link positional)
  • Network accessline 107
    opencli bloomberg news "https://..."      # 阅读 Bloomberg 文章全文 (link positional)
  • Dangerous shell operationline 487
    opencli quark rm <id>                     # 删除文件
  • Network accessline 619
    opencli twitter follow elonmusk          # 关注用户 opencli twitter unfollow elonmusk        # 取消关注 opencli twitter bookmark https://x.com/... # 收藏推文
  • Network accessline 620
    opencli twitter unfollow elonmusk        # 取消关注 opencli twitter bookmark https://x.com/... # 收藏推文 opencli twitter unbookmark https://x.com/... # 取消收藏
  • Network accessline 621
    opencli twitter bookmark https://x.com/... # 收藏推文
  • Network accessline 622
    opencli twitter unbookmark https://x.com/... # 取消收藏
  • Network accessline 623
    opencli twitter post "Hello world"       # 发布推文 (text positional) opencli twitter like https://x.com/...   # 点赞推文 (url positional) opencli twitter likes elonmusk           # 用户点赞列表
  • Network accessline 624
    opencli twitter like https://x.com/...   # 点赞推文 (url positional)
  • Network accessline 625
    opencli twitter likes elonmusk           # 用户点赞列表 opencli twitter reply https://x.com/... "Nice!" # 回复推文 (url + text positional) opencli twitter delete https://x.com/... # 删除推文 (url positional)
  • Network accessline 626
    opencli twitter reply https://x.com/... "Nice!" # 回复推文 (url + text positional)
  • Network accessline 627
    opencli twitter delete https://x.com/... # 删除推文 (url positional)
  • Network accessline 631
    opencli twitter following elonmusk       # 用户的关注列表 (user positional) opencli twitter notifications --limit 20 # 通知列表 opencli twitter hide-reply https://x.com/... # 隐藏回复 (url positional)
  • Network accessline 632
    opencli twitter notifications --limit 20 # 通知列表 opencli twitter hide-reply https://x.com/... # 隐藏回复 (url positional) opencli twitter download elonmusk        # 下载用户媒体 (username positional, 支持 --tweet-url)
  • Network accessline 633
    opencli twitter hide-reply https://x.com/... # 隐藏回复 (url positional) opencli twitter download elonmusk        # 下载用户媒体 (username positional, 支持 --tweet-url) opencli twitter accept "群,微信"          # 自动接受含关键词的 DM 请求 (query positional)
  • Network accessline 661
    opencli web read --url "https://..."     # 抓取任意网页并导出为 Markdown
  • Network accessline 679
    opencli weixin download --url "https://mp.weixin.qq.com/s/xxx"  # 下载公众号文章为 Markdown
  • Network accessline 787
    opencli youtube search "rust"            # 搜索视频 (query positional) opencli youtube video "https://www.youtube.com/watch?v=xxx"  # 视频元数据
  • Network accessline 788
    opencli youtube video "https://www.youtube.com/watch?v=xxx"  # 视频元数据
  • Network accessline 789
    opencli youtube transcript "https://www.youtube.com/watch?v=xxx"  # 获取视频字幕/转录

How the signals fit together

Facts from a static read of the files at the pinned commit. They describe what the code does, not why.

Some files could not be read; the facts below still hold.

Signal confidence: 3 facts

Works with

Agent compatibility, from the files in this repository
AgentStatusEvidenceInstall to
Claude CodeCompatibleStandard SKILL.md qiaomu-opencli-autofix/SKILL.md.claude/skills/<skill-name>/
CodexCompatibleStandard SKILL.md qiaomu-opencli-autofix/SKILL.md.agents/skills/<skill-name>/
CursorCompatibleStandard SKILL.md qiaomu-opencli-autofix/SKILL.md.cursor/skills/<skill-name>/
Gemini CLICompatibleStandard SKILL.md qiaomu-opencli-autofix/SKILL.md.gemini/skills/<skill-name>/
GitHub CopilotCompatibleStandard SKILL.md qiaomu-opencli-autofix/SKILL.md.github/skills/<skill-name>/
OpenCodeCompatibleStandard SKILL.md qiaomu-opencli-autofix/SKILL.md.opencode/skills/<skill-name>/
  • Native The repository ships a manifest, folder or frontmatter field for this agent.
  • Compatible A standard SKILL.md that this agent can read.
  • Unknown No evidence either way.

Derived automatically from paths, manifests and frontmatter. Not tested on each agent.

Explore alternatives and comparisons

Add this badge to your README

It updates every night and links to this page.

joeseesun/qiaomu-opencli-skills: #898 on hotskills, 998 stars

[![joeseesun/qiaomu-opencli-skills on hotskills](https://hotskills.dev/badge/joeseesun-qiaomu-opencli-skills.svg)](https://hotskills.dev/skill/joeseesun-qiaomu-opencli-skills/)