Skip to main content
ClaudeWave
Skill1.6k repo starsupdated 2d ago

package-author

当用户要把手头的工具打包/标准化成 pinvou 插件包时使用——包括纯技能(SKILL.md)、纯 MCP 服务或它们的组合包。用户说"打包/做成插件包/标准化这个工具/给我一个能上传的标准包/写 plugin.json/加个图标"等,或给了散乱脚本/目录要整理成可上传 zip 时,用本技能把内容规范成 plugin-protocol 标准包(补 plugin.json、补 mcp/manifest.json、补 SKILL.md、补图标、校验命名)。

Install in Claude Code
Copy
git clone --depth 1 https://github.com/Pinvou/pinvou-agent /tmp/package-author && cp -r /tmp/package-author/pinvou3-app/src-tauri/resources/common/skill-marketplace/package-author ~/.claude/skills/package-author
Then start a new Claude Code session; the skill loads automatically.

SKILL.md

# 插件包标准化(package-author)

把用户给的工具/技能/脚本,整理成 pinvou 应用商店可导入的**标准插件包**。规范以
`docs/plugin-package-spec.md` 为准,本文件内置完整规则,可直接照做、不依赖文档可达。

## 何时用 / 何时不用
- ✅ 用:用户要打包/标准化一个工具,给了文件/目录/脚本/SKILL.md/manifest.json/zip,或口头描述要一个插件包。
- ❌ 不用:用户只是"写个脚本"/"写个技能内容"而没说要打包;或是在装/卸载/开关某个已存在的工具。

## 先弄清三件事(问清再动手,别猜)
1. **输入在哪**:用户给的是目录路径、粘贴的代码、还是 zip?文件类型是什么?
2. **包类型**:纯技能?纯 MCP?还是 MCP+技能组合?(见 §类型判定)
3. **输出形态**:要一个**目录**(可直接 zip),还是直接产出 **zip**?

若用户没给 id/名称,按内容起一个语义化小写 id(如 `weather-insight`),并告诉用户可改。

---

## 类型判定(决定布局)

| 用户给的东西 | 类型 | 标准布局 |
|---|---|---|
| 只有 SKILL.md 或技能目录 | 纯技能 Skill | `skills/<name>/SKILL.md` |
| 一个 MCP server(脚本 + 描述) | 纯 MCP Mcp | `mcp/manifest.json` + `mcp/server.py` |
| MCP + 配套使用引导技能 | 组合 Bundle | `mcp/` + `skills/<name>/` 同时存在 |

---

## 标准包结构(必须落成这样)

```
<id>/
├── plugin.json                 ← 权威声明(见下)
├── mcp/                        ← 纯 MCP / 组合包才有
│   ├── manifest.json
│   └── server.py
├── skills/<name>/              ← 纯技能 / 组合包才有
│   └── SKILL.md
└── icon.svg | icon.png         ← 图标(缺失则生成,见 §图标)
```

---

## plugin.json(schema v1)

```jsonc
{
  "manifest_version": 1,                // 必填,=1
  "id": "weather-insight",              // 必填,[a-z0-9-_]{1,64} 全小写
  "name": "天气洞察",                    // 必填,展示名
  "version": "1.0.0",                   // 可选
  "description": "聚合天气查询与解读",     // 可选
  "icon": "icon.svg",                   // 可选,相对根,icon.svg/icon.png
  "components": {                       // 多组件用
    "mcp_servers": [ { "id": "weather", "dir": "mcp" } ],
    "skills":      [ { "id": "weather-interpret", "dir": "skills/weather-interpret" } ]
  }
}
```

硬规则:
- `id` 全小写 `[a-z0-9-_]`,禁 `.`/`..`/路径分隔符;`name` 可任意可读文本。
- `components.mcp_servers[].dir` **写 `"mcp"`**(扁平单 server);skills 的 `dir` 写
  `"skills/<name>"`,且 `<name>` 必须等于该 SKILL.md frontmatter 的 `name`。
- 纯单组件可省略 `plugin.json`(导入走结构回退),但**标准化输出一律补上**(自描述)。
- 未知字段别乱加;当前只认 `components{mcp_servers,skills}`。

---

## MCP 组件:mcp/manifest.json

本地 stdio server(最常见):

```jsonc
{
  "id": "weather",              // [a-z0-9-_]{1,64},与 plugin.json 声明一致
  "name": "天气查询",
  "description": "查指定城市天气",
  "version": "1.0.0",
  "icon": "",                   // 空串即可(图标走包级 icon.*)
  "category": "life",           // 分组 slug:dev/office/life/data/search…
  "mcp_tools": [],              // 本地可为空:工具由 server 运行期 tools/list 声明
  "command": "python",          // 解释器:python / node …
  "args": ["server.py"]         // 入口脚本名(推荐就叫 server.py)
}
```

硬规则:
- 入口脚本**命名为 `server.py`**、`args: ["server.py"]`(安装时被重写为包内绝对路径)。
- 依赖 pip 包 → `"pip_dependencies": ["requests"]`。
- 密钥/Token **不写明文**:走 `config_fields`(`secret:true`)或 `secret_env`/`secret_headers`。
- 远程 HTTP/OAuth server:用 `servers:[{name,url,oauth?}]` 取代 `command`/`args`。

---

## 技能组件:SKILL.md

```markdown
---
name: weather-interpret        # [a-zA-Z0-9_-]{1,64}(可大小写)
description: 解读天气数据,用户要分析/解释天气结果时使用。  # 必填:做什么 + 何时用
---
# 正文:给模型看的指令
```

- 若用户给的技能缺 frontmatter 或缺 `description`,**补上**(description 是触发依据)。
- 子资料放 `references/`,正文只列目录。

---

## 图标

- 用户没给图标 → **生成一个 `icon.svg`**(简约扁平、单色几何图形,24×24 viewBox、
  `stroke="currentColor"`、无外链/无脚本),并在 `plugin.json` 写 `"icon": "icon.svg"`。
- 只认 `.svg` / `.png`。用户给了图就校验扩展名,不合规则转 SVG 或换名。
- 禁止外链图片、禁止脚本、禁止超长/畸形 SVG。

---

## 校验清单(交活前逐条过)

1. `plugin.json` 存在且 `manifest_version:1`、`id` 全小写合法。
2. 目录结构符合 §标准包结构;声明了 `components` 的 `dir` 都在包内、skill 目录有 `SKILL.md`。
3. MCP:`mcp/manifest.json` 的 `id/name/description/version/icon/category/mcp_tools/command/args` 八项齐(可空值但字段在),`command` 是解释器、`args` 指向 `server.py`。
4. 技能:`SKILL.md` frontmatter 有 `name` + `description`。
5. 图标:有 `icon.svg` 或 `icon.png`。
6. 无明文密钥/Token;无路径穿越名(`.`/`..`/分隔符)。

## 产出

- 默认把标准化结果**写成一个目录**(相对工作目录,如 `<id>/…`),并列出文件清单。
- 用户要 zip → 用可用的打包方式压成 `<id>.zip`(根就是 `plugin.json`,别多套一层目录)。
- 收尾:一句话说明类型(纯技能/纯 MCP/组合)+ 落盘路径 + 如何在商店上传。
visual-designSkill

直出好看的网页/落地页/banner/海报/产品介绍页/数据报告/简历/作品集等视觉物料——套一套设计系统,模型自由写自包含 HTML,颜值由规则锁死、不靠模板。用户说"做个网页/页面/落地页/banner/海报/报告页/作品集/简历"或"把这份内容做成网页版"时使用。⚠️ 不含信息检索:查天气/查行情/查股价/查数据请走对应连接器,不是本技能。

dwsSkill

【何时用:仅当用户明确指向钉钉/DingTalk(钉钉文档、钉钉日程等)时使用;泛指做文档/表格/待办/审批默认走本地工具,不要误用钉钉】用 dws CLI 管理钉钉:AI表格/AI搜问(找人首选)/目标管理(Agoal)/组织大脑/日历/通讯录/群聊与机器人消息/待办/审批/考勤/日志(日报周报)/DING消息/钉钉文档/云盘/Markdown文件/AI听记/邮箱/在线电子表格(axls)/知识库/白板/开放平台文档/个人IM与OA事件订阅。用户要求操作上述钉钉产品时使用。

lark-baseSkill

【何时用:仅当用户明确指向飞书/Lark(发到飞书、飞书文档等)时使用;泛指做个文档或PPT或表格或方案默认走本地工具,不要误用飞书】飞书多维表格(Base)操作:建表、字段、记录、视图、统计、公式/lookup、表单、仪表盘、应用模式(BaseApp/AppMode 页面与组件)、Workspace 目录、workflow、角色权限;遇到 Base/多维表格/bitable、BaseApp/AppMode 或 /app/ 链接时使用。BaseApp 不走 lark-apps;文件导入转 lark-drive,认证/授权转 lark-shared。

lark-calendarSkill

【何时用:仅当用户明确指向飞书/Lark(发到飞书、飞书文档等)时使用;泛指做个文档或PPT或表格或方案默认走本地工具,不要误用飞书】飞书日历:管理日程和会议室。查看/搜索日程、创建/更新日程、管理参会人、查询忙闲和推荐时段、预定会议室。不负责:查询视频会议记录(本 skill 只覆盖日程;lark-vc 技能未随包收录,可 CLI 直连,见意图路由)、待办任务(走 lark-task)。

lark-docSkill

【何时用:仅当用户明确指向飞书/Lark(发到飞书、飞书文档等)时使用;泛指做个文档或PPT或表格或方案默认走本地工具,不要误用飞书】飞书云文档(Docx/Wiki)与思维笔记内容操作:读取、创建、编辑文档,插入或下载图片附件,查询或回滚历史版本。用户给出文档 URL/token(含 doubao.com 的 /docx/、/wiki/)时使用,按 URL 路径/token 而非域名路由;内嵌表格、多维表格、画板先提取 token 再切对应 skill。文档评论走 lark-drive;表格或 Base 内部数据操作不在本 skill。

lark-driveSkill

【何时用:仅当用户明确指向飞书/Lark(发到飞书、飞书文档等)时使用;泛指做个文档或PPT或表格或方案默认走本地工具,不要误用飞书】飞书云空间:管理 Drive 文件/文件夹,上传下载、复制移动删除、评论、权限、密级标签、版本、改标题,导入 Word/Markdown/Excel/CSV/PPTX/.base 为在线文档;doubao.com 云空间 URL 同走本 skill,不回退 WebFetch。不负责:文档内容编辑(lark-doc)、表格/Base 表内数据(lark-sheets/lark-base)、知识库节点(lark-wiki)。

lark-imSkill

【何时用:仅当用户明确指向飞书/Lark(发到飞书、飞书文档等)时使用;泛指做个文档或PPT或表格或方案默认走本地工具,不要误用飞书】飞书即时通讯:收发消息和管理群聊。发送和回复消息、搜索聊天记录、管理群聊成员、上传下载图片和文件、管理表情回复、发送应用内/短信/电话加急、发送和处理交互卡片(Interactive Card)与卡片按钮回调(card.action.trigger)。当用户需要发消息、查看或搜索聊天记录、下载聊天中的文件、查看群成员、搜索或创建群聊/话题群、管理标记数据、Feed 置顶与标签数据、处理卡片回调时使用。

lark-sharedSkill

【何时用:仅在其他 lark-* 技能遇到认证/授权/身份/配置问题时,或首次使用 lark-cli 时;泛指需求默认走本地工具】lark-cli 共享规则:首次配置(config init)、认证登录(auth login --domain/--scope,split-flow)、登录态查询与撤销(auth status/logout/whoami)、--as user/bot 身份切换、权限不足与 missing_scope 处理、JSON 输出契约与 _notice、update 更新、高风险操作审批(exit 10)。