Not in the top 1,000 by GitHub stars
JuneYaooo/social-account-doctor
小红书/抖音/快手/视频号/B站 自媒体账号体检+爆款拆解工具。扫同赛道找对标、拆爆款为什么爆、诊断为什么没人看,顺手出可粘贴仿写初稿。支持带货电商模式。支持codex, claude code, workbuddy
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
SKILL.md
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 2438d5ae7c8e
No earlier version was observed for comparison.
Heat
6.6- Star growth, last 7 daysNot available
- Star growth, last 24 hoursNot available
- Rank movement, last 7 daysNot available
- Commits, last 30 daysNot available
- Accounts asking about it through MCP, last 7 daysNot available
- Hot votes this weekNot available
Heat never changes the order by stars, and sponsorship never touches it. How heat works
Stars over time
30-day change not yet available: not enough history.
Individual skills in this repository
How it works
social-account-doctor
When your agent uses it
小红书 / 抖音 / 快手 / 视频号 自媒体「(compose 素材打底 →) 找对标 → 拆爆款 → 套自己」四命令闭环,另支持带货账号诊断、带货视频链接拆解和证据驱动的脚本生成(commerce)。给账号 / 平台视频链接 / 本地视频 / 商品详情、SKU 与资质材料,输出账号与对标差距、内容拆解、商品事实卡、口播和分镜。当用户说"找对标"、"拆这条爆款"、"对着这条仿写"、"下一条该写什么"、"我这个号缺爆款选题"、"帮我写一条对标 XX 的笔记"、"我有素材帮我写一条能爆的"、"这份文档/这组图/这段视频能出一条爆款吗"时调用。诊断模式("为什么不爆")走 references/diagnostic-mode.md。带货触发词:带货账号诊断、带货视频链接、带货素材、商品详情截图、SKU 表、商品资质、带货脚本、口播、分镜、商品卡一致性 — 走 commerce 路由。商品链接不等于视频链接;本 Skill 不解析在线商品页,不提供选品、趋势监控或 GMV/佣金推断。
What it loads into context
Frontmatter
324 tokensAlways available to the agent
SKILL.md
18,190 tokensWhen the skill is activated
Reference documents
60,373 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- 0A. 交付质量硬规则(防伪装完成)
- 0. 闭环图
- 1. 输入路由
- 1A. compose 命令 SOP(素材 → 初稿的新入口)
- 1B. commerce 命令 SOP(账号诊断 + 对标内容分析)
- 2. find 命令 SOP(5 步铁律)
- 3. crack 命令 SOP
- 4. adapt 命令 SOP
- 5. 输出位置铁律
- 6. L2 诊断模式(按需,不主推)
- 7. 工具速查
- 9. 接口稳定性表(按平台分小节)
- 9. 数据时效性说明
Scripts executed separately
install_as_skill.shmediacrawler/bin/mcmediacrawler/lib/mc_client.pyscripts/analyze_document.pyscripts/analyze_image.pyscripts/analyze_video.pyscripts/build_commerce_package.pyscripts/dispatch_account.pyscripts/normalize_metrics.pyscripts/ocr_screenshot.pyscripts/render_report_pdf.pytests/test_commerce_outputs.pytests/test_mc_client.pytests/test_multimodal_scripts.pytests/test_render_report_pdf.pytests/test_tikhub_rest.pytikhub/bin/tikhubtikhub/lib/tikhub_client.pytikhub/scripts/refresh_tools.py
Files
.env.exampleasset1,952 bytes.gitignoreasset5,197 bytesLICENSEasset1,066 bytesREADME.mddoc9,902 bytesSKILL.mdcore60,390 bytesSKILL.mdcore60,390 bytesSKILL.mdcore60,390 bytesSKILL.mdcore60,390 bytesSKILL.mdcore60,390 bytesSKILL.mdcore60,390 bytesdocs/images/demo-page-01.pngasset247,466 bytesdocs/images/demo-page-02.pngasset219,835 bytesdocs/images/demo-page-03.pngasset1,137,100 bytesdocs/images/demo-page-04.pngasset585,911 bytesdocs/images/demo-page-05.pngasset427,914 bytesdocs/images/demo-page-06.pngasset500,982 bytesdocs/images/demo-page-07.pngasset236,722 bytesdocs/install.mddoc4,593 bytesinstall_as_skill.shruns10,926 bytesmediacrawler/README.mddoc10,850 bytesmediacrawler/bin/mcruns6,287 bytesmediacrawler/lib/mc_client.pyruns54,436 bytesmediacrawler/requirements-lean.txtdoc1,265 bytesreferences/commerce-analysis-template.mddoc9,194 bytesreferences/commerce-metrics.mddoc8,701 bytesreferences/commerce-workflow.mddoc6,279 bytesreferences/diagnostic-mode.mddoc39,201 bytesreferences/platforms/bilibili.mddoc13,294 bytesreferences/platforms/douyin-commerce.mddoc7,956 bytesreferences/platforms/douyin.mddoc16,371 bytesreferences/platforms/kuaishou.mddoc13,203 bytesreferences/platforms/wechat-channels.mddoc16,241 bytesreferences/platforms/xiaohongshu.mddoc16,521 bytesreferences/product-video-framework.mddoc9,255 bytesreferences/scoring-vocab.mddoc4,488 bytesrequirements.txtdoc196 bytesscripts/analyze_document.pyruns5,859 bytesscripts/analyze_image.pyruns11,475 bytesscripts/analyze_video.pyruns37,969 bytesscripts/build_commerce_package.pyruns14,227 bytesscripts/dispatch_account.pyruns8,947 bytesscripts/normalize_metrics.pyruns10,072 bytesscripts/ocr_screenshot.pyruns9,950 bytesscripts/render_report_pdf.pyruns30,566 bytestests/fixtures/commerce_video.jsonasset2,835 bytestests/fixtures/mc/bili/json/creator_contents_2026-09-16.jsonasset814 bytestests/fixtures/mc/dy/json/detail_comments_2026-09-16.jsonasset412 bytestests/fixtures/mc/dy/json/detail_contents_2026-09-16.jsonasset774 bytestests/fixtures/mc/ks/json/search_contents_2026-09-16.jsonasset637 bytestests/fixtures/mc/xhs/json/search_comments_2026-09-16.jsonasset830 bytestests/fixtures/mc/xhs/json/search_contents_2026-09-16.jsonasset1,739 bytestests/test_commerce_outputs.pyruns18,916 bytestests/test_mc_client.pyruns36,710 bytestests/test_multimodal_scripts.pyruns11,511 bytestests/test_render_report_pdf.pyruns7,401 bytestests/test_tikhub_rest.pyruns10,257 bytestikhub/README.mddoc2,258 bytestikhub/bin/tikhubruns8,650 bytestikhub/lib/tikhub_client.pyruns10,882 bytestikhub/references/tools-bilibili.jsonasset30,454 bytestikhub/references/tools-douyin.jsonasset352,387 bytestikhub/references/tools-kuaishou.jsonasset27,171 bytestikhub/references/tools-wechat.jsonasset38,406 bytestikhub/references/tools-xiaohongshu.jsonasset39,348 bytestikhub/scripts/refresh_tools.pyruns5,755 bytes
Read SKILL.md
# social-account-doctor — 找对标 / 拆爆款 / 套自己
> **不挖钩子建仓库,不写诊断报告。**
> 直接对着具体爆款 → 输出**我的下一条笔记初稿**(标题 + 封面大字 + 首段 + CTA)。
---
## 0A. 交付质量硬规则(防伪装完成)
这些规则适用于 find / crack / adapt / diagnostic。违反时不要硬写报告;在对话里明说缺哪一步、为什么缺、用户可以怎么补。
**H1 — find 必须有真对标搜索**
- `find` 模式至少跑过 1 次平台搜索,并拿到真实账号或作品候选:小红书 `xiaohongshu_app_v2_search_notes` / 抖音账号搜索或视频搜索 / 快手 `kuaishou_app_search_video_v2` / 视频号 `wechat_channels_v2_fetch_search_channel_videos` / B 站 `bilibili_web_fetch_general_search`;或 TikHub key 不可用时改跑 `mc search`(登录自己账号的 MediaCrawler 路径,见 §7.5)。
- 只拿了我的账号信息或作品列表就写“对标结论” = 违规。没有对标搜索,就只能标成“仅基于我方数据的初步判断”。View the complete source on GitHubSkills included
- social-account-doctor
Repository facts
- License
- MIT
- Created
- Apr 21, 2026
- Last pushed
- Sep 19, 2026
- Forks
- 40
- Open issues
- 0
- Project activity
- Active
Before you install
Network or broad shellAutomated signals, not a guarantee
Checked Nov 7, 2026
Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.
Show 6 notes
SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedtikhub/references/tools-douyin.json:10151Analysis incomplete: regex work limit reached
- No broad tool permissions
- 3 dangerous shell commandsin 2 files: install_as_skill.sh:85 scripts/analyze_video.py:893
- 314 network referencesin 29 files: tests/test_mc_client.py:76 tikhub/references/tools-wechat.json:523 .gitignore:114 and 26 more
- 3 obfuscation signalsin 1 file: tests/test_multimodal_scripts.py:35
- No instruction overrides
- 19 executable scriptsin 19 files: install_as_skill.sh:1 mediacrawler/bin/mc:1 mediacrawler/lib/mc_client.py:1 and 16 more
- 134 references to secretsin 18 files: scripts/analyze_video.py:20 install_as_skill.sh:151 mediacrawler/lib/mc_client.py:44 and 15 more
- No requests to vote in Hot
Show all 473 signals by file
.env.example
- Network accessline 3
# Gemini 3.1 Pro via OpenAI-compatible endpoint # BASE_URL 必填:脚本不内置任何默认端点(防止 key 发到第三方域名)。 # 可填:OpenAI https://api.openai.com/v1 | SiliconFlow https://api.siliconflow.cn/v1 - Network accessline 4
# BASE_URL 必填:脚本不内置任何默认端点(防止 key 发到第三方域名)。 # 可填:OpenAI https://api.openai.com/v1 | SiliconFlow https://api.siliconflow.cn/v1 # | Gemini 官方兼容端点 https://generativelanguage.googleapis.com/v1beta/openai - Network accessline 5
# 可填:OpenAI https://api.openai.com/v1 | SiliconFlow https://api.siliconflow.cn/v1 - Network accessline 6
# | Gemini 官方兼容端点 https://generativelanguage.googleapis.com/v1beta/openai - Network accessline 8
[Credential-related source omitted] - Network accessline 9
[Credential-related source omitted] - Access to secretsline 9
[Credential-related source omitted] - Network accessline 10
VIDEO_ANALYSIS_BASE_URL=https://your-gemini-proxy.example.com/v1 - Network accessline 19
# Audio transcription (only required for `analyze_video.py --mode talking`) # SenseVoice / Whisper via OpenAI-compatible endpoint # BASE_URL 必填(如用 SiliconFlow:https://api.siliconflow.cn/v1) - Network accessline 20
# SenseVoice / Whisper via OpenAI-compatible endpoint # BASE_URL 必填(如用 SiliconFlow:https://api.siliconflow.cn/v1) # ============================================================= - Network accessline 21
# BASE_URL 必填(如用 SiliconFlow:https://api.siliconflow.cn/v1) - Network accessline 22
[Credential-related source omitted] - Network accessline 23
[Credential-related source omitted] - Access to secretsline 23
[Credential-related source omitted] - Network accessline 24
AUDIO_TRANSCRIPTION_BASE_URL=https://your-asr-proxy.example.com/v1 - Network accessline 30
# 优先级:agent 自带 computer use / 浏览器(首选,零配置)> opencli > 本 key # (付费,稳定,五平台含视频号)> mc(最后手段:上游反爬加剧,账号风控风险最高) # 申请: https://tikhub.io/ - Network accessline 31
# (付费,稳定,五平台含视频号)> mc(最后手段:上游反爬加剧,账号风控风险最高) # 申请: https://tikhub.io/ # ============================================================= - Network accessline 32
# 申请: https://tikhub.io/ - Access to secretsline 34
[Credential-related source omitted]
.gitignore
- Network accessline 114
# This is especially recommended for binary packages to ensure reproducibility, and is more # commonly ignored for libraries. # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control - Network accessline 115
# commonly ignored for libraries. # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control #poetry.lock - Network accessline 116
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control - Network accessline 121
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. # pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python. # https://pdm-project.org/en/latest/usage/pro - Network accessline 122
# pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python. # https://pdm-project.org/en/latest/usage/project/#working-with-version-control #pdm.lock - Network accessline 123
# https://pdm-project.org/en/latest/usage/project/#working-with-version-control - Access to secretsline 147
[Credential-related source omitted] - Network accessline 180
# PyCharm # JetBrains specific template is maintained in a separate JetBrains.gitignore that can # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore - Network accessline 181
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore # and can be added to the global gitignore or merged into this - Network accessline 182
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore - Network accessline 188
# Abstra is an AI-powered process automation framework. # Ignore directories containing user credentials, local state, and settings. # Learn more at https://abstra.io/docs - Network accessline 189
# Ignore directories containing user credentials, local state, and settings. # Learn more at https://abstra.io/docs .abstra/ - Network accessline 190
# Learn more at https://abstra.io/docs - Network accessline 193
# Visual Studio Code # Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore # that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore - Network accessline 194
# Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore # that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore # and can be added to the global gitign - Network accessline 195
# that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore - Network accessline 207
# Cursor is an AI-powered code editor. `.cursorignore` specifies files/directories to # exclude from AI features like autocomplete and code analysis. Recommended for sensitive data # refer to https://docs.cursor.com/context/ignore-files - Network accessline 208
# exclude from AI features like autocomplete and code analysis. Recommended for sensitive data # refer to https://docs.cursor.com/context/ignore-files .cursorignore - Network accessline 209
# refer to https://docs.cursor.com/context/ignore-files
README.md
- Network accessline 79
帮我安装 social-account-doctor: https://raw.githubusercontent.com/JuneYaooo/social-account-doctor/main/docs/install.md - Network accessline 80
https://raw.githubusercontent.com/JuneYaooo/social-account-doctor/main/docs/install.md - Network accessline 91
- **① agent 自带 computer use / 浏览器工具(首选)** —— 装完 skill 直接让 agent 用宿主自带的浏览器能力访问平台页面,像真人一样浏览读数,无需任何配置 - **② opencli** - **③ [tikhub.io](https://tikhub.io/) 的 API key** —— 付费但稳定,结构化 JSON,一个 key 通吃五平台(含视频号),适合批量场景 - Network accessline 92
- **② opencli** - **③ [tikhub.io](https://tikhub.io/) 的 API key** —— 付费但稳定,结构化 JSON,一个 key 通吃五平台(含视频号),适合批量场景 - **④ mc 扫码登录(最后手段)** —— 用自己的小红书 / 抖音 / 快手 / B 站账号登录抓取;上游 MediaCrawler 反爬加剧、账号风控风险最高,仅当以上都不可用时使用。详见 [mediacrawler/README.md] - Network accessline 93
- **③ [tikhub.io](https://tikhub.io/) 的 API key** —— 付费但稳定,结构化 JSON,一个 key 通吃五平台(含视频号),适合批量场景
SKILL.md
- Network accessline 566
> 调用走 `tikhub <platform> <endpoint> --args`。CLI 自包含在仓库 `tikhub/` 目录,底层直接请求 TikHub REST API(`https://api.tikhub.io/api/v1/...`),**禁止调用 TikHub MCP 或 `mcp.tikhub.io`**。不知道端点名时用 `tikhub list <platform> <关键词>`;看 HTTP 方法、REST 路径和参数 schema 用 `tikh - Access to secretsline 587
[Credential-related source omitted] - Access to secretsline 828
[Credential-related source omitted] - Network accessline 840
11. **TikHub 只走直接 REST API,不走 MCP**:所有数据抓取通过 `tikhub <platform> <endpoint> --args` CLI 调用;CLI 直接请求 `https://api.tikhub.io/api/v1/...`,使用 Bearer API key。**禁止请求 `mcp.tikhub.io`,禁止 `claude mcp add tikhub-*`,禁止任何 TikHub MCP 工具调用**。 - Network accessline 842
- 非中国大陆默认基础域名:`https://api.tikhub.io` - Network accessline 843
- 中国大陆可设置:`TIKHUB_API_BASE_URL=https://api.tikhub.dev` - Access to secretsline 851
[Credential-related source omitted] - Access to secretsline 858
[Credential-related source omitted] - Access to secretsline 859
[Credential-related source omitted]
docs/install.md
- Network accessline 9
git clone --depth 1 https://github.com/JuneYaooo/social-account-doctor.git - Network accessline 34
|---|---|---|---| | `VIDEO_ANALYSIS_API_KEY` + `VIDEO_ANALYSIS_BASE_URL` | ✅ 必选 | 看图 / 看视频的多模态大模型(OpenAI 兼容协议) | 用户自己的 key 或代理站 | | `TIKHUB_API_KEY` | ⚪ 可选(付费) | 量大 / 需要视频号时的平台数据抓取(五平台全支持) | https://tikhub.io/ | - Network accessline 35
[Credential-related source omitted] - Access to secretsline 35
[Credential-related source omitted] - Network accessline 36
[Credential-related source omitted] - Access to secretsline 36
[Credential-related source omitted] - Access to secretsline 37
[Credential-related source omitted] - Access to secretsline 41
[Credential-related source omitted] - Network accessline 72
PIP_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple # 强制 pip 源 - Network accessline 73
PLAYWRIGHT_DOWNLOAD_HOST=https://registry.npmmirror.com/-/binary/playwright # 强制 Chromium 源 - Network accessline 74
MC_GIT_URL=https://gh-proxy.com/https://github.com/NanmiCoder/MediaCrawler.git # 强制克隆地址
install_as_skill.sh
- Executable scriptline 1
#!/bin/bash - Network accessline 38
return fi command_exists curl || { print_info "pip 源:无 curl 不探测,用默认源"; return; } - Network accessline 39
fi command_exists curl || { print_info "pip 源:无 curl 不探测,用默认源"; return; } local best_url="" best_t="" url t - Network accessline 40
command_exists curl || { print_info "pip 源:无 curl 不探测,用默认源"; return; } - Network accessline 41
local best_url="" best_t="" url t for url in "https://pypi.org/simple/" "https://pypi.tuna.tsinghua.edu.cn/simple/" "https://mirrors.aliyun.com/pypi/simple/"; do t="$(curl -o /dev/null -sk -m 4 -w '%{time_total}' "$url" 2>/dev/n - Network accessline 42
for url in "https://pypi.org/simple/" "https://pypi.tuna.tsinghua.edu.cn/simple/" "https://mirrors.aliyun.com/pypi/simple/"; do t="$(curl -o /dev/null -sk -m 4 -w '%{time_total}' "$url" 2>/dev/null)" || continue [ -n "$t" ] - Network accessline 43
t="$(curl -o /dev/null -sk -m 4 -w '%{time_total}' "$url" 2>/dev/null)" || continue - Network accessline 53
fi case "$best_url" in https://pypi.org/*) print_info "pip 源:官方 PyPI(探测最快,${best_t}s)" ;; - Network accessline 54
case "$best_url" in https://pypi.org/*) print_info "pip 源:官方 PyPI(探测最快,${best_t}s)" ;; *) PIP_INDEX_ARGS="-i $best_url" - Network accessline 55
https://pypi.org/*) print_info "pip 源:官方 PyPI(探测最快,${best_t}s)" ;; - Dangerous shell operationline 85
rm -f "$ENV_BACKUP" - Access to secretsline 151
[Credential-related source omitted] - Access to secretsline 153
[Credential-related source omitted] - Access to secretsline 154
[Credential-related source omitted] - Dangerous shell operationline 156
rm -rf "$SKILL_DIR" - Access to secretsline 165
[Credential-related source omitted] - Access to secretsline 175
[Credential-related source omitted] - Access to secretsline 180
[Credential-related source omitted] - Access to secretsline 182
[Credential-related source omitted] - Access to secretsline 231
[Credential-related source omitted] - Access to secretsline 234
[Credential-related source omitted] - Access to secretsline 235
[Credential-related source omitted] - Network accessline 239
[Credential-related source omitted] - Access to secretsline 239
[Credential-related source omitted] - Network accessline 240
[Credential-related source omitted] - Access to secretsline 240
[Credential-related source omitted] - Network accessline 241
[Credential-related source omitted] - Access to secretsline 241
[Credential-related source omitted] - Access to secretsline 251
[Credential-related source omitted] - Access to secretsline 255
[Credential-related source omitted]
mediacrawler/README.md
- Network accessline 3
> ⚠<U+FE0F> **定位:数据源五档里的最后一档**。上游 MediaCrawler 近期被平台反爬重点盯防(用户报告验证码、限流、账号风控),**只在 agent 自带 computer use / 浏览器工具、opencli、TikHub 都不可用时才用本路径**。平台数据优先级:agent 自带 computer use > agent 自带浏览器 > opencli > TikHub(付费)> **本路径**。 > 对接 [NanmiCoder/MediaCrawler]( - Network accessline 4
> 对接 [NanmiCoder/MediaCrawler](https://github.com/NanmiCoder/MediaCrawler)(Playwright 真实浏览器爬虫)。用自己的小红书 / 抖音 / 快手 / B 站账号扫码登录跑数据。 - Network accessline 34
PIP_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple # 强制 pip 源 - Network accessline 35
PLAYWRIGHT_DOWNLOAD_HOST=https://registry.npmmirror.com/-/binary/playwright # 强制 Chromium 源 - Network accessline 36
MC_GIT_URL=https://gh-proxy.com/https://github.com/NanmiCoder/MediaCrawler.git # 强制克隆地址
mediacrawler/bin/mc
mediacrawler/lib/mc_client.py
- Executable scriptline 1
Executable file - Access to secretsline 44
[Credential-related source omitted] - Access to secretsline 49
[Credential-related source omitted] - Access to secretsline 52
[Credential-related source omitted] - Network accessline 56
MC_GIT_URL = "https://github.com/NanmiCoder/MediaCrawler.git" - Access to secretsline 64
[Credential-related source omitted] - Access to secretsline 67
[Credential-related source omitted] - Access to secretsline 72
[Credential-related source omitted] - Access to secretsline 73
[Credential-related source omitted] - Access to secretsline 74
[Credential-related source omitted] - Access to secretsline 90
[Credential-related source omitted] - Access to secretsline 131
[Credential-related source omitted] - Network accessline 184
PIP_INDEX_CANDIDATES: list[tuple[str, str]] = [ ("官方 PyPI", "https://pypi.org/simple"), - Network accessline 185
("官方 PyPI", "https://pypi.org/simple"), - Network accessline 186
("清华 PyPI 镜像", "https://pypi.tuna.tsinghua.edu.cn/simple"), - Network accessline 187
("阿里 PyPI 镜像", "https://mirrors.aliyun.com/pypi/simple"), - Network accessline 188
] PLAYWRIGHT_OFFICIAL_HOST = "https://cdn.playwright.dev" PLAYWRIGHT_MIRROR_HOST = "https://registry.npmmirror.com/-/binary/playwright" - Network accessline 189
PLAYWRIGHT_OFFICIAL_HOST = "https://cdn.playwright.dev" - Network accessline 190
PLAYWRIGHT_MIRROR_HOST = "https://registry.npmmirror.com/-/binary/playwright" - Network accessline 191
GIT_MIRROR_PREFIXES = [ "https://gh-proxy.com/", "https://ghfast.top/", - Network accessline 192
"https://gh-proxy.com/", - Network accessline 193
"https://ghfast.top/", - Access to secretsline 199
[Credential-related source omitted] - Network accessline 208
started = time.time() try: req = urllib.request.Request(url, method="HEAD", headers={"User-Agent": "social-account-doctor"}) - Network accessline 209
try: req = urllib.request.Request(url, method="HEAD", headers={"User-Agent": "social-account-doctor"}) urllib.request.urlopen(req, timeout=timeout) - Network accessline 210
req = urllib.request.Request(url, method="HEAD", headers={"User-Agent": "social-account-doctor"}) - Network accessline 211
urllib.request.urlopen(req, timeout=timeout) - Access to secretsline 231
[Credential-related source omitted] - Access to secretsline 248
[Credential-related source omitted] - Access to secretsline 264
[Credential-related source omitted] - Network accessline 270
return [direct] mirrors = [(prefix + MC_GIT_URL, f"gh 代理 {prefix}") for prefix in GIT_MIRROR_PREFIXES] if _probe_ms("https://github.com", timeout=5.0) is None: - Network accessline 271
mirrors = [(prefix + MC_GIT_URL, f"gh 代理 {prefix}") for prefix in GIT_MIRROR_PREFIXES] if _probe_ms("https://github.com", timeout=5.0) is None: log("[mc] github.com 探测不可达,优先尝试 gh 代理镜像") - Network accessline 272
if _probe_ms("https://github.com", timeout=5.0) is None: - Access to secretsline 688
[Credential-related source omitted]
references/commerce-metrics.md
- Network accessline 12
- 抖音电商学习中心 — [school.jinritemai.com](https://school.jinritemai.com/doudian/web/home)
references/commerce-workflow.md
references/diagnostic-mode.md
references/platforms/douyin-commerce.md
- Network accessline 12
- 抖音电商学习中心 — [school.jinritemai.com](https://school.jinritemai.com/doudian/web/home) - Network accessline 13
- 巨量千川 — 广告素材规范 - 飞书课程《低质素材避坑指南》— 跃狐未来达人商业化社群(P3 级,经验案例,不等同官方规则) - 抖音规则中心 — [douyin.com/rule/policy](https://www.douyin.com/rule/policy) - Network accessline 15
- 抖音规则中心 — [douyin.com/rule/policy](https://www.douyin.com/rule/policy) - Network accessline 180
- 抖音电商学习中心:https://school.jinritemai.com/doudian/web/home - Network accessline 181
- 抖音规则中心:https://www.douyin.com/rule/policy - Network accessline 182
- 巨量千川帮助中心:https://www.oceanengine.com/ - Network accessline 183
- 抖店后台:https://fxg.jinritemai.com/ - Network accessline 184
- 巨量创意(素材参考):https://cc.oceanengine.com/
references/platforms/douyin.md
- Network accessline 12
- 蝉妈妈数据 — [完播率话题](https://www.chanmama.com/yunyingquan/topic/3126.html) / [核心数据指标](https://www.chanmama.com/yunyingquan/question/4274.html) / [完播率多少算正常](https://www.chanmama.com/yunyingquan/question/4338.html) - Network accessline 13
- 知乎运营拆解 — [5s完播率定义](https://zhuanlan.zhihu.com/p/608114574) / [完播率视频时长](https://zhuanlan.zhihu.com/p/690186906) / [运营关键指标](https://zhuanlan.zhihu.com/p/411261710) / [2025 抖音算法首次公开](https://zhuanlan.zhihu.com/p/1897014736534631373) - Network accessline 14
- 鸟哥笔记 — [比起完播率更重要的指标](https://www.niaogebiji.com/article-31701-1.html) - Network accessline 15
- 巨量算数 — [trendinsight.oceanengine.com](https://trendinsight.oceanengine.com/)(官方但未公开账号诊断阈值表)
references/platforms/kuaishou.md
- Network accessline 12
- 券商研究报告 — [东方财富《抖音、快手生态成因》](http://pdf.dfcfw.com/pdf/H3_AP202010201422479434_1.pdf) / [《快手商业化的进化与突围》](https://pdf.dfcfw.com/pdf/H3_AP202101211452765930_1.pdf) / [《快手:由慢向快》](https://wallstreetcn.com/articles/3607502)(多份均提到"同城/关注流量占比远高于抖音",但 - Network accessline 13
- 知乎运营拆解 — [《快手短视频流量及推荐算法解析》](https://zhuanlan.zhihu.com/p/362863254) / [《不同短视频平台流量本质区别》](https://zhuanlan.zhihu.com/p/1911060707308450483) - Network accessline 14
- 经验数字 — [亿专 5《快手五秒完播率》](https://www.yizhuan5.com/yarticle/4552.html) / [搜狐《快手养号注意事项》](https://www.sohu.com/a/886622464_122317756) - Network accessline 105
券商研报普遍认同"快手同城/关注流量占比远高于抖音"([东方财富研报](http://pdf.dfcfw.com/pdf/H3_AP202010201422479434_1.pdf)),但**未给具体百分比**。社区流传的"快手 30-50% 来自同城页、抖音 10-20%"是经验估算,方向稳,具体数字别当真。 - Network accessline 148
2. **分享链接两步走**:`v.kuaishou.com/<code>` / `c.kuaishou.com/fw/...` 类短链,`kuaishou_web_fetch_one_video_by_url` 对账号分享链接经常返回空 data。兜底:`curl -sL <url> -A "Mozilla/5.0 ... iPhone ..." -w '%{url_effective}'` follow 302,从最终 URL 路径里抠 `user_id` / `phot
references/platforms/xiaohongshu.md
- Network accessline 12
- **半官方口径**:[新浪财经《小红书 70% 月活主动搜索》](https://finance.sina.com.cn/tech/2025-04-10/doc-inesschw5906564.shtml)(COO 柯南公开发言)/ [电商派同主题](https://www.pai.com.cn/234841.html) / [亿邦动力 2023《日均搜索量3亿次》](https://www.ebrun.com/20230728/524264.shtml) - Network accessline 13
- **CES 公式**(业界共识但非官方):[新红《CES 评分标准》](https://xh.newrank.cn/product/article/article-detail/5c98308b368a4b64) / [飞书《小红书流量机制》](https://docs.feishu.cn/v/wiki/wikcnSCw7FSsYPdSkTlAg4wHTEP/aj) / [凡象品牌《CES 模型解析》](https://www.brandcarecn.com/yingxi - Network accessline 14
- **流量/CTR/收藏经验值**:[迅课《权重影响因素》](https://www.ixunke.com/article/704) / [人人都是产品经理《爆款笔记底层逻辑》](https://www.woshipm.com/share/6082130.html) / [千瓜数据](https://www.qian-gua.com/qg/informations/1/3/0) - Network accessline 15
- **限流/关键词**:[知乎《小红书限流全解》](https://zhuanlan.zhihu.com/p/687026429) / [人人都是产品经理《阅读量上不去七点自查》](https://www.woshipm.com/share/6186712.html)
scripts/analyze_document.py
- Executable scriptline 1
#!/usr/bin/env python3
scripts/analyze_image.py
- Executable scriptline 1
#!/usr/bin/env python3 - Access to secretsline 97
[Credential-related source omitted] - Access to secretsline 131
[Credential-related source omitted] - Access to secretsline 155
[Credential-related source omitted] - Access to secretsline 183
[Credential-related source omitted] - Network accessline 185
} try: r = requests.post( - Network accessline 186
try: r = requests.post( chat_completions_url(base_url), - Network accessline 187
r = requests.post( - Access to secretsline 220
[Credential-related source omitted] - Access to secretsline 222
[Credential-related source omitted] - Access to secretsline 223
[Credential-related source omitted] - Access to secretsline 226
[Credential-related source omitted] - Access to secretsline 227
[Credential-related source omitted] - Network accessline 229
return {"error": "VIDEO_ANALYSIS_BASE_URL not set(不内置默认端点,防止 key 发到第三方域名)。" "在 shell 环境或 Skill 的 .env 里填你的 OpenAI 兼容端点,例如 " "https://api.openai.com/v1、https://api.siliconflow.cn/v1,或 Gemini - Network accessline 230
[Credential-related source omitted] - Access to secretsline 230
[Credential-related source omitted] - Network accessline 231
"https://api.openai.com/v1、https://api.siliconflow.cn/v1,或 Gemini 官方兼容端点 " - Network accessline 232
"https://generativelanguage.googleapis.com/v1beta/openai"} - Access to secretsline 244
[Credential-related source omitted]
scripts/analyze_video.py
- Executable scriptline 1
#!/usr/bin/env python3 - Access to secretsline 20
[Credential-related source omitted] - Access to secretsline 23
[Credential-related source omitted] - Access to secretsline 66
[Credential-related source omitted] - Access to secretsline 84
[Credential-related source omitted] - Access to secretsline 310
[Credential-related source omitted] - Access to secretsline 312
[Credential-related source omitted] - Access to secretsline 313
[Credential-related source omitted] - Access to secretsline 314
[Credential-related source omitted] - Access to secretsline 315
[Credential-related source omitted] - Network accessline 317
return {"error": "VIDEO_ANALYSIS_BASE_URL not set(不内置默认端点,防止 key 发到第三方域名)。" "在 shell 环境或 Skill 的 .env 里填你的 OpenAI 兼容端点,例如 " "https://api.openai.com/v1、https://api.siliconflow.cn/v1,或 Gemini - Network accessline 318
[Credential-related source omitted] - Access to secretsline 318
[Credential-related source omitted] - Network accessline 319
"https://api.openai.com/v1、https://api.siliconflow.cn/v1,或 Gemini 官方兼容端点 " - Network accessline 320
"https://generativelanguage.googleapis.com/v1beta/openai"} - Network accessline 328
[Credential-related source omitted] - Access to secretsline 328
[Credential-related source omitted] - Network accessline 329
try: r = requests.post(chat_completions_url(base_url), headers=headers, json=payload, timeout=analysis_timeout_seconds()) - Network accessline 330
r = requests.post(chat_completions_url(base_url), headers=headers, - Access to secretsline 635
[Credential-related source omitted] - Access to secretsline 636
[Credential-related source omitted] - Access to secretsline 639
[Credential-related source omitted] - Access to secretsline 641
[Credential-related source omitted] - Access to secretsline 642
[Credential-related source omitted] - Network accessline 645
raise RuntimeError( "talking 模式必须设 AUDIO_TRANSCRIPTION_BASE_URL" "(如用 SiliconFlow:https://api.siliconflow.cn/v1)" - Network accessline 646
"talking 模式必须设 AUDIO_TRANSCRIPTION_BASE_URL" "(如用 SiliconFlow:https://api.siliconflow.cn/v1)" ) - Network accessline 647
"(如用 SiliconFlow:https://api.siliconflow.cn/v1)" - Access to secretsline 650
[Credential-related source omitted] - Network accessline 658
[Credential-related source omitted] - Network accessline 659
[Credential-related source omitted] - Access to secretsline 659
[Credential-related source omitted] - Network accessline 660
r = requests.post( - Access to secretsline 719
[Credential-related source omitted] - Access to secretsline 720
[Credential-related source omitted] - Access to secretsline 767
[Credential-related source omitted] - Access to secretsline 866
[Credential-related source omitted] - Access to secretsline 889
[Credential-related source omitted] - Access to secretsline 890
[Credential-related source omitted] - Dangerous shell operationline 893
return {"error": f"{tool} not installed (sudo apt install ffmpeg)"}
scripts/build_commerce_package.py
- Executable scriptline 1
#!/usr/bin/env python3
scripts/dispatch_account.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 16
示例 URL: 小红书 web: https://www.xiaohongshu.com/user/profile/5e7f...abc - Network accessline 17
小红书 web: https://www.xiaohongshu.com/user/profile/5e7f...abc - Network accessline 18
小红书短链: https://xhslink.com/A/xxxxx - Network accessline 19
抖音 web: https://www.douyin.com/user/MS4wLjABAAAA... - Network accessline 20
抖音短链: https://v.douyin.com/xxxxx - Network accessline 21
快手 web: https://www.kuaishou.com/profile/3xabcdef...
scripts/normalize_metrics.py
- Executable scriptline 1
#!/usr/bin/env python3
scripts/ocr_screenshot.py
- Executable scriptline 1
#!/usr/bin/env python3 - Access to secretsline 31
[Credential-related source omitted] - Access to secretsline 94
[Credential-related source omitted] - Access to secretsline 115
[Credential-related source omitted] - Access to secretsline 118
[Credential-related source omitted] - Access to secretsline 119
[Credential-related source omitted] - Access to secretsline 127
[Credential-related source omitted] - Access to secretsline 154
[Credential-related source omitted] - Access to secretsline 159
[Credential-related source omitted] - Network accessline 170
}, } resp = requests.post(url, json=payload, timeout=analysis_timeout_seconds()) - Network accessline 171
} resp = requests.post(url, json=payload, timeout=analysis_timeout_seconds()) resp.raise_for_status() - Network accessline 172
resp = requests.post(url, json=payload, timeout=analysis_timeout_seconds()) - Network accessline 190
[Credential-related source omitted] - Network accessline 191
[Credential-related source omitted] - Access to secretsline 191
[Credential-related source omitted] - Network accessline 192
resp = requests.post(url, json=payload, headers=headers, timeout=analysis_timeout_seconds()) - Access to secretsline 208
[Credential-related source omitted] - Access to secretsline 209
[Credential-related source omitted] - Access to secretsline 210
[Credential-related source omitted] - Access to secretsline 213
[Credential-related source omitted] - Network accessline 215
print(json.dumps({ "error": "VIDEO_ANALYSIS_BASE_URL not set(不内置默认端点,防止 key 发到第三方域名)。" "填你的 OpenAI 兼容端点,例如 https://api.openai.com/v1 或 " - Network accessline 216
"error": "VIDEO_ANALYSIS_BASE_URL not set(不内置默认端点,防止 key 发到第三方域名)。" "填你的 OpenAI 兼容端点,例如 https://api.openai.com/v1 或 " "Gemini 官方兼容端点 https://generativelanguage.googleapis.com/v1beta/openai", - Network accessline 217
"填你的 OpenAI 兼容端点,例如 https://api.openai.com/v1 或 " - Network accessline 218
"Gemini 官方兼容端点 https://generativelanguage.googleapis.com/v1beta/openai", - Access to secretsline 221
[Credential-related source omitted] - Access to secretsline 226
[Credential-related source omitted]
scripts/render_report_pdf.py
tests/fixtures/mc/bili/json/creator_contents_2026-09-16.json
- Network accessline 17
"video_comment": "1500", "last_modify_ts": 1758002400005, "video_url": "https://www.bilibili.com/video/av1200000000000001", - Network accessline 18
"last_modify_ts": 1758002400005, "video_url": "https://www.bilibili.com/video/av1200000000000001", "video_cover_url": "https://i0.hdslb.com/bfs/archive/cover1.jpg", - Network accessline 19
"video_url": "https://www.bilibili.com/video/av1200000000000001", - Network accessline 20
"video_cover_url": "https://i0.hdslb.com/bfs/archive/cover1.jpg",
tests/fixtures/mc/dy/json/detail_contents_2026-09-16.json
- Network accessline 13
"share_count": "210", "last_modify_ts": 1758002400002, "aweme_url": "https://www.douyin.com/video/7428000000000001234", - Network accessline 14
"last_modify_ts": 1758002400002, "aweme_url": "https://www.douyin.com/video/7428000000000001234", "cover_url": "https://p3-sign.douyinpic.com/cover1.jpeg", - Network accessline 15
"aweme_url": "https://www.douyin.com/video/7428000000000001234", - Network accessline 16
"cover_url": "https://p3-sign.douyinpic.com/cover1.jpeg", - Network accessline 17
"video_download_url": "https://v26-web.douyinvod.com/video1.mp4",
tests/fixtures/mc/ks/json/search_contents_2026-09-16.json
- Network accessline 11
"viewd_count": "152000", "last_modify_ts": 1758002400004, "video_url": "https://www.kuaishou.com/short-video/3xkuaishou001", - Network accessline 12
"last_modify_ts": 1758002400004, "video_url": "https://www.kuaishou.com/short-video/3xkuaishou001", "video_cover_url": "https://cover.kuaishou.com/001.jpg", - Network accessline 13
"video_url": "https://www.kuaishou.com/short-video/3xkuaishou001", - Network accessline 14
"video_cover_url": "https://cover.kuaishou.com/001.jpg", - Network accessline 15
"video_play_url": "https://play.kuaishou.com/001.mp4",
tests/fixtures/mc/xhs/json/search_contents_2026-09-16.json
- Network accessline 5
"title": "三分钟学会低卡便当", "desc": "上班族低卡便当教程,一周不重样 #低卡便当 #减脂餐", "video_url": "http://sns-video-bd.xhscdn.com/sv_video_key", - Network accessline 6
"desc": "上班族低卡便当教程,一周不重样 #低卡便当 #减脂餐", "video_url": "http://sns-video-bd.xhscdn.com/sv_video_key", "time": 1758002400000, - Network accessline 7
"video_url": "http://sns-video-bd.xhscdn.com/sv_video_key", - Network accessline 14
"comment_count": "89", "share_count": "12", "image_list": "http://sns-img.xhscdn.com/img1.jpg,http://sns-img.xhscdn.com/img2.jpg", - Network accessline 15
"share_count": "12", "image_list": "http://sns-img.xhscdn.com/img1.jpg,http://sns-img.xhscdn.com/img2.jpg", "tag_list": "低卡便当,减脂餐,上班族", - Network accessline 16
"image_list": "http://sns-img.xhscdn.com/img1.jpg,http://sns-img.xhscdn.com/img2.jpg", - Network accessline 17
[Credential-related source omitted] - Network accessline 18
[Credential-related source omitted] - Network accessline 19
[Credential-related source omitted] - Network accessline 35
"comment_count": "1", "share_count": "0", "image_list": "http://sns-img.xhscdn.com/img3.jpg", - Network accessline 36
"share_count": "0", "image_list": "http://sns-img.xhscdn.com/img3.jpg", "tag_list": "便当", - Network accessline 37
"image_list": "http://sns-img.xhscdn.com/img3.jpg", - Network accessline 38
[Credential-related source omitted] - Network accessline 39
[Credential-related source omitted] - Network accessline 40
[Credential-related source omitted]
tests/test_commerce_outputs.py
- Executable scriptline 1
Executable file - Network accessline 240
商品链接: https://example.com/product/123 - Network accessline 270
result = module.extract_fact_card(md) assert result["product_name"] == "测试玻尿酸精华" assert result["product_url"] == "https://example.com/product/123" - Network accessline 271
assert result["product_name"] == "测试玻尿酸精华" assert result["product_url"] == "https://example.com/product/123" assert result["captured_at"] == "2026-08-10T14:30:00" - Network accessline 272
assert result["product_url"] == "https://example.com/product/123" - Network accessline 416
商品链接: https://example.com/product/test - Network accessline 475
assert package["metadata"]["version"] == "2.0.0" assert "source_files" in package["metadata"] assert package["product_fact"]["product_url"] == "https://example.com/product/test" - Network accessline 476
assert "source_files" in package["metadata"] assert package["product_fact"]["product_url"] == "https://example.com/product/test" assert len(package["titles"]) == 1 - Network accessline 477
assert package["product_fact"]["product_url"] == "https://example.com/product/test" - Network accessline 490
output_json = tmp_path / "commerce-package.json" fact_md.write_text("""商品名称: 测试精华 商品链接: https://example.com/product/test - Network accessline 491
fact_md.write_text("""商品名称: 测试精华 商品链接: https://example.com/product/test 抓取时间: 2026-08-10T14:30:00 - Network accessline 492
商品链接: https://example.com/product/test - Access to secretsline 539
[Credential-related source omitted] - Access to secretsline 540
[Credential-related source omitted] - Access to secretsline 541
[Credential-related source omitted] - Access to secretsline 544
[Credential-related source omitted]
tests/test_mc_client.py
- Executable scriptline 1
Executable file - Network accessline 76
def test_build_args_detail_uses_specified_id(): args = mc.build_crawler_args( "detail", "dy", ids=["https://v.douyin.com/abc/", "7428000000000001234"], - Network accessline 77
args = mc.build_crawler_args( "detail", "dy", ids=["https://v.douyin.com/abc/", "7428000000000001234"], comments=False, out_dir="/tmp/mc-out", - Network accessline 78
"detail", "dy", ids=["https://v.douyin.com/abc/", "7428000000000001234"], - Network accessline 81
joined = " ".join(args) assert "--type detail" in joined assert "--specified_id https://v.douyin.com/abc/,7428000000000001234" in joined - Network accessline 82
assert "--type detail" in joined assert "--specified_id https://v.douyin.com/abc/,7428000000000001234" in joined assert "--get_comment false" in joined - Network accessline 83
assert "--specified_id https://v.douyin.com/abc/,7428000000000001234" in joined - Network accessline 87
def test_build_args_creator_uses_creator_id(): args = mc.build_crawler_args( "creator", "xhs", ids=["https://www.xiaohongshu.com/user/profile/5e7fabc"], - Network accessline 88
args = mc.build_crawler_args( "creator", "xhs", ids=["https://www.xiaohongshu.com/user/profile/5e7fabc"], out_dir="/tmp/mc-out", - Network accessline 89
"creator", "xhs", ids=["https://www.xiaohongshu.com/user/profile/5e7fabc"], - Network accessline 163
assert video["publish_time"] == 1758002400 # ms → s assert len(video["image_urls"]) == 2 assert video["cover_url"].startswith("http://sns-img") - Network accessline 164
assert len(video["image_urls"]) == 2 assert video["cover_url"].startswith("http://sns-img") assert video["tags"] == ["低卡便当", "减脂餐", "上班族"] - Network accessline 165
assert video["cover_url"].startswith("http://sns-img") - Network accessline 185
assert item["liked_count"] == 23000 assert item["publish_time"] == 1758002400 # already seconds assert item["video_url"].startswith("https://v26-web") - Network accessline 186
assert item["publish_time"] == 1758002400 # already seconds assert item["video_url"].startswith("https://v26-web") assert item["cover_url"].startswith("https://p3-sign") - Network accessline 187
assert item["video_url"].startswith("https://v26-web") - Network accessline 188
assert item["cover_url"].startswith("https://p3-sign") - Network accessline 198
assert item["view_count"] == 152000 assert item["collected_count"] is None # ks 搜索结果不提供收藏数 assert item["video_url"].startswith("https://play.kuaishou.com") - Network accessline 199
assert item["collected_count"] is None # ks 搜索结果不提供收藏数 assert item["video_url"].startswith("https://play.kuaishou.com") assert item["publish_time"] == 1758002400 # ms → s - Network accessline 200
assert item["video_url"].startswith("https://play.kuaishou.com") - Network accessline 340
def test_pip_index_respects_user_env(monkeypatch): monkeypatch.setenv("PIP_INDEX_URL", "https://example.com/simple") - Network accessline 341
monkeypatch.setenv("PIP_INDEX_URL", "https://example.com/simple") - Network accessline 348
_clear_mirror_env(monkeypatch) speeds = { "https://pypi.org/simple": 800.0, - Network accessline 349
speeds = { "https://pypi.org/simple": 800.0, "https://pypi.tuna.tsinghua.edu.cn/simple": 50.0, - Network accessline 350
"https://pypi.org/simple": 800.0, - Network accessline 351
"https://pypi.tuna.tsinghua.edu.cn/simple": 50.0, - Network accessline 352
"https://mirrors.aliyun.com/pypi/simple": 60.0, - Network accessline 354
monkeypatch.setattr(mc, "_probe_ms", lambda url, timeout=4.0: speeds[url]) args, label = mc.pip_index_args(log=lambda m: None) assert args == ["-i", "https://pypi.tuna.tsinghua.edu.cn/simple"] - Network accessline 355
args, label = mc.pip_index_args(log=lambda m: None) assert args == ["-i", "https://pypi.tuna.tsinghua.edu.cn/simple"] assert label == "清华 PyPI 镜像" - Network accessline 356
assert args == ["-i", "https://pypi.tuna.tsinghua.edu.cn/simple"] - Network accessline 361
_clear_mirror_env(monkeypatch) speeds = { "https://pypi.org/simple": 40.0, - Network accessline 362
speeds = { "https://pypi.org/simple": 40.0, "https://pypi.tuna.tsinghua.edu.cn/simple": 500.0, - Network accessline 363
"https://pypi.org/simple": 40.0, - Network accessline 364
"https://pypi.tuna.tsinghua.edu.cn/simple": 500.0, - Network accessline 365
"https://mirrors.aliyun.com/pypi/simple": 600.0, - Network accessline 407
def test_playwright_mirror_respects_user_env(monkeypatch): _clear_mirror_env(monkeypatch) monkeypatch.setenv("PLAYWRIGHT_DOWNLOAD_HOST", "https://my-host.example") - Network accessline 408
_clear_mirror_env(monkeypatch) monkeypatch.setenv("PLAYWRIGHT_DOWNLOAD_HOST", "https://my-host.example") assert mc.playwright_mirror_env(log=lambda m: None) == {} - Network accessline 409
monkeypatch.setenv("PLAYWRIGHT_DOWNLOAD_HOST", "https://my-host.example") - Network accessline 413
def test_clone_candidates_env_url_wins(monkeypatch): _clear_mirror_env(monkeypatch) monkeypatch.setenv("MC_GIT_URL", "https://mirror.example/MediaCrawler.git") - Network accessline 414
_clear_mirror_env(monkeypatch) monkeypatch.setenv("MC_GIT_URL", "https://mirror.example/MediaCrawler.git") assert mc.clone_url_candidates(log=lambda m: None) == [ - Network accessline 415
monkeypatch.setenv("MC_GIT_URL", "https://mirror.example/MediaCrawler.git") - Network accessline 416
assert mc.clone_url_candidates(log=lambda m: None) == [ ("https://mirror.example/MediaCrawler.git", "MC_GIT_URL") ] - Network accessline 417
("https://mirror.example/MediaCrawler.git", "MC_GIT_URL") - Network accessline 421
def test_clone_candidates_direct_first_when_github_reachable(monkeypatch): _clear_mirror_env(monkeypatch) probes = {"https://github.com": 300.0} - Network accessline 422
_clear_mirror_env(monkeypatch) probes = {"https://github.com": 300.0} monkeypatch.setattr(mc, "_probe_ms", lambda url, timeout=4.0: probes.get(url)) - Network accessline 423
probes = {"https://github.com": 300.0} - Network accessline 430
def test_clone_candidates_mirrors_first_when_github_down(monkeypatch): _clear_mirror_env(monkeypatch) probes = {"https://github.com": None} - Network accessline 431
_clear_mirror_env(monkeypatch) probes = {"https://github.com": None} monkeypatch.setattr(mc, "_probe_ms", lambda url, timeout=4.0: probes.get(url)) - Network accessline 432
probes = {"https://github.com": None} - Network accessline 481
def test_crawl_detail_and_creator_default_comments_on(monkeypatch, tmp_path): captured = _capture_crawl_args(monkeypatch, tmp_path) mc.crawl("detail", "xhs", ids=["http://x/1"], log=lambda m: None) - Network accessline 482
captured = _capture_crawl_args(monkeypatch, tmp_path) mc.crawl("detail", "xhs", ids=["http://x/1"], log=lambda m: None) assert "--get_comment true" in " ".join(captured["args"]) - Network accessline 483
mc.crawl("detail", "xhs", ids=["http://x/1"], log=lambda m: None) - Network accessline 486
mc.crawl("creator", "douyin", ids=["http://x/user/1"], log=lambda m: None) - Network accessline 496
def test_crawl_comment_cap_defaults_to_upstream_ten(monkeypatch, tmp_path): captured = _capture_crawl_args(monkeypatch, tmp_path) mc.crawl("detail", "xhs", ids=["http://x/1"], log=lambda m: None) - Network accessline 497
captured = _capture_crawl_args(monkeypatch, tmp_path) mc.crawl("detail", "xhs", ids=["http://x/1"], log=lambda m: None) assert "--max_comments_count_singlenotes 10" in " ".join(captured["args"]) - Network accessline 498
mc.crawl("detail", "xhs", ids=["http://x/1"], log=lambda m: None) - Network accessline 502
def test_crawl_max_comments_propagates(monkeypatch, tmp_path): captured = _capture_crawl_args(monkeypatch, tmp_path) mc.crawl("detail", "xhs", ids=["http://x/1"], max_comments=5, log=lambda m: None) - Network accessline 503
captured = _capture_crawl_args(monkeypatch, tmp_path) mc.crawl("detail", "xhs", ids=["http://x/1"], max_comments=5, log=lambda m: None) assert "--max_comments_count_singlenotes 5" in " ".join(captured["args"]) - Network accessline 504
mc.crawl("detail", "xhs", ids=["http://x/1"], max_comments=5, log=lambda m: None) - Network accessline 550
result = mc.crawl("detail", "douyin", ids=["http://x/1"], log=lambda m: None) - Network accessline 606
lock.write_text("999999 123", encoding="utf-8") with pytest.raises(mc.McError, match="单实例|并行"): mc.crawl("detail", "bilibili", ids=["http://x/1"], log=lambda m: None) - Network accessline 608
mc.crawl("detail", "bilibili", ids=["http://x/1"], log=lambda m: None) - Network accessline 638
def test_volume_cap_rejects_too_many_detail_ids(monkeypatch, tmp_path): monkeypatch.setattr(mc, "DATA_DIR", tmp_path) ids = [f"http://x/{i}" for i in range(6)] - Network accessline 639
monkeypatch.setattr(mc, "DATA_DIR", tmp_path) ids = [f"http://x/{i}" for i in range(6)] with pytest.raises(mc.McError, match="detail"): - Network accessline 640
ids = [f"http://x/{i}" for i in range(6)] - Network accessline 645
def test_volume_cap_rejects_too_many_creators(monkeypatch, tmp_path): monkeypatch.setattr(mc, "DATA_DIR", tmp_path) ids = [f"http://x/u/{i}" for i in range(3)] - Network accessline 646
monkeypatch.setattr(mc, "DATA_DIR", tmp_path) ids = [f"http://x/u/{i}" for i in range(3)] with pytest.raises(mc.McError, match="creator"): - Network accessline 647
ids = [f"http://x/u/{i}" for i in range(3)] - Network accessline 653
_capture_crawl_args(monkeypatch, tmp_path) mc.crawl("search", "xhs", keywords="a,b,c", log=lambda m: None) # 3 词 = 上限,放行 mc.crawl("detail", "dy", ids=[f"http://x/{i}" for i in range(5)], log=lambda m: None) - Network accessline 655
mc.crawl("detail", "dy", ids=[f"http://x/{i}" for i in range(5)], log=lambda m: None) - Network accessline 783
"aiofiles~=23.2.1 # inline comment\n" "-r other.txt\n" "--index-url https://example.com\n", - Network accessline 784
"-r other.txt\n" "--index-url https://example.com\n", encoding="utf-8", - Network accessline 785
"--index-url https://example.com\n",
tests/test_multimodal_scripts.py
- Executable scriptline 1
Executable file - Possible obfuscationline 35
assert base64.b64decode(b64).startswith(b"\xff\xd8") - Possible obfuscationline 41
assert base64.b64decode(b64).startswith(b"\x89PNG") - Network accessline 47
make_png(img_path) monkeypatch.setenv("VIDEO_ANALYSIS_API_KEY", "test-key") monkeypatch.setenv("VIDEO_ANALYSIS_BASE_URL", "https://proxy.example.com/v1") - Network accessline 48
[Credential-related source omitted] - Access to secretsline 48
[Credential-related source omitted] - Network accessline 49
monkeypatch.setenv("VIDEO_ANALYSIS_BASE_URL", "https://proxy.example.com/v1") - Access to secretsline 52
[Credential-related source omitted] - Network accessline 240
assert base64.b64decode(b64).startswith(b"\xff\xd8") assert ( module.chat_completions_url("https://proxy.example.com/v1") - Possible obfuscationline 240
assert base64.b64decode(b64).startswith(b"\xff\xd8") - Network accessline 241
assert ( module.chat_completions_url("https://proxy.example.com/v1") == "https://proxy.example.com/v1/chat/completions" - Network accessline 242
module.chat_completions_url("https://proxy.example.com/v1") - Network accessline 243
== "https://proxy.example.com/v1/chat/completions" - Network accessline 244
) assert ( module.gemini_generate_content_url("https://generativelanguage.googleapis.com/v1beta", "gemini", "key") - Network accessline 245
assert ( module.gemini_generate_content_url("https://generativelanguage.googleapis.com/v1beta", "gemini", "key") == "https://generativelanguage.googleapis.com/v1beta/models/gemini:generateContent?key=key" - Network accessline 246
module.gemini_generate_content_url("https://generativelanguage.googleapis.com/v1beta", "gemini", "key") - Network accessline 247
== "https://generativelanguage.googleapis.com/v1beta/models/gemini:generateContent?key=key" - Access to secretsline 259
[Credential-related source omitted] - Access to secretsline 269
[Credential-related source omitted] - Access to secretsline 278
[Credential-related source omitted] - Access to secretsline 281
[Credential-related source omitted] - Access to secretsline 286
[Credential-related source omitted] - Network accessline 296
def test_chat_completions_url_accepts_google_official_compat(): expected = "https://generativelanguage.googleapis.com/v1beta/openai/chat/completions" - Network accessline 297
expected = "https://generativelanguage.googleapis.com/v1beta/openai/chat/completions" - Network accessline 299
module = load_script(name) assert module.chat_completions_url( "https://generativelanguage.googleapis.com/v1beta/openai") == expected - Network accessline 300
assert module.chat_completions_url( "https://generativelanguage.googleapis.com/v1beta/openai") == expected assert module.chat_completions_url( - Network accessline 301
"https://generativelanguage.googleapis.com/v1beta/openai") == expected - Network accessline 303
"https://proxy.example.com/v1") == "https://proxy.example.com/v1/chat/completions"
tests/test_render_report_pdf.py
- Executable scriptline 1
Executable file
tests/test_tikhub_rest.py
tikhub/README.md
- Access to secretsline 20
[Credential-related source omitted] - Network accessline 23
[Credential-related source omitted] - Network accessline 24
`https://api.tikhub.io`; use `TIKHUB_API_BASE_URL=https://api.tikhub.dev` when - Network accessline 45
Catalogs are generated from `https://api.tikhub.io/openapi.json`: - Access to secretsline 61
[Credential-related source omitted]
tikhub/bin/tikhub
tikhub/lib/tikhub_client.py
- Executable scriptline 1
Executable file - Network accessline 22
DEFAULT_API_BASE_URL = "https://api.tikhub.io" - Access to secretsline 25
[Credential-related source omitted] - Access to secretsline 27
[Credential-related source omitted] - Access to secretsline 28
[Credential-related source omitted] - Network accessline 30
CLIENT_NAME = "tikhub-rest-cli" CLIENT_VERSION = "0.2.0" USER_AGENT = f"{CLIENT_NAME}/{CLIENT_VERSION} (+https://api.tikhub.io)" - Network accessline 31
CLIENT_VERSION = "0.2.0" USER_AGENT = f"{CLIENT_NAME}/{CLIENT_VERSION} (+https://api.tikhub.io)" DEFAULT_PLATFORMS = ( - Network accessline 32
USER_AGENT = f"{CLIENT_NAME}/{CLIENT_VERSION} (+https://api.tikhub.io)" - Access to secretsline 49
[Credential-related source omitted] - Access to secretsline 74
[Credential-related source omitted] - Access to secretsline 76
[Credential-related source omitted] - Access to secretsline 79
[Credential-related source omitted] - Access to secretsline 90
[Credential-related source omitted] - Access to secretsline 128
[Credential-related source omitted] - Access to secretsline 130
[Credential-related source omitted] - Access to secretsline 173
[Credential-related source omitted] - Network accessline 182
for attempt in range(1, 4): _debug(f"{method} {path} attempt={attempt}") request = urllib.request.Request(url, data=data, headers=headers, method=method) - Network accessline 183
_debug(f"{method} {path} attempt={attempt}") request = urllib.request.Request(url, data=data, headers=headers, method=method) try: - Network accessline 184
request = urllib.request.Request(url, data=data, headers=headers, method=method) - Network accessline 185
try: with urllib.request.urlopen(request, timeout=self.timeout) as response: return _decode_json(response.read(), f"{method} {path}") - Network accessline 186
with urllib.request.urlopen(request, timeout=self.timeout) as response: - Access to secretsline 230
[Credential-related source omitted] - Access to secretsline 231
[Credential-related source omitted] - Access to secretsline 232
[Credential-related source omitted] - Network accessline 274
def _get_public_json(path: str, label: str) -> Any: url = f"{api_base_url()}{path}" request = urllib.request.Request(url, headers={"User-Agent": USER_AGENT}) - Network accessline 275
url = f"{api_base_url()}{path}" request = urllib.request.Request(url, headers={"User-Agent": USER_AGENT}) try: - Network accessline 276
request = urllib.request.Request(url, headers={"User-Agent": USER_AGENT}) - Network accessline 277
try: with urllib.request.urlopen(request, timeout=20) as response: return _decode_json(response.read(), label) - Network accessline 278
with urllib.request.urlopen(request, timeout=20) as response:
tikhub/references/tools-douyin.json
- Network accessline 8632
"example": "https://www.douyin.com/aweme/v1/web/general/search/single/?device_platform=webapp&aid=6383&channel=channel_pc_web&search_channel=aweme_general&enable_history=1&keyword=%E4%B8%AD%E5%8D%8E%E5%A8%98&search_source=normal_search&quer - Network accessline 8779
"example": "https://www.douyin.com/aweme/v1/web/aweme/detail/?aweme_id=7148736076176215311&device_platform=webapp&aid=6383&channel=channel_pc_web&pc_client_type=1&version_code=170400&version_name=17.4.0&cookie_enabled=true&screen_width=1920
tikhub/references/tools-wechat.json
- Network accessline 523
], "title": "Share Url", "description": "视频号分享短链(https://weixin.qq.com/sph/…),仅在 object_id 与 export_id 都为空时使用/Share URL (https://weixin.qq.com/sph/…), used only when object_id and export_id are empty", - Network accessline 524
"title": "Share Url", "description": "视频号分享短链(https://weixin.qq.com/sph/…),仅在 object_id 与 export_id 都为空时使用/Share URL (https://weixin.qq.com/sph/…), used only when object_id and export_id are empty", "default": "" - Network accessline 525
"description": "视频号分享短链(https://weixin.qq.com/sph/…),仅在 object_id 与 export_id 都为空时使用/Share URL (https://weixin.qq.com/sph/…), used only when object_id and export_id are empty", - Network accessline 706
"title": "Url", "description": "公众号文章链接(https://mp.weixin.qq.com/s/… 或带 __biz 的长链)/WeChat MP article URL (https://mp.weixin.qq.com/s/… or long URL with __biz)", - Network accessline 707
"description": "公众号文章链接(https://mp.weixin.qq.com/s/… 或带 __biz 的长链)/WeChat MP article URL (https://mp.weixin.qq.com/s/… or long URL with __biz)", - Network accessline 708
"example": "https://mp.weixin.qq.com/s/TSNQKkRpN1qbKsT7BvzqIw" - Network accessline 736
"title": "Url", "description": "公众号文章链接(https://mp.weixin.qq.com/s/…)/WeChat MP article URL (https://mp.weixin.qq.com/s/…)", - Network accessline 737
"description": "公众号文章链接(https://mp.weixin.qq.com/s/…)/WeChat MP article URL (https://mp.weixin.qq.com/s/…)", - Network accessline 738
"example": "https://mp.weixin.qq.com/s/TSNQKkRpN1qbKsT7BvzqIw" - Network accessline 780
"title": "Url", "description": "公众号文章链接(https://mp.weixin.qq.com/s/… 或带 __biz 的长链)/WeChat MP article URL (https://mp.weixin.qq.com/s/… or long URL with __biz)", - Network accessline 781
"description": "公众号文章链接(https://mp.weixin.qq.com/s/… 或带 __biz 的长链)/WeChat MP article URL (https://mp.weixin.qq.com/s/… or long URL with __biz)", - Network accessline 782
"example": "https://mp.weixin.qq.com/s/TSNQKkRpN1qbKsT7BvzqIw" - Network accessline 810
"title": "Url", "description": "公众号文章链接(https://mp.weixin.qq.com/s/… 或带 __biz 的长链)/WeChat MP article URL (https://mp.weixin.qq.com/s/… or long URL with __biz)", - Network accessline 811
"description": "公众号文章链接(https://mp.weixin.qq.com/s/… 或带 __biz 的长链)/WeChat MP article URL (https://mp.weixin.qq.com/s/… or long URL with __biz)", - Network accessline 812
"example": "https://mp.weixin.qq.com/s/TSNQKkRpN1qbKsT7BvzqIw" - Network accessline 840
"title": "Url", "description": "公众号文章链接(https://mp.weixin.qq.com/s/…)/WeChat MP article URL (https://mp.weixin.qq.com/s/…)", - Network accessline 841
"description": "公众号文章链接(https://mp.weixin.qq.com/s/…)/WeChat MP article URL (https://mp.weixin.qq.com/s/…)", - Network accessline 842
"example": "http://mp.weixin.qq.com/s?__biz=Mzk3NTA0MzM5NA==&mid=2247483745&idx=1&sn=3f34e768cf457a501038991ed30be1f4#rd" - Network accessline 899
"title": "Url", "description": "公众号文章链接(https://mp.weixin.qq.com/s/… 或带 __biz 的长链)/WeChat MP article URL (https://mp.weixin.qq.com/s/… or long URL with __biz)", - Network accessline 900
"description": "公众号文章链接(https://mp.weixin.qq.com/s/… 或带 __biz 的长链)/WeChat MP article URL (https://mp.weixin.qq.com/s/… or long URL with __biz)", - Network accessline 901
"example": "https://mp.weixin.qq.com/s/TSNQKkRpN1qbKsT7BvzqIw"
tikhub/scripts/refresh_tools.py
- Executable scriptline 1
#!/usr/bin/env python3
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.
Combined signals: 1 fact
- Passes downloaded content to an interpreterscripts/render_report_pdf.py:254High confidence
Declared and executed: 18 facts
- Contacts pypi.org, which SKILL.md, the README and the plugin manifest do not mentioninstall_as_skill.sh:42High confidence
- Contacts pypi.tuna.tsinghua.edu.cn, which SKILL.md, the README and the plugin manifest do not mentioninstall_as_skill.sh:42High confidence
- Contacts mirrors.aliyun.com, which SKILL.md, the README and the plugin manifest do not mentioninstall_as_skill.sh:42High confidence
- Contacts github.com, which SKILL.md, the README and the plugin manifest do not mentionmediacrawler/lib/mc_client.py:56High confidence
- Contacts pypi.org, which SKILL.md, the README and the plugin manifest do not mentionmediacrawler/lib/mc_client.py:185High confidence
- Contacts pypi.tuna.tsinghua.edu.cn, which SKILL.md, the README and the plugin manifest do not mentionmediacrawler/lib/mc_client.py:186High confidence
- Contacts mirrors.aliyun.com, which SKILL.md, the README and the plugin manifest do not mentionmediacrawler/lib/mc_client.py:187High confidence
- Contacts cdn.playwright.dev, which SKILL.md, the README and the plugin manifest do not mentionmediacrawler/lib/mc_client.py:189High confidence
- Contacts registry.npmmirror.com, which SKILL.md, the README and the plugin manifest do not mentionmediacrawler/lib/mc_client.py:190High confidence
- Contacts gh-proxy.com, which SKILL.md, the README and the plugin manifest do not mentionmediacrawler/lib/mc_client.py:192High confidence
- Contacts ghfast.top, which SKILL.md, the README and the plugin manifest do not mentionmediacrawler/lib/mc_client.py:193High confidence
- Contacts api.openai.com, which SKILL.md, the README and the plugin manifest do not mentionscripts/analyze_image.py:231High confidence
- Contacts generativelanguage.googleapis.com, which SKILL.md, the README and the plugin manifest do not mentionscripts/analyze_image.py:232High confidence
- Contacts api.openai.com, which SKILL.md, the README and the plugin manifest do not mentionscripts/analyze_video.py:319High confidence
- Contacts generativelanguage.googleapis.com, which SKILL.md, the README and the plugin manifest do not mentionscripts/analyze_video.py:320High confidence
- Contacts api.siliconflow.cn, which SKILL.md, the README and the plugin manifest do not mentionscripts/analyze_video.py:647High confidence
- Contacts api.openai.com, which SKILL.md, the README and the plugin manifest do not mentionscripts/ocr_screenshot.py:217High confidence
- Contacts generativelanguage.googleapis.com, which SKILL.md, the README and the plugin manifest do not mentionscripts/ocr_screenshot.py:218High confidence
Signal confidence: 383 facts
- Network access in code of documentationREADME.md:79Low confidence
- Network access in code of documentationREADME.md:80Low confidence
- Network access in prose of documentationREADME.md:91Low confidence
- Network access in prose of documentationREADME.md:92Low confidence
- Network access in prose of documentationREADME.md:93Low confidence
- Network access in prose of the SKILL.mdSKILL.md:566Low confidence
- Access to secrets in prose of the SKILL.mdSKILL.md:587Low confidence
- Access to secrets in code of the SKILL.mdSKILL.md:828High confidence
- Network access in prose of the SKILL.mdSKILL.md:840Low confidence
- Network access in prose of the SKILL.mdSKILL.md:842Low confidence
- Network access in prose of the SKILL.mdSKILL.md:843Low confidence
- Access to secrets in prose of the SKILL.mdSKILL.md:851Low confidence
- Access to secrets in prose of the SKILL.md: a variable, placeholder or call, not a stored valueSKILL.md:858Low confidence
- Access to secrets in prose of the SKILL.mdSKILL.md:859Low confidence
- Network access in code of documentationdocs/install.md:9Low confidence
- Network access in prose of documentationdocs/install.md:34Low confidence
- Network access in prose of documentationdocs/install.md:35Low confidence
- Access to secrets in prose of documentationdocs/install.md:35Low confidence
- Network access in prose of documentationdocs/install.md:36Low confidence
- Access to secrets in prose of documentationdocs/install.md:36Low confidence
- Access to secrets in prose of documentationdocs/install.md:37Low confidence
- Access to secrets in prose of documentationdocs/install.md:41Low confidence
- Network access in code of documentationdocs/install.md:72Low confidence
- Network access in code of documentationdocs/install.md:73Low confidence
- Network access in code of documentationdocs/install.md:74Low confidence
- Executable script in code of a file that runsinstall_as_skill.sh:1High confidence
- Network access in code of a file that runsinstall_as_skill.sh:38High confidence
- Network access in code of a file that runsinstall_as_skill.sh:39High confidence
- Network access in code of a file that runsinstall_as_skill.sh:40High confidence
- Network access in code of a file that runsinstall_as_skill.sh:41High confidence
- Network access in code of a file that runsinstall_as_skill.sh:42High confidence
- Network access in code of a file that runsinstall_as_skill.sh:43High confidence
- Network access in code of a file that runsinstall_as_skill.sh:53High confidence
- Network access in code of a file that runsinstall_as_skill.sh:54High confidence
- Network access in code of a file that runsinstall_as_skill.sh:55High confidence
- Dangerous shell operation in code of a file that runsinstall_as_skill.sh:85High confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valueinstall_as_skill.sh:151Low confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valueinstall_as_skill.sh:153Low confidence
- Access to secrets in code of a file that runsinstall_as_skill.sh:154High confidence
- Dangerous shell operation in code of a file that runsinstall_as_skill.sh:156High confidence
- Access to secrets in code of a file that runsinstall_as_skill.sh:165High confidence
- Access to secrets in code of a file that runsinstall_as_skill.sh:175High confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valueinstall_as_skill.sh:180Low confidence
- Access to secrets in code of a file that runsinstall_as_skill.sh:182High confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valueinstall_as_skill.sh:231Low confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valueinstall_as_skill.sh:234Low confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valueinstall_as_skill.sh:235Low confidence
- Network access in code of a file that runsinstall_as_skill.sh:239High confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valueinstall_as_skill.sh:239Low confidence
- Network access in code of a file that runsinstall_as_skill.sh:240High confidence
and 333 more
Works with
| Agent | Status | Evidence | Install to |
|---|---|---|---|
| Claude Code | Compatible | Standard SKILL.md SKILL.md | .claude/skills/<skill-name>/ |
| Codex | Compatible | Standard SKILL.md SKILL.md | .agents/skills/<skill-name>/ |
| Cursor | Compatible | Standard SKILL.md SKILL.md | .cursor/skills/<skill-name>/ |
| Gemini CLI | Compatible | Standard SKILL.md SKILL.md | .gemini/skills/<skill-name>/ |
| GitHub Copilot | Compatible | Standard SKILL.md SKILL.md | .github/skills/<skill-name>/ |
| OpenCode | Compatible | Standard SKILL.md 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.