以下是 npx skills 的核心功能精简版 Markdown 文档,保留了最关键的用法和概念。
npx skills 核心指南
1. 核心命令速查
| 命令 | 作用 |
|---|---|
npx skills add <来源> |
安装技能包(GitHub 短名/URL/本地路径) |
npx skills find [关键词] |
搜索可用技能 |
npx skills list |
列出已安装技能 |
npx skills update |
更新所有技能 |
npx skills remove <技能名> |
移除指定技能 |
npx skills init <名称> |
创建新技能模板 |
示例:
bash
npx skills add vercel-labs/agent-skills # 安装技能包
npx skills add antfu/skills --skill vue # 指定安装某个技能
npx skills add ./.skills --agent cursor --global # 安装到全局,指定助手
2. 安装交互流程
运行 npx skills add 后会依次提示:
- 选择技能:多选(空格键)
- 选择 AI 助手:Claude Code / Cursor / Copilot 等
- 选择安装范围 :
Project(项目级)或Global(全局级) - 选择安装方式 :推荐
Symlink(符号链接)
非交互式安装:使用
--agent、--global、--yes等参数自动完成。
3. 技能包(Skill)是什么?
一个技能包是结构化的文件夹,包含:
SKILL.md:技能描述 + 工作流程(YAML 元数据 + Markdown 指令)scripts/:可执行脚本(Python、Shell),用于精确操作references/:参考文档(按需加载)assets/:模板、图片等资源
核心优势
- 按需加载:仅技能元数据常驻上下文,节省 token
- 可靠执行:复杂任务调用预设脚本,避免 AI 生成错误代码
- 可复用:技能可在项目、团队间共享
以下是基于 Node.js 实现的 pdf-processor 技能包示例,帮助你理解技能包的结构和 Node.js 脚本的应用方式。
基于 Node.js 的具体示例
假设你需要让 AI 助手能够高效处理 PDF 文件,可以创建一个名为 pdf-processor 的技能包。它的目录结构如下:
plain
pdf-processor/
├── SKILL.md # 核心说明文件
├── scripts/
│ ├── extract-text.js # 提取 PDF 文本的 Node.js 脚本
│ ├── merge-pdfs.js # 合并多个 PDF 的脚本
│ └── add-watermark.js # 添加水印的脚本
├── references/
│ └── pdf-lib-guide.md # 可选:pdf-lib 库的使用参考
└── assets/
└── watermark.png # 可选:水印图片模板
核心文件详解
SKILL.md ------ 技能的大脑
markdown
---
name: pdf-processor
description: 处理 PDF 文件的技能,支持提取文本、合并文档、添加水印等操作(基于 Node.js)。
---
# PDF 处理器
## 适用场景
- 用户需要从 PDF 中提取文本内容
- 需要合并多个 PDF 文件
- 需要为 PDF 添加水印
## 环境要求
- Node.js 18+
- 依赖库:`pdf-parse`、`pdf-lib`(可通过 `npm install pdf-parse pdf-lib` 安装)
## 工作流程
1. 判断用户需求属于哪一类操作。
2. 根据需求调用 `scripts/` 目录下的对应脚本:
- 提取文本 → `node scripts/extract-text.js <输入文件> [输出文件]`
- 合并 PDF → `node scripts/merge-pdfs.js <文件列表> <输出文件>`
- 添加水印 → `node scripts/add-watermark.js <输入文件> <水印文件> <输出文件>`
3. 将脚本执行结果反馈给用户。
## 注意事项
- 脚本执行前请确保 Node.js 环境和所需依赖已安装。
- 若用户未指定输出文件,默认保存为 `output.pdf` 或 `extracted.txt`。
scripts/extract-text.js ------ 确定性脚本(简化版)
javascript
#!/usr/bin/env node
/**
* 提取 PDF 中的纯文本
* 用法: node extract-text.js input.pdf [output.txt]
*/
const fs = require('fs');
const path = require('path');
const pdfParse = require('pdf-parse');
async function extractText(pdfPath, txtPath = null) {
const dataBuffer = fs.readFileSync(pdfPath);
const data = await pdfParse(dataBuffer);
const text = data.text;
if (txtPath) {
fs.writeFileSync(txtPath, text, 'utf8');
console.log(`文本已保存至: ${txtPath}`);
} else {
console.log(text);
}
}
if (require.main === module) {
const args = process.argv.slice(2);
if (args.length < 1) {
console.error('错误:请提供 PDF 文件路径');
process.exit(1);
}
const input = args[0];
const output = args[1] || null;
extractText(input, output).catch(err => {
console.error('处理失败:', err.message);
process.exit(1);
});
}
scripts/merge-pdfs.js ------ 合并 PDF 脚本
javascript
#!/usr/bin/env node
/**
* 合并多个 PDF 文件
* 用法: node merge-pdfs.js file1.pdf file2.pdf ... output.pdf
*/
const fs = require('fs');
const { PDFDocument } = require('pdf-lib');
async function mergePDFs(inputPaths, outputPath) {
const mergedPdf = await PDFDocument.create();
for (const filePath of inputPaths) {
const fileBytes = fs.readFileSync(filePath);
const pdf = await PDFDocument.load(fileBytes);
const pages = await mergedPdf.copyPages(pdf, pdf.getPageIndices());
pages.forEach(page => mergedPdf.addPage(page));
}
const mergedBytes = await mergedPdf.save();
fs.writeFileSync(outputPath, mergedBytes);
console.log(`合并完成,保存至: ${outputPath}`);
}
if (require.main === module) {
const args = process.argv.slice(2);
if (args.length < 2) {
console.error('错误:至少需要提供 2 个 PDF 文件路径,最后一个为输出文件');
process.exit(1);
}
const output = args.pop();
const inputs = args;
mergePDFs(inputs, output).catch(err => {
console.error('合并失败:', err.message);
process.exit(1);
});
}
scripts/add-watermark.js ------ 添加水印脚本(简化)
javascript
#!/usr/bin/env node
/**
* 为 PDF 添加水印(文字或图片)
* 用法: node add-watermark.js input.pdf watermark.png output.pdf
*/
const fs = require('fs');
const { PDFDocument, rgb } = require('pdf-lib');
async function addWatermark(inputPath, watermarkPath, outputPath) {
const pdfBytes = fs.readFileSync(inputPath);
const pdfDoc = await PDFDocument.load(pdfBytes);
// 加载水印图片(假设是 PNG)
const watermarkBytes = fs.readFileSync(watermarkPath);
const watermarkImage = await pdfDoc.embedPng(watermarkBytes);
const pages = pdfDoc.getPages();
for (const page of pages) {
const { width, height } = page.getSize();
// 在页面中心添加水印,调整大小和透明度
page.drawImage(watermarkImage, {
x: width / 2 - 100,
y: height / 2 - 100,
width: 200,
height: 200,
opacity: 0.3,
});
}
const modifiedPdfBytes = await pdfDoc.save();
fs.writeFileSync(outputPath, modifiedPdfBytes);
console.log(`水印添加完成,保存至: ${outputPath}`);
}
if (require.main === module) {
const args = process.argv.slice(2);
if (args.length < 3) {
console.error('错误:请提供输入 PDF、水印文件、输出 PDF 路径');
process.exit(1);
}
const [input, watermark, output] = args;
addWatermark(input, watermark, output).catch(err => {
console.error('添加水印失败:', err.message);
process.exit(1);
});
}
references/pdf-lib-guide.md ------ 按需加载的参考文档
markdown
# pdf-lib 常用操作速查
## 安装
```bash
npm install pdf-lib pdf-parse
技能如何被 AI 使用
- 启动时 :AI 只读取
SKILL.md中的元数据(name和description),知道存在一个"PDF 处理器"技能。 - 用户提问 :当用户说"帮我把这个 PDF 里的文字提取出来"时,AI 根据描述匹配到该技能,动态加载 整个
SKILL.md的内容,了解工作流程。 - 执行任务 :AI 按照
SKILL.md的指示,调用scripts/extract-text.js脚本,并传递用户提供的文件路径,完成精确的文本提取。 - 结果反馈:脚本执行结果返回给 AI,AI 再将结果以自然语言形式呈现给用户。
技能包的优势体现
- 精确可靠:提取 PDF 文本由成熟的 Node.js 库完成,避免了 AI 自行编写代码可能出现的错误。
- 节省 Token :
references/中的详细文档只会在需要时(例如 AI 需要了解更复杂的 PDF 操作)才被读取,平时不占用上下文。 - 易于分享 :整个文件夹可以打包上传到 GitHub,团队成员通过
npx skills add一键安装,立即获得相同能力。
这个示例展示了如何将一项专业能力(PDF 处理)封装成结构化的技能包,并基于 Node.js 生态实现,让 AI 助手从"聊天"升级为"实干家"。
4. 典型应用场景
| 场景 | 说明 |
|---|---|
| 自动化工作流 | 生成周报、PPT、测试报告 |
| 代码规范 | 强制命名规则、生成符合团队风格的代码 |
| 工具集成 | 让 AI 学会使用 playwright、docker 等工具 |
| 知识沉淀 | 将专家经验封装成技能,供团队使用 |
5. 官方资源
- 技能目录 :https://skills.sh 发现社区技能
- 常用技能集 :antfu/skills(Vue、Nuxt、前端相关)
总结 :npx skills 是 AI 助手的"技能商店",通过简单的命令即可让 AI 掌握专业能力,从聊天升级为高效的工作伙伴。