feat(market): 为外部技能补充图标 (#50)

## Summary / 摘要

Add inline SVG icons to all 20 external pointer skills, so their cards
no longer fall back to an empty icon. The market catalog version is
bumped from `1.2.8` to `1.2.9`.

为全部 20 个外部 pointer skill 补齐内联 SVG 图标,市场卡片不再显示为空;市场版本由 `1.2.8` 升至
`1.2.9`。

## Compatibility / 兼容性

Depends on desirecore/desirecore#1177, which permits the `icon` field in
strict pointer-entry validation and forwards it through the offline
list/detail responses. That PR must merge first.

## Skill → icon screenshot / Skill 与图标截图

The preview labels every card with its display name and id.

![External skill icon
preview](https://raw.githubusercontent.com/desirecore/market/feat/external-skill-icons/docs/assets/external-skill-icons-v1.2.9.svg)

Covered skills: `agent-reach`, `ai-news-radar`, `amap-jsapi-skill`,
`dingtalk-api`, `flyai-skill`, `follow-builders`,
`ian-xiaohei-illustrations`, `karpathy-guidelines`, `khazix-skills`,
`larksuite-cli`, `last30days`, `luckin-my-coffee`, `mattpocock-skills`,
`minimax-image-gen`, `minimax-tts`, `mt-paotui-for-client`,
`netease-skills`, `taste-skill`, `wechatpay-skills`, and `wecom-cli`.

## Validation / 验证

- `uv run scripts/i18n/validate-i18n.py`
- `uv run scripts/i18n/translate.py --check`
- Parsed all 20 `entry.json` icons as SVG XML
- `git diff --check`
- Rendered the committed preview asset locally
This commit is contained in:
2026-07-16 19:59:41 +08:00
committed by GitHub
parent 73c94ab70e
commit 0ecc29c7ce
24 changed files with 164 additions and 4 deletions

View File

@@ -101,6 +101,7 @@ External entries point to upstream packages or repositories. They are counted in
"id": "example-skill",
"name": "Example Skill",
"category": "development",
"icon": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\">...</svg>",
"tags": ["example"],
"maintainer": {
"name": "Example",

View File

@@ -0,0 +1,125 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="802" viewBox="0 0 1200 802">
<rect width="1200" height="802" fill="#F8FAFC"/>
<text x="20" y="33" fill="#0F172A" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="22" font-weight="700">External skill icon preview</text>
<text x="20" y="58" fill="#475569" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="14">20 pointer entries · DesireCore Market v1.2.9</text>
<rect x="20" y="82" width="276" height="124" rx="16" fill="white" stroke="#E2E8F0"/>
<rect x="36" y="104" width="72" height="72" rx="18" fill="#2563EB"/>
<g transform="translate(51 119) scale(1.75)"><circle cx="12" cy="12" r="7" stroke="#FFFFFF" stroke-width="1.7"/><path d="M12 5V3m0 18v-2m7-7h2M3 12h2m11.9-4.9 1.4-1.4M5.7 18.3l1.4-1.4m9.8 1.4-1.4-1.4M5.7 5.7l1.4 1.4" stroke="#FFFFFF" stroke-width="1.7" stroke-linecap="round"/><circle cx="12" cy="12" r="2" fill="#FFFFFF"/></g>
<text x="124" y="130" fill="#0F172A" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="15" font-weight="700">Agent Reach</text>
<text x="124" y="155" fill="#475569" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="12">agent-reach</text>
<text x="124" y="178" fill="#2563EB" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="12">research</text>
<rect x="312" y="82" width="276" height="124" rx="16" fill="white" stroke="#E2E8F0"/>
<rect x="328" y="104" width="72" height="72" rx="18" fill="#7C3AED"/>
<g transform="translate(343 119) scale(1.75)"><rect x="4" y="4" width="16" height="16" rx="2" stroke="#FFFFFF" stroke-width="1.7"/><path d="M8 8h5m-5 4h8m-8 4h5" stroke="#FFFFFF" stroke-width="1.7" stroke-linecap="round"/><circle cx="17" cy="8" r="1.5" fill="#FFFFFF"/></g>
<text x="416" y="130" fill="#0F172A" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="15" font-weight="700">AI News Radar</text>
<text x="416" y="155" fill="#475569" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="12">ai-news-radar</text>
<text x="416" y="178" fill="#7C3AED" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="12">productivity</text>
<rect x="604" y="82" width="276" height="124" rx="16" fill="white" stroke="#E2E8F0"/>
<rect x="620" y="104" width="72" height="72" rx="18" fill="#0F766E"/>
<g transform="translate(635 119) scale(1.75)"><path d="m4 6 5-2 6 2 5-2v14l-5 2-6-2-5 2V6Z" stroke="#FFFFFF" stroke-width="1.7" stroke-linejoin="round"/><path d="M9 4v14m6-12v14" stroke="#FFFFFF" stroke-width="1.7"/><path d="M12 8.25c-1.24 0-2.25.9-2.25 2.03 0 1.52 2.25 3.47 2.25 3.47s2.25-1.95 2.25-3.47C14.25 9.15 13.24 8.25 12 8.25Z" fill="#FFFFFF"/></g>
<text x="708" y="130" fill="#0F172A" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="15" font-weight="700">AMap JSAPI Skill</text>
<text x="708" y="155" fill="#475569" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="12">amap-jsapi-skill</text>
<text x="708" y="178" fill="#0F766E" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="12">development</text>
<rect x="896" y="82" width="276" height="124" rx="16" fill="white" stroke="#E2E8F0"/>
<rect x="912" y="104" width="72" height="72" rx="18" fill="#0891B2"/>
<g transform="translate(927 119) scale(1.75)"><path d="M5 6.5A2.5 2.5 0 0 1 7.5 4h9A2.5 2.5 0 0 1 19 6.5v5A2.5 2.5 0 0 1 16.5 14H12l-3.5 3v-3h-1A2.5 2.5 0 0 1 5 11.5v-5Z" stroke="#FFFFFF" stroke-width="1.7" stroke-linejoin="round"/><path d="M8.5 9h7" stroke="#FFFFFF" stroke-width="1.7" stroke-linecap="round"/></g>
<text x="1000" y="130" fill="#0F172A" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="15" font-weight="700">DingTalk API Skill</text>
<text x="1000" y="155" fill="#475569" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="12">dingtalk-api</text>
<text x="1000" y="178" fill="#0891B2" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="12">communication</text>
<rect x="20" y="222" width="276" height="124" rx="16" fill="white" stroke="#E2E8F0"/>
<rect x="36" y="244" width="72" height="72" rx="18" fill="#7C3AED"/>
<g transform="translate(51 259) scale(1.75)"><path d="m4 12 15-7-5 14-3.5-5.5L4 12Z" stroke="#FFFFFF" stroke-width="1.7" stroke-linejoin="round"/><path d="m10.5 13.5 3-3" stroke="#FFFFFF" stroke-width="1.7" stroke-linecap="round"/></g>
<text x="124" y="270" fill="#0F172A" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="15" font-weight="700">FlyAI</text>
<text x="124" y="295" fill="#475569" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="12">flyai-skill</text>
<text x="124" y="318" fill="#7C3AED" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="12">productivity</text>
<rect x="312" y="222" width="276" height="124" rx="16" fill="white" stroke="#E2E8F0"/>
<rect x="328" y="244" width="72" height="72" rx="18" fill="#7C3AED"/>
<g transform="translate(343 259) scale(1.75)"><circle cx="9" cy="8" r="3" stroke="#FFFFFF" stroke-width="1.7"/><path d="M3.5 19c.7-3 2.6-4.5 5.5-4.5s4.8 1.5 5.5 4.5" stroke="#FFFFFF" stroke-width="1.7" stroke-linecap="round"/><path d="M16 9h4m-2-2v4" stroke="#FFFFFF" stroke-width="1.7" stroke-linecap="round"/></g>
<text x="416" y="270" fill="#0F172A" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="15" font-weight="700">Follow Builders</text>
<text x="416" y="295" fill="#475569" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="12">follow-builders</text>
<text x="416" y="318" fill="#7C3AED" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="12">productivity</text>
<rect x="604" y="222" width="276" height="124" rx="16" fill="white" stroke="#E2E8F0"/>
<rect x="620" y="244" width="72" height="72" rx="18" fill="#DB2777"/>
<g transform="translate(635 259) scale(1.75)"><rect x="4" y="4" width="16" height="16" rx="3" stroke="#FFFFFF" stroke-width="1.7"/><path d="m6.5 16 3.5-3.5 2.5 2.5 2-2 3 3" stroke="#FFFFFF" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"/><circle cx="15.5" cy="8.5" r="1.5" fill="#FFFFFF"/></g>
<text x="708" y="270" fill="#0F172A" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="15" font-weight="700">Ian 小黑怪诞正文配图</text>
<text x="708" y="295" fill="#475569" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="12">ian-xiaohei-illustrations</text>
<text x="708" y="318" fill="#DB2777" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="12">media</text>
<rect x="896" y="222" width="276" height="124" rx="16" fill="white" stroke="#E2E8F0"/>
<rect x="912" y="244" width="72" height="72" rx="18" fill="#0F766E"/>
<g transform="translate(927 259) scale(1.75)"><path d="M8.5 5 5 12l3.5 7M15.5 5l3.5 7-3.5 7" stroke="#FFFFFF" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"/><path d="m10 15 2 2 3-4" stroke="#FFFFFF" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"/></g>
<text x="1000" y="270" fill="#0F172A" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="15" font-weight="700">Karpathy Guidelines</text>
<text x="1000" y="295" fill="#475569" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="12">karpathy-guidelines</text>
<text x="1000" y="318" fill="#0F766E" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="12">development</text>
<rect x="20" y="362" width="276" height="124" rx="16" fill="white" stroke="#E2E8F0"/>
<rect x="36" y="384" width="72" height="72" rx="18" fill="#7C3AED"/>
<g transform="translate(51 399) scale(1.75)"><circle cx="6" cy="12" r="2" fill="#FFFFFF"/><circle cx="18" cy="6" r="2" fill="#FFFFFF"/><circle cx="18" cy="18" r="2" fill="#FFFFFF"/><path d="m7.8 11.1 8.4-4.2M7.8 12.9l8.4 4.2" stroke="#FFFFFF" stroke-width="1.7" stroke-linecap="round"/></g>
<text x="124" y="410" fill="#0F172A" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="15" font-weight="700">卡兹克 Skills</text>
<text x="124" y="435" fill="#475569" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="12">khazix-skills</text>
<text x="124" y="458" fill="#7C3AED" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="12">productivity</text>
<rect x="312" y="362" width="276" height="124" rx="16" fill="white" stroke="#E2E8F0"/>
<rect x="328" y="384" width="72" height="72" rx="18" fill="#0891B2"/>
<g transform="translate(343 399) scale(1.75)"><rect x="4" y="5" width="16" height="14" rx="3" stroke="#FFFFFF" stroke-width="1.7"/><path d="M8 9h8M8 13h3m3 0h2" stroke="#FFFFFF" stroke-width="1.7" stroke-linecap="round"/><path d="m8 13 1.5 1.5L11 13" stroke="#FFFFFF" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></g>
<text x="416" y="410" fill="#0F172A" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="15" font-weight="700">Lark Suite CLI</text>
<text x="416" y="435" fill="#475569" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="12">larksuite-cli</text>
<text x="416" y="458" fill="#0891B2" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="12">communication</text>
<rect x="604" y="362" width="276" height="124" rx="16" fill="white" stroke="#E2E8F0"/>
<rect x="620" y="384" width="72" height="72" rx="18" fill="#2563EB"/>
<g transform="translate(635 399) scale(1.75)"><rect x="4" y="5" width="16" height="15" rx="2" stroke="#FFFFFF" stroke-width="1.7"/><path d="M8 3v4m8-4v4M4 9h16" stroke="#FFFFFF" stroke-width="1.7" stroke-linecap="round"/><path d="M12 12v3l2 1" stroke="#FFFFFF" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"/></g>
<text x="708" y="410" fill="#0F172A" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="15" font-weight="700">Last 30 Days</text>
<text x="708" y="435" fill="#475569" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="12">last30days</text>
<text x="708" y="458" fill="#2563EB" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="12">research</text>
<rect x="896" y="362" width="276" height="124" rx="16" fill="white" stroke="#E2E8F0"/>
<rect x="912" y="384" width="72" height="72" rx="18" fill="#D97706"/>
<g transform="translate(927 399) scale(1.75)"><path d="M6 8h10v8a4 4 0 0 1-4 4h-2a4 4 0 0 1-4-4V8Z" stroke="#FFFFFF" stroke-width="1.7" stroke-linejoin="round"/><path d="M16 10h1a2 2 0 0 1 0 4h-1M8 4c0 1 1 1 1 2m3-2c0 1 1 1 1 2" stroke="#FFFFFF" stroke-width="1.7" stroke-linecap="round"/></g>
<text x="1000" y="410" fill="#0F172A" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="15" font-weight="700">Luckin My Coffee</text>
<text x="1000" y="435" fill="#475569" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="12">luckin-my-coffee</text>
<text x="1000" y="458" fill="#D97706" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="12">business</text>
<rect x="20" y="502" width="276" height="124" rx="16" fill="white" stroke="#E2E8F0"/>
<rect x="36" y="524" width="72" height="72" rx="18" fill="#0F766E"/>
<g transform="translate(51 539) scale(1.75)"><path d="M9 4h6m-5 0v5l-4 7a3 3 0 0 0 2.6 4h6.8a3 3 0 0 0 2.6-4l-4-7V4" stroke="#FFFFFF" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"/><path d="M8.5 16h7" stroke="#FFFFFF" stroke-width="1.7" stroke-linecap="round"/></g>
<text x="124" y="550" fill="#0F172A" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="15" font-weight="700">Matt Pocock Skills</text>
<text x="124" y="575" fill="#475569" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="12">mattpocock-skills</text>
<text x="124" y="598" fill="#0F766E" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="12">development</text>
<rect x="312" y="502" width="276" height="124" rx="16" fill="white" stroke="#E2E8F0"/>
<rect x="328" y="524" width="72" height="72" rx="18" fill="#DB2777"/>
<g transform="translate(343 539) scale(1.75)"><rect x="4" y="4" width="16" height="16" rx="3" stroke="#FFFFFF" stroke-width="1.7"/><path d="m6.5 17 4-4 2.5 2.5 1.5-1.5 3 3" stroke="#FFFFFF" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"/><circle cx="15.5" cy="8.5" r="1.5" fill="#FFFFFF"/></g>
<text x="416" y="550" fill="#0F172A" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="15" font-weight="700">MiniMax 图像生成</text>
<text x="416" y="575" fill="#475569" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="12">minimax-image-gen</text>
<text x="416" y="598" fill="#DB2777" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="12">media</text>
<rect x="604" y="502" width="276" height="124" rx="16" fill="white" stroke="#E2E8F0"/>
<rect x="620" y="524" width="72" height="72" rx="18" fill="#DB2777"/>
<g transform="translate(635 539) scale(1.75)"><rect x="9" y="4" width="6" height="10" rx="3" stroke="#FFFFFF" stroke-width="1.7"/><path d="M6.5 11a5.5 5.5 0 0 0 11 0M12 16.5V20m-3 0h6" stroke="#FFFFFF" stroke-width="1.7" stroke-linecap="round"/></g>
<text x="708" y="550" fill="#0F172A" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="15" font-weight="700">MiniMax 语音合成</text>
<text x="708" y="575" fill="#475569" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="12">minimax-tts</text>
<text x="708" y="598" fill="#DB2777" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="12">media</text>
<rect x="896" y="502" width="276" height="124" rx="16" fill="white" stroke="#E2E8F0"/>
<rect x="912" y="524" width="72" height="72" rx="18" fill="#D97706"/>
<g transform="translate(927 539) scale(1.75)"><path d="M4 7h10v9H4zM14 10h3l3 3v3h-6z" stroke="#FFFFFF" stroke-width="1.7" stroke-linejoin="round"/><circle cx="8" cy="18" r="1.5" fill="#FFFFFF"/><circle cx="17" cy="18" r="1.5" fill="#FFFFFF"/></g>
<text x="1000" y="550" fill="#0F172A" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="15" font-weight="700">Meituan Paotui Client</text>
<text x="1000" y="575" fill="#475569" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="12">mt-paotui-for-client</text>
<text x="1000" y="598" fill="#D97706" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="12">business</text>
<rect x="20" y="642" width="276" height="124" rx="16" fill="white" stroke="#E2E8F0"/>
<rect x="36" y="664" width="72" height="72" rx="18" fill="#7C3AED"/>
<g transform="translate(51 679) scale(1.75)"><path d="M7 17h10a3.5 3.5 0 0 0 .5-6.96A5.5 5.5 0 0 0 7.1 8.7 4.2 4.2 0 0 0 7 17Z" stroke="#FFFFFF" stroke-width="1.7" stroke-linejoin="round"/><path d="m10 14 2-2 2 2" stroke="#FFFFFF" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"/></g>
<text x="124" y="690" fill="#0F172A" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="15" font-weight="700">NetEase Skills</text>
<text x="124" y="715" fill="#475569" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="12">netease-skills</text>
<text x="124" y="738" fill="#7C3AED" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="12">productivity</text>
<rect x="312" y="642" width="276" height="124" rx="16" fill="white" stroke="#E2E8F0"/>
<rect x="328" y="664" width="72" height="72" rx="18" fill="#C026D3"/>
<g transform="translate(343 679) scale(1.75)"><path d="m12 3 .9 3.1L16 7l-3.1.9L12 11l-.9-3.1L8 7l3.1-.9L12 3Zm5 9 .7 2.3L20 15l-2.3.7L17 18l-.7-2.3L14 15l2.3-.7L17 12ZM7 13l.8 2.7L10.5 17l-2.7.8L7 20.5l-.8-2.7L3.5 17l2.7-1.3L7 13Z" stroke="#FFFFFF" stroke-width="1.5" stroke-linejoin="round"/></g>
<text x="416" y="690" fill="#0F172A" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="15" font-weight="700">Taste Skill</text>
<text x="416" y="715" fill="#475569" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="12">taste-skill</text>
<text x="416" y="738" fill="#C026D3" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="12">creative</text>
<rect x="604" y="642" width="276" height="124" rx="16" fill="white" stroke="#E2E8F0"/>
<rect x="620" y="664" width="72" height="72" rx="18" fill="#D97706"/>
<g transform="translate(635 679) scale(1.75)"><rect x="4" y="6" width="16" height="12" rx="2" stroke="#FFFFFF" stroke-width="1.7"/><path d="M4 10h16m-8 4h4" stroke="#FFFFFF" stroke-width="1.7" stroke-linecap="round"/><circle cx="8" cy="14" r="1.5" fill="#FFFFFF"/></g>
<text x="708" y="690" fill="#0F172A" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="15" font-weight="700">WeChat Pay Skills</text>
<text x="708" y="715" fill="#475569" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="12">wechatpay-skills</text>
<text x="708" y="738" fill="#D97706" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="12">business</text>
<rect x="896" y="642" width="276" height="124" rx="16" fill="white" stroke="#E2E8F0"/>
<rect x="912" y="664" width="72" height="72" rx="18" fill="#0891B2"/>
<g transform="translate(927 679) scale(1.75)"><rect x="4" y="5" width="16" height="14" rx="3" stroke="#FFFFFF" stroke-width="1.7"/><path d="m8 10 2 2-2 2m4 0h4" stroke="#FFFFFF" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"/></g>
<text x="1000" y="690" fill="#0F172A" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="15" font-weight="700">WeCom CLI</text>
<text x="1000" y="715" fill="#475569" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="12">wecom-cli</text>
<text x="1000" y="738" fill="#0891B2" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="12">communication</text>
</svg>

After

Width:  |  Height:  |  Size: 18 KiB

View File

@@ -1,6 +1,6 @@
{
"name": "DesireCore Official Market",
"version": "1.2.8",
"version": "1.2.9",
"schemaVersion": "1.1.0",
"supportedLocales": ["zh-CN", "en-US"],
"defaultLocale": "en-US",
@@ -28,7 +28,7 @@
"stats": {
"totalAgents": 1,
"totalSkills": 50,
"lastUpdated": "2026-07-11"
"lastUpdated": "2026-07-16"
},
"features": [
"curated-index",

View File

@@ -17,7 +17,7 @@ Checks:
8. Top-level description is 1-1024 chars (spec); top-level name is 1-64 chars (spec).
9. Skill/Agent counts and builtin skill index match the repository contents.
10. Skill, Agent, and entry.json category references exist in categories.json.
11. entry.json pointers have the required marketplace fields and safe source URLs.
11. entry.json pointers have the required marketplace fields, valid inline SVG icons, and safe source URLs.
12. Market Skills set `disable-model-invocation` to true or omit it; false is prohibited.
Exit codes:
@@ -38,6 +38,7 @@ import json
import re
import ssl
import sys
from xml.etree import ElementTree
from dataclasses import dataclass, field
from pathlib import Path
from typing import Any, Iterable
@@ -389,7 +390,7 @@ def validate_entry_json(report: Report, entry_file: Path, category_ids: set[str]
if not entry:
return
required = ("id", "name", "category", "maintainer", "stewardship", "license", "redistribution", "source")
required = ("id", "name", "category", "icon", "maintainer", "stewardship", "license", "redistribution", "source")
for key in required:
if key not in entry:
report.add(Issue(rel, "entry-json", f"missing required field '{key}'"))
@@ -401,6 +402,19 @@ def validate_entry_json(report: Report, entry_file: Path, category_ids: set[str]
if not isinstance(category, str) or category not in category_ids:
report.add(Issue(rel, "entry-json", f"category '{category}' is not declared in categories.json"))
icon = entry.get("icon")
if not isinstance(icon, str) or not icon.strip():
report.add(Issue(rel, "entry-json", "icon must be a non-empty inline SVG string"))
else:
try:
root = ElementTree.fromstring(icon)
if root.tag != "{http://www.w3.org/2000/svg}svg":
report.add(Issue(rel, "entry-json", "icon root element must be svg in the SVG namespace"))
elif not root.get("viewBox"):
report.add(Issue(rel, "entry-json", "icon SVG must declare a viewBox"))
except ElementTree.ParseError as exc:
report.add(Issue(rel, "entry-json", f"icon must be valid SVG XML: {exc}"))
maintainer = entry.get("maintainer")
if not isinstance(maintainer, dict) or not isinstance(maintainer.get("name"), str):
report.add(Issue(rel, "entry-json", "maintainer.name is required"))

View File

@@ -2,6 +2,7 @@
"id": "agent-reach",
"name": "Agent Reach",
"category": "research",
"icon": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"><circle cx=\"12\" cy=\"12\" r=\"7\" stroke=\"#2563EB\" stroke-width=\"1.7\"/><path d=\"M12 5V3m0 18v-2m7-7h2M3 12h2m11.9-4.9 1.4-1.4M5.7 18.3l1.4-1.4m9.8 1.4-1.4-1.4M5.7 5.7l1.4 1.4\" stroke=\"#2563EB\" stroke-width=\"1.7\" stroke-linecap=\"round\"/><circle cx=\"12\" cy=\"12\" r=\"2\" fill=\"#2563EB\"/></svg>",
"tags": ["research", "web-search", "social-media", "twitter", "reddit", "youtube", "bilibili", "xiaohongshu"],
"maintainer": {
"name": "Panniantong",

View File

@@ -2,6 +2,7 @@
"id": "ai-news-radar",
"name": "AI News Radar",
"category": "productivity",
"icon": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"><rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"2\" stroke=\"#2563EB\" stroke-width=\"1.7\"/><path d=\"M8 8h5m-5 4h8m-8 4h5\" stroke=\"#2563EB\" stroke-width=\"1.7\" stroke-linecap=\"round\"/><circle cx=\"17\" cy=\"8\" r=\"1.5\" fill=\"#2563EB\"/></svg>",
"tags": [
"ai-news",
"rss",

View File

@@ -2,6 +2,7 @@
"id": "amap-jsapi-skill",
"name": "AMap JSAPI Skill",
"category": "development",
"icon": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"m4 6 5-2 6 2 5-2v14l-5 2-6-2-5 2V6Z\" stroke=\"#2563EB\" stroke-width=\"1.7\" stroke-linejoin=\"round\"/><path d=\"M9 4v14m6-12v14\" stroke=\"#2563EB\" stroke-width=\"1.7\"/><path d=\"M12 8.25c-1.24 0-2.25.9-2.25 2.03 0 1.52 2.25 3.47 2.25 3.47s2.25-1.95 2.25-3.47C14.25 9.15 13.24 8.25 12 8.25Z\" fill=\"#2563EB\"/></svg>",
"tags": [
"lbs-amap"
],

View File

@@ -2,6 +2,7 @@
"id": "dingtalk-api",
"name": "DingTalk API Skill",
"category": "communication",
"icon": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M5 6.5A2.5 2.5 0 0 1 7.5 4h9A2.5 2.5 0 0 1 19 6.5v5A2.5 2.5 0 0 1 16.5 14H12l-3.5 3v-3h-1A2.5 2.5 0 0 1 5 11.5v-5Z\" stroke=\"#2563EB\" stroke-width=\"1.7\" stroke-linejoin=\"round\"/><path d=\"M8.5 9h7\" stroke=\"#2563EB\" stroke-width=\"1.7\" stroke-linecap=\"round\"/></svg>",
"tags": [
"ogenes"
],

View File

@@ -2,6 +2,7 @@
"id": "flyai-skill",
"name": "FlyAI",
"category": "productivity",
"icon": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"m4 12 15-7-5 14-3.5-5.5L4 12Z\" stroke=\"#2563EB\" stroke-width=\"1.7\" stroke-linejoin=\"round\"/><path d=\"m10.5 13.5 3-3\" stroke=\"#2563EB\" stroke-width=\"1.7\" stroke-linecap=\"round\"/></svg>",
"tags": [
"alibaba-flyai"
],

View File

@@ -2,6 +2,7 @@
"id": "follow-builders",
"name": "Follow Builders",
"category": "productivity",
"icon": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"><circle cx=\"9\" cy=\"8\" r=\"3\" stroke=\"#2563EB\" stroke-width=\"1.7\"/><path d=\"M3.5 19c.7-3 2.6-4.5 5.5-4.5s4.8 1.5 5.5 4.5\" stroke=\"#2563EB\" stroke-width=\"1.7\" stroke-linecap=\"round\"/><path d=\"M16 9h4m-2-2v4\" stroke=\"#2563EB\" stroke-width=\"1.7\" stroke-linecap=\"round\"/></svg>",
"tags": [
"zarazhangrui"
],

View File

@@ -2,6 +2,7 @@
"id": "ian-xiaohei-illustrations",
"name": "Ian 小黑怪诞正文配图",
"category": "media",
"icon": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"><rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"3\" stroke=\"#2563EB\" stroke-width=\"1.7\"/><path d=\"m6.5 16 3.5-3.5 2.5 2.5 2-2 3 3\" stroke=\"#2563EB\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><circle cx=\"15.5\" cy=\"8.5\" r=\"1.5\" fill=\"#2563EB\"/></svg>",
"tags": ["illustration", "image-generation", "xiaohei", "design"],
"maintainer": {
"name": "helloianneo",

View File

@@ -2,6 +2,7 @@
"id": "karpathy-guidelines",
"name": "Karpathy Guidelines",
"category": "development",
"icon": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M8.5 5 5 12l3.5 7M15.5 5l3.5 7-3.5 7\" stroke=\"#2563EB\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"m10 15 2 2 3-4\" stroke=\"#2563EB\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>",
"tags": [
"guidelines",
"best-practices",

View File

@@ -2,6 +2,7 @@
"id": "khazix-skills",
"name": "卡兹克 Skills",
"category": "productivity",
"icon": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"><circle cx=\"6\" cy=\"12\" r=\"2\" fill=\"#2563EB\"/><circle cx=\"18\" cy=\"6\" r=\"2\" fill=\"#2563EB\"/><circle cx=\"18\" cy=\"18\" r=\"2\" fill=\"#2563EB\"/><path d=\"m7.8 11.1 8.4-4.2M7.8 12.9l8.4 4.2\" stroke=\"#2563EB\" stroke-width=\"1.7\" stroke-linecap=\"round\"/></svg>",
"tags": ["khazix", "ai-news", "writing", "analysis"],
"maintainer": {
"name": "KKKKhazix",

View File

@@ -2,6 +2,7 @@
"id": "larksuite-cli",
"name": "Lark Suite CLI",
"category": "communication",
"icon": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"><rect x=\"4\" y=\"5\" width=\"16\" height=\"14\" rx=\"3\" stroke=\"#2563EB\" stroke-width=\"1.7\"/><path d=\"M8 9h8M8 13h3m3 0h2\" stroke=\"#2563EB\" stroke-width=\"1.7\" stroke-linecap=\"round\"/><path d=\"m8 13 1.5 1.5L11 13\" stroke=\"#2563EB\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>",
"tags": [
"larksuite"
],

View File

@@ -2,6 +2,7 @@
"id": "last30days",
"name": "Last 30 Days",
"category": "research",
"icon": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"><rect x=\"4\" y=\"5\" width=\"16\" height=\"15\" rx=\"2\" stroke=\"#2563EB\" stroke-width=\"1.7\"/><path d=\"M8 3v4m8-4v4M4 9h16\" stroke=\"#2563EB\" stroke-width=\"1.7\" stroke-linecap=\"round\"/><path d=\"M12 12v3l2 1\" stroke=\"#2563EB\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>",
"tags": [
"research",
"trends",

View File

@@ -2,6 +2,7 @@
"id": "luckin-my-coffee",
"name": "Luckin My Coffee",
"category": "business",
"icon": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 8h10v8a4 4 0 0 1-4 4h-2a4 4 0 0 1-4-4V8Z\" stroke=\"#2563EB\" stroke-width=\"1.7\" stroke-linejoin=\"round\"/><path d=\"M16 10h1a2 2 0 0 1 0 4h-1M8 4c0 1 1 1 1 2m3-2c0 1 1 1 1 2\" stroke=\"#2563EB\" stroke-width=\"1.7\" stroke-linecap=\"round\"/></svg>",
"tags": [
"luckin"
],

View File

@@ -2,6 +2,7 @@
"id": "mattpocock-skills",
"name": "Matt Pocock Skills",
"category": "development",
"icon": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M9 4h6m-5 0v5l-4 7a3 3 0 0 0 2.6 4h6.8a3 3 0 0 0 2.6-4l-4-7V4\" stroke=\"#2563EB\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M8.5 16h7\" stroke=\"#2563EB\" stroke-width=\"1.7\" stroke-linecap=\"round\"/></svg>",
"tags": [
"engineering",
"tdd",

View File

@@ -2,6 +2,7 @@
"id": "minimax-image-gen",
"name": "MiniMax 图像生成",
"category": "media",
"icon": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"><rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"3\" stroke=\"#2563EB\" stroke-width=\"1.7\"/><path d=\"m6.5 17 4-4 2.5 2.5 1.5-1.5 3 3\" stroke=\"#2563EB\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><circle cx=\"15.5\" cy=\"8.5\" r=\"1.5\" fill=\"#2563EB\"/></svg>",
"tags": [
"minimax",
"media"

View File

@@ -2,6 +2,7 @@
"id": "minimax-tts",
"name": "MiniMax 语音合成",
"category": "media",
"icon": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"><rect x=\"9\" y=\"4\" width=\"6\" height=\"10\" rx=\"3\" stroke=\"#2563EB\" stroke-width=\"1.7\"/><path d=\"M6.5 11a5.5 5.5 0 0 0 11 0M12 16.5V20m-3 0h6\" stroke=\"#2563EB\" stroke-width=\"1.7\" stroke-linecap=\"round\"/></svg>",
"tags": [
"minimax",
"media"

View File

@@ -2,6 +2,7 @@
"id": "mt-paotui-for-client",
"name": "Meituan Paotui Client",
"category": "business",
"icon": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M4 7h10v9H4zM14 10h3l3 3v3h-6z\" stroke=\"#2563EB\" stroke-width=\"1.7\" stroke-linejoin=\"round\"/><circle cx=\"8\" cy=\"18\" r=\"1.5\" fill=\"#2563EB\"/><circle cx=\"17\" cy=\"18\" r=\"1.5\" fill=\"#2563EB\"/></svg>",
"tags": [
"meituan"
],

View File

@@ -2,6 +2,7 @@
"id": "netease-skills",
"name": "NetEase Skills",
"category": "productivity",
"icon": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M7 17h10a3.5 3.5 0 0 0 .5-6.96A5.5 5.5 0 0 0 7.1 8.7 4.2 4.2 0 0 0 7 17Z\" stroke=\"#2563EB\" stroke-width=\"1.7\" stroke-linejoin=\"round\"/><path d=\"m10 14 2-2 2 2\" stroke=\"#2563EB\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>",
"tags": [
"NetEase"
],

View File

@@ -2,6 +2,7 @@
"id": "taste-skill",
"name": "Taste Skill",
"category": "creative",
"icon": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"m12 3 .9 3.1L16 7l-3.1.9L12 11l-.9-3.1L8 7l3.1-.9L12 3Zm5 9 .7 2.3L20 15l-2.3.7L17 18l-.7-2.3L14 15l2.3-.7L17 12ZM7 13l.8 2.7L10.5 17l-2.7.8L7 20.5l-.8-2.7L3.5 17l2.7-1.3L7 13Z\" stroke=\"#2563EB\" stroke-width=\"1.5\" stroke-linejoin=\"round\"/></svg>",
"tags": [
"taste",
"design",

View File

@@ -2,6 +2,7 @@
"id": "wechatpay-skills",
"name": "WeChat Pay Skills",
"category": "business",
"icon": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"><rect x=\"4\" y=\"6\" width=\"16\" height=\"12\" rx=\"2\" stroke=\"#2563EB\" stroke-width=\"1.7\"/><path d=\"M4 10h16m-8 4h4\" stroke=\"#2563EB\" stroke-width=\"1.7\" stroke-linecap=\"round\"/><circle cx=\"8\" cy=\"14\" r=\"1.5\" fill=\"#2563EB\"/></svg>",
"tags": [
"wechatpay-apiv3"
],

View File

@@ -2,6 +2,7 @@
"id": "wecom-cli",
"name": "WeCom CLI",
"category": "communication",
"icon": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"><rect x=\"4\" y=\"5\" width=\"16\" height=\"14\" rx=\"3\" stroke=\"#2563EB\" stroke-width=\"1.7\"/><path d=\"m8 10 2 2-2 2m4 0h4\" stroke=\"#2563EB\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>",
"tags": [
"WecomTeam"
],