upload-to-fin-skills
SKILL.md
上传技能到 Fin-Skills 平台
支持** Git 形式**(仅注册 repoUrl + 元数据)和本地 zip 上传两种方式。先判断用户输入再选流程。
判断:若用户输入中包含 npx skills add 且紧跟一个 URL 和 --skill <名称>,则按**方式一(Git 形式)解析并上传;否则按方式二(本地 zip)**处理。
方式一:Git 形式(用户提供安装命令)
当用户提供的是安装命令(例如 npx skills add https://github.com/vercel-labs/skills --skill find-skills)时,走本流程,不打包、不传文件。
第 1 步:解析安装命令
从用户输入中解析出 repoUrl 和 skillName。命令格式一般为:
npx skills add <repoUrl> --skill <skillName>
解析方式:
- 用正则提取:
npx\s+skills\s+add\s+(https?://[^\s]+)\s+--skill\s+(\S+),第 1 组为repoUrl,第 2 组为skillName。 - 或按顺序找:
add后第一个以http开头的 token 为 repoUrl;--skill后第一个非空 token 为 skillName(到空格或行尾)。
示例:
- 输入:
npx skills add https://github.com/vercel-labs/skills --skill find-skills - 得到:repoUrl =
https://github.com/vercel-labs/skills,skillName =find-skills
若解析失败(缺少 URL 或 skill 名),向用户确认或请其补全命令。
第 2 步:获取 description(可选)
- 优先:从 GitHub raw 拉取 SKILL.md 的 frontmatter 作为 description。URL 规则:先试
https://raw.githubusercontent.com/<owner>/<repo>/main/<skillName>/SKILL.md,404 再试.../main/skills/<skillName>/SKILL.md或master分支。 - 若拉取不到或用户已提供描述,则用用户提供的 description,或简短填写如「来自 的 技能」。
从 frontmatter 可同时得到 name(与 skillName 一致或取 frontmatter 的 name)。
第 3 步:确认/补全元数据
与用户确认或补全:
| 字段 | 必填 | 默认/说明 |
|---|---|---|
| name | 是 | 解析得到的 skillName |
| description | 是 | 上步拉取或用户提供 |
| author | 是 | 可从 repo 的 owner 推断或询问,如 vercel-labs |
| category | 否 | utility |
| tags | 否 | 空 |
第 4 步:调用上传 API(不传文件)
curl -s -X POST "http://whatis.vip:9011/api/skills/upload" \
-F "name=<skillName>" \
-F "description=<description>" \
-F "author=<author>" \
-F "category=<category>" \
-F "tags=<tags>" \
-F "version=1.0.0" \
-F "supportedAgents=cursor" \
-F "repoUrl=<repoUrl>"
不传 skillFile。平台会存储 repoUrl,详情页从 Git 拉取 SKILL.md 展示。
第 5 步:验证与输出
- 响应 HTTP 201 且返回 JSON 中含
repoUrl即成功。 - 平台为 Git 技能分配的 id 为 owner/repo/skill-name(多层级),例如:
npx skills add https://github.com/obra/superpowers --skill test-driven-development→ idobra/superpowers/test-driven-developmentnpx skills add https://github.com/vercel-labs/skills --skill find-skills→ idvercel-labs/skills/find-skills
- 告知用户:已在 fin-skills 登记为 Git 技能,详情页会从仓库拉取内容;安装命令即用户提供的命令(或
npx skills add <repoUrl> --skill <skillName>)。
方式二:本地 zip 上传
用户提供的是本地 skill 路径或名称(如 ~/.cursor/skills/my-skill 或 my-skill)时,走本流程。
第 1 步:定位并读取 SKILL.md
根据用户提供的路径或名称,找到 SKILL.md 文件并读取内容。常见位置:
~/.cursor/skills/<skill-name>/SKILL.md(个人技能).cursor/skills/<skill-name>/SKILL.md(项目技能)
第 2 步:解析 SKILL.md frontmatter
从 YAML frontmatter 中提取 name 和 description。如果缺失则询问用户。
---
name: my-skill
description: 技能描述
---
第 3 步:确认上传信息
向用户确认以下字段(如 SKILL.md 中未包含则需询问):
| 字段 | 必填 | 默认值 | 说明 |
|---|---|---|---|
| name | 是 | frontmatter.name | 技能名称(小写字母+数字+连字符) |
| description | 是 | frontmatter.description | 技能描述 |
| author | 是 | 无 | 作者名称,优先使用 git config user.name |
| category | 否 | utility | 分类 |
| tags | 否 | 空 | 逗号分隔的标签 |
| version | 否 | 1.0.0 | 版本号 |
第 4 步:打包 skill 目录
将整个 skill 目录打包为 zip 文件:
cd <skill-parent-dir> && zip -r /tmp/<skill-name>.zip <skill-name>/
第 5 步:上传到平台
使用 curl 调用上传 API:
curl -X POST http://whatis.vip:9011/api/skills/upload \
-F "skillFile=@/tmp/<skill-name>.zip" \
-F "name=<name>" \
-F "description=<description>" \
-F "author=<author>" \
-F "category=<category>" \
-F "tags=<tags>" \
-F "version=<version>" \
-F "supportedAgents=cursor"
成功响应为 HTTP 201,返回 skill JSON 对象。
第 6 步:验证上传
curl -s http://whatis.vip:9011/.well-known/skills/index.json
确认新技能出现在列表中。
第 7 步:清理临时文件
rm -f /tmp/<skill-name>.zip
第 8 步:输出安装命令
上传成功后,告知用户安装命令:
npx skills add http://whatis.vip:9011 --skill <skill-name>
注意事项
- Git 形式:不传
skillFile,只传repoUrl与元数据;平台详情页会从 Git 仓库拉取 SKILL.md 展示。 - 本地上传:如果同名技能已存在,上传会覆盖旧版本;zip 包中必须包含
SKILL.md;文件大小限制 50MB。 - author 在 Git 形式下可从 repo 的 owner 推断,本地上传可通过
git config user.name自动获取。
Weekly Installs
5
Source
http://whatis.vip:9011First Seen
11 days ago
Installed on
amp5
cline5
opencode5
cursor5
kimi-cli5
codex5