Files
market/skills/baoyu-skills/entry.json
xyx 27589d013d fix(skills): 修复 14 个 pointer 条目安装失败 + 7 个合集声明 children (#81)
## 背景 / Background

市场里 25 个 pointer 条目中有 **14 个点安装必然失败**,客户端返回 502「源仓库中未找到 SKILL.md(pointer
指向有误)」。

根因是 `entry.json` 的 `source` 指错:客户端按 `source.path` 定位内容(缺省则取仓库根),而这些条目的
`path` 缺失或 URL 指向了 HTML 页面,`contentDir/SKILL.md` 自然不存在。

Of the 25 pointer entries, **14 always failed to install** with a 502.
The `source` pointers were wrong: `path` was missing (so the client
looked at the repo root) or `repoUrl` pointed at an HTML page instead of
the content.

## 改动 / Changes

### 1. 补 `source.path`(5 个)

| 条目 | path | 上游 SKILL.md 实际位置 |
|---|---|---|
| `impeccable` | `plugin/skills/impeccable` | 根目录没有;`plugin/` 与
`.claude/` 两份内容逐字节一致,取中立的分发目录 |
| `ai-news-radar` | `skills/ai-news-radar` | 仓库另有 `skills/radar`,取与条目 id
对应的 |
| `taste-skill` | `skills/taste-skill` | 同名子目录 |
| `wechatpay-skills` | `wechatpay-payment-integration` | 仓库另有
`wechatpay-product-coupon` 未覆盖,见下方遗留项 |
| `luckin-my-coffee` | `my-coffee` | zip 内有一层顶层目录 |

### 2. 修正 web 类条目的源地址(2 个)

`amap-jsapi-skill` / `dingtalk-api` 原先指向 ClawHub 的**网页**(`content-type:
text/html`),客户端只在 markdown 时才写成 `SKILL.md`,HTML 会落成 `index.html`,校验必失败。

- `amap-jsapi-skill` → 改用 ClawHub 文件 API(返回 `text/markdown`)。该技能在
ClawHub 的发布包 `version.files` 只有一个 `SKILL.md`,单文件抓取正是对的形态。
- `dingtalk-api` → ClawHub 包有 38 个文件(`scripts/*.ts` 等),单文件抓不全,改指内容完整的
GitHub 上游 `ogenes/dingtalk-api` 并锁 ref。

### 3. 合集条目声明 `children`(7 个,147 个子技能)

这 7 个的上游是「一个仓库装着 N 个平级技能」,没有单一 SKILL.md 可指,靠改 `path`
修不了。配合客户端新增的合集能力(desirecore 主仓库 PR),`entry.json`
现在可声明子技能清单,市场仍是一个条目,安装时由用户勾选装哪几个。

| 条目 | 子技能数 |
|---|---|
| `marketingskills` | 49 |
| `mattpocock-skills` | 35 |
| `larksuite-cli` | 27 |
| `baoyu-skills` | 21 |
| `wecom-cli` | 7 |
| `khazix-skills` | 5 |
| `netease-skills` | 3 |

新增 `scripts/gen-collection-children.py`:按 `entry.json` 锁定的 ref
克隆上游、扫描子技能、读 frontmatter 生成 `children`。约定「仓库有顶层 `skills/` 就只扫它」——否则会收录
`larksuite/cli` 的 linter 测试夹具
`internal/qualitygate/skillscan/testdata/skills/lark-demo`。

### 4. `netease-skills` 分支修正

`repoBranch` 写的是 `main`,上游默认分支是 `master`,此前 clone 必然失败(`Could not find
main`)。

### 5. 版本号

`manifest.json` `1.2.24` → `1.2.25`。

## 验证 / Verification

- `uv run scripts/i18n/validate-i18n.py` — OK
- `uv run scripts/i18n/validate-i18n.py --online` — OK
- **真实运行的 agent-service 上逐个安装**(独立 home + standalone 服务,非模拟):18 个非合集
pointer 条目 **18/18 成功**并完整落盘;7 个合集条目 **7/7 成功**,并验证了部分安装、追加、取消勾选卸载、装到
Agent 私有目录。

## 遗留项 / Known gaps

- `wechatpay-skills` 只覆盖了 `wechatpay-payment-integration`,同仓库的
`wechatpay-product-coupon` 未上架。条目名是复数,后续可拆成两条或改成合集。
- `children[].i18n` 目前只有 `shortDesc`(取自上游
description),**没有中文名**——子技能名沿用上游 id(如 `lark-approval`),以保证与上游文档、Agent
加载路径一致。宝玉 / Matt Pocock / Marketing 三个合集的描述本身就是英文。如需中文化,可接
`i18n-translate.yml` 覆盖 `children` 字段。
- 在线校验目前只查 URL 可达性,**查不出 `path` 指向的目录里有没有 SKILL.md**——这 14
个坏条目当初就是这么一路绿灯合进主干的。建议后续给 `--online` 加这条断言。

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: xieyuanxiang <xieyuanxiang123@gmail.com>
2026-08-09 16:25:20 +08:00

314 lines
11 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"id": "baoyu-skills",
"name": "宝玉 Skills",
"category": "creative",
"icon": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M4 5a1 1 0 0 1 1-1h9l6 6v9a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V5Z\" stroke=\"#2563EB\" stroke-width=\"1.7\" stroke-linejoin=\"round\"/><path d=\"M14 4v6h6\" stroke=\"#2563EB\" stroke-width=\"1.7\" stroke-linejoin=\"round\"/><path d=\"m9.5 13.5 1.6 1.6 3.4-3.4\" stroke=\"#2563EB\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>",
"tags": [
"baoyu",
"content-creation",
"wechat",
"illustration",
"productivity"
],
"i18n": {
"zh-CN": {
"name": "宝玉 Skills",
"shortDesc": "宝玉分享的 AI Agent 技能集20+ 技能覆盖封面图、插图、公众号发布、翻译、幻灯片等,适配 Claude Code、Codex 等"
},
"en-US": {
"name": "Baoyu Skills",
"shortDesc": "Baoyu's 20+ content-creation skills — cover images, illustrations, WeChat publishing, translation and slide decks, for Claude Code and Codex"
}
},
"maintainer": {
"name": "Baoyu (JimLiu)",
"verified": false,
"account": "JimLiu",
"url": "https://github.com/JimLiu/baoyu-skills"
},
"stewardship": "community",
"license": "MIT",
"redistribution": "allowed",
"source": {
"kind": "git",
"repoUrl": "https://github.com/JimLiu/baoyu-skills.git",
"repoBranch": "main",
"ref": "6b7a2e417500561a5ecdd0b168332f4142584617"
},
"children": [
{
"id": "baoyu-article-illustrator",
"path": "skills/baoyu-article-illustrator",
"version": "1.117.4",
"i18n": {
"zh-CN": {
"shortDesc": "Analyzes article structure, identifies positions requiring visual aids, generates illustrations with Type × Style × Palette three-dimension approach."
},
"en-US": {
"shortDesc": "Analyzes article structure, identifies positions requiring visual aids, generates illustrations with Type × Style × Palette three-dimension approach."
}
}
},
{
"id": "baoyu-comic",
"path": "skills/baoyu-comic",
"version": "1.117.4",
"i18n": {
"zh-CN": {
"shortDesc": "Knowledge comic creator supporting multiple art styles and tones."
},
"en-US": {
"shortDesc": "Knowledge comic creator supporting multiple art styles and tones."
}
}
},
{
"id": "baoyu-compress-image",
"path": "skills/baoyu-compress-image",
"version": "1.56.1",
"i18n": {
"zh-CN": {
"shortDesc": "Compresses images to WebP (default) or PNG with automatic tool selection."
},
"en-US": {
"shortDesc": "Compresses images to WebP (default) or PNG with automatic tool selection."
}
}
},
{
"id": "baoyu-cover-image",
"path": "skills/baoyu-cover-image",
"version": "1.117.5",
"i18n": {
"zh-CN": {
"shortDesc": "Generates article cover images with 5 dimensions (type, palette, rendering, text, mood) combining 11 color palettes and 7 rendering styles."
},
"en-US": {
"shortDesc": "Generates article cover images with 5 dimensions (type, palette, rendering, text, mood) combining 11 color palettes and 7 rendering styles."
}
}
},
{
"id": "baoyu-danger-gemini-web",
"path": "skills/baoyu-danger-gemini-web",
"version": "1.56.2",
"i18n": {
"zh-CN": {
"shortDesc": "Generates images and text via reverse-engineered Gemini Web API."
},
"en-US": {
"shortDesc": "Generates images and text via reverse-engineered Gemini Web API."
}
}
},
{
"id": "baoyu-danger-x-to-markdown",
"path": "skills/baoyu-danger-x-to-markdown",
"version": "1.117.3",
"i18n": {
"zh-CN": {
"shortDesc": "Converts X (Twitter) tweets and articles to markdown with YAML front matter."
},
"en-US": {
"shortDesc": "Converts X (Twitter) tweets and articles to markdown with YAML front matter."
}
}
},
{
"id": "baoyu-diagram",
"path": "skills/baoyu-diagram",
"version": "1.117.3",
"i18n": {
"zh-CN": {
"shortDesc": "Create professional, dark-themed SVG diagrams of any type — architecture diagrams, flowcharts, sequence diagrams, structural diagrams, mind maps, timelines, ill…"
},
"en-US": {
"shortDesc": "Create professional, dark-themed SVG diagrams of any type — architecture diagrams, flowcharts, sequence diagrams, structural diagrams, mind maps, timelines, ill…"
}
}
},
{
"id": "baoyu-electron-extract",
"path": "skills/baoyu-electron-extract",
"version": "1.119.0",
"i18n": {
"zh-CN": {
"shortDesc": "Extracts resources and JavaScript from any installed Electron app (`.asar` bundle), restoring original sources from `.js.map` files when available or formatting…"
},
"en-US": {
"shortDesc": "Extracts resources and JavaScript from any installed Electron app (`.asar` bundle), restoring original sources from `.js.map` files when available or formatting…"
}
}
},
{
"id": "baoyu-format-markdown",
"path": "skills/baoyu-format-markdown",
"version": "1.57.0",
"i18n": {
"zh-CN": {
"shortDesc": "Formats plain text or markdown files with frontmatter, titles, summaries, headings, bold, lists, and code blocks."
},
"en-US": {
"shortDesc": "Formats plain text or markdown files with frontmatter, titles, summaries, headings, bold, lists, and code blocks."
}
}
},
{
"id": "baoyu-image-gen",
"path": "skills/baoyu-image-gen",
"version": "2.1.0",
"i18n": {
"zh-CN": {
"shortDesc": "AI image generation with OpenAI GPT Image 2, Azure OpenAI, Google, OpenRouter, DashScope, Z.AI GLM-Image, MiniMax, Jimeng, Seedream, Replicate and Agnes APIs."
},
"en-US": {
"shortDesc": "AI image generation with OpenAI GPT Image 2, Azure OpenAI, Google, OpenRouter, DashScope, Z.AI GLM-Image, MiniMax, Jimeng, Seedream, Replicate and Agnes APIs."
}
}
},
{
"id": "baoyu-infographic",
"path": "skills/baoyu-infographic",
"version": "1.117.4",
"i18n": {
"zh-CN": {
"shortDesc": "Generate professional infographics with 21 layout types and 22 visual styles."
},
"en-US": {
"shortDesc": "Generate professional infographics with 21 layout types and 22 visual styles."
}
}
},
{
"id": "baoyu-markdown-to-html",
"path": "skills/baoyu-markdown-to-html",
"version": "1.117.3",
"i18n": {
"zh-CN": {
"shortDesc": "Converts Markdown to styled HTML with WeChat-compatible themes."
},
"en-US": {
"shortDesc": "Converts Markdown to styled HTML with WeChat-compatible themes."
}
}
},
{
"id": "baoyu-post-to-wechat",
"path": "skills/baoyu-post-to-wechat",
"version": "1.118.2",
"i18n": {
"zh-CN": {
"shortDesc": "Posts content to WeChat Official Account (微信公众号) via API or Chrome CDP."
},
"en-US": {
"shortDesc": "Posts content to WeChat Official Account (微信公众号) via API or Chrome CDP."
}
}
},
{
"id": "baoyu-post-to-weibo",
"path": "skills/baoyu-post-to-weibo",
"version": "1.117.3",
"i18n": {
"zh-CN": {
"shortDesc": "Posts content to Weibo (微博)."
},
"en-US": {
"shortDesc": "Posts content to Weibo (微博)."
}
}
},
{
"id": "baoyu-post-to-x",
"path": "skills/baoyu-post-to-x",
"version": "1.58.1",
"i18n": {
"zh-CN": {
"shortDesc": "Posts content and articles to X (Twitter)."
},
"en-US": {
"shortDesc": "Posts content and articles to X (Twitter)."
}
}
},
{
"id": "baoyu-slide-deck",
"path": "skills/baoyu-slide-deck",
"version": "1.117.4",
"i18n": {
"zh-CN": {
"shortDesc": "Generates professional slide deck images from content."
},
"en-US": {
"shortDesc": "Generates professional slide deck images from content."
}
}
},
{
"id": "baoyu-translate",
"path": "skills/baoyu-translate",
"version": "1.117.3",
"i18n": {
"zh-CN": {
"shortDesc": "This skill should be used when the user asks to \"translate\", \"翻译\", \"精翻\", \"translate article\", \"translate to Chinese\", \"translate to English\", \"改成中文\", \"改成英文\", \"c…"
},
"en-US": {
"shortDesc": "This skill should be used when the user asks to \"translate\", \"翻译\", \"精翻\", \"translate article\", \"translate to Chinese\", \"translate to English\", \"改成中文\", \"改成英文\", \"c…"
}
}
},
{
"id": "baoyu-url-to-markdown",
"path": "skills/baoyu-url-to-markdown",
"version": "1.61.0",
"i18n": {
"zh-CN": {
"shortDesc": "Fetch any URL and convert to markdown using baoyu-fetch CLI (Chrome CDP with site-specific adapters)."
},
"en-US": {
"shortDesc": "Fetch any URL and convert to markdown using baoyu-fetch CLI (Chrome CDP with site-specific adapters)."
}
}
},
{
"id": "baoyu-wechat-summary",
"path": "skills/baoyu-wechat-summary",
"version": "1.119.0",
"i18n": {
"zh-CN": {
"shortDesc": "Summarizes WeChat group chat highlights into a structured digest using the local wx-cli binary (https://github.com/jackwener/wx-cli)."
},
"en-US": {
"shortDesc": "Summarizes WeChat group chat highlights into a structured digest using the local wx-cli binary (https://github.com/jackwener/wx-cli)."
}
}
},
{
"id": "baoyu-xhs-images",
"path": "skills/baoyu-xhs-images",
"version": "2.0.1",
"i18n": {
"zh-CN": {
"shortDesc": "Generates infographic image card series with 12 visual styles, 8 layouts, and 3 color palettes."
},
"en-US": {
"shortDesc": "Generates infographic image card series with 12 visual styles, 8 layouts, and 3 color palettes."
}
}
},
{
"id": "baoyu-youtube-transcript",
"path": "skills/baoyu-youtube-transcript",
"version": "1.1.0",
"i18n": {
"zh-CN": {
"shortDesc": "Downloads YouTube video transcripts/subtitles and cover images by URL or video ID."
},
"en-US": {
"shortDesc": "Downloads YouTube video transcripts/subtitles and cover images by URL or video ID."
}
}
}
]
}