作为一名长期使用Cursor进行项目开发的工程师,我发现AI助手虽然强大,但在处理特定项目场景时常常需要反复指导。Cursor Agent Skill正是为了解决这个问题而设计的——它让我们能够将特定场景下的解决方案固化下来,让AI助手真正成为项目团队的一员。
在最近的一个项目中,我们遇到了一个典型问题:OpenSpec CLI无法读取加密的.md文件。这个问题看似简单,却揭示了AI助手在项目特定场景下的局限性,也让我深刻理解了Skill的价值所在。
Cursor Agent Skill不是插件,也不是脚本,而是一份给AI的操作手册。想象一下,当你反复向新同事解释项目特有的工作流程时,是不是希望有一份标准文档?Skill就是给AI的这份文档。
在我们的案例中,项目使用磁盘加密(TSD)保护.md文件。Cursor的Read工具能自动解密,但OpenSpec CLI作为Node.js进程直接读取文件时,只能看到加密内容。每次遇到这个问题,都需要手动指导AI如何处理——这正是Skill要解决的痛点。
Skill的特殊之处在于它的"智能触发"机制。不同于静态文档需要人工查阅,Skill会被Cursor AI自动识别和调用。当对话或命令行输出中出现特定关键词时,AI会自动加载对应的Skill内容。
这种机制使得Skill成为项目知识库的自然延伸。在我们团队中,已经将常见的调试流程、项目规范都做成了Skill,新成员通过AI就能快速掌握项目特有的工作方式。
在我们的开发流程中,功能变更需要经过提案→规格→设计→任务→实施→归档的完整生命周期。当执行归档命令时:
bash复制openspec archive "fix-document-extraction" -y
CLI报错:
code复制Delta parsing found no operations for extraction-preview-ui.
Aborted. No files were changed.
问题的根源在于:项目对.md文件做了磁盘加密(TSD)。Cursor的Read工具内置了解密层,能看到明文;但OpenSpec CLI直接从文件系统读取,得到的是加密内容。
解决这个问题的思路很直接:
但关键在于如何让AI记住这个解决方案,并在下次遇到相同问题时自动应用。
一个Skill就是一个包含SKILL.md文件的目录,存放位置有两种选择:
| 类型 | 路径 | 适用范围 |
|---|---|---|
| 个人级 | ~/.cursor/skills/skill-name/ | 所有项目 |
| 项目级 | .cursor/skills/skill-name/ | 当前项目 |
我们的案例选择项目级存储,因为文件加密是这个项目特有的配置。
SKILL.md必须包含YAML头部和正文内容。以下是我们的完整示例:
markdown复制---
name: openspec-decrypt-for-cli
description: Fix OpenSpec CLI failures caused by encrypted .md files.
Use when openspec validate, openspec archive, or openspec sync fails
with errors like "No delta sections found", "Delta parsing found no
operations", or "No deltas found" due to on-disk encryption that
Cursor can read through.
---
# OpenSpec: Decrypt MD Files for CLI
When .md files in openspec/changes/ are encrypted on disk, OpenSpec CLI
cannot parse them — but Cursor can read the plaintext via its Read tool.
## When to Use
Detect this situation when ANY of these appear in openspec CLI output:
- "Delta parsing found no operations"
- "No delta sections found"
- "No deltas found"
- YAML warnings containing garbled binary like %TSD-Header-
## Steps
1. Identify all encrypted .md files in the change directory
2. Read each file via Cursor's Read tool (sees decrypted content)
3. Write plaintext back to disk via Write tool
4. Run: openspec validate "<change-name>"
5. Retry the original CLI command
## Notes
- Only touch files inside openspec/changes/<name>/
- The encryption layer will re-encrypt automatically
description是Skill能否被正确触发的关键,需要遵循以下原则:
在我们的案例中,description包含了"openspec validate"、"No delta sections found"等关键词,确保AI能在相关场景下正确识别。
Skill的触发不是基于文件监控或事件监听,而是通过对话内容匹配实现的:
| 用户输入/场景 | 是否触发 | 原因 |
|---|---|---|
| CLI报"Delta parsing found no operations" | 是 | 匹配description中的错误信息 |
| 用户说"openspec archive报No delta sections found" | 是 | 包含触发关键词 |
| 普通编码问题讨论 | 否 | 不匹配任何Skill的description |
需要注意的是,Skill不会在以下场景触发:
根据我们的项目经验,以下场景特别适合做成Skill:
| 原则 | 说明 | 示例 |
|---|---|---|
| 简洁 | 只写AI不知道的 | 不解释基本概念如Markdown |
| 具体 | 给出明确命令和路径 | "运行openspec validate"而非"验证一下" |
| 一致 | 术语统一 | 全篇使用"加密/解密"而非混用"编码" |
| 适度 | 不超过500行 | 保持内容精炼 |
对于涉及多个步骤的工作流,可以设计链式Skill。例如我们的代码发布流程:
每个Skill只关注一个环节,通过description中的关键词形成自然衔接。
在团队环境中,我们建立了以下规范:
Skill不是要取代项目文档,而是与之互补:
可能原因:
解决方案:
可能原因:
解决方案:
当多个Skill的description相似时,可能导致意外触发。我们采用的解决方案:
在实际使用Cursor Agent Skill一年多后,我们总结了以下宝贵经验:
渐进式建设:不要试图一次性创建所有Skill,而是在遇到重复问题时逐步积累
质量优于数量:5个精心设计的Skill比20个粗糙的更有价值。我们团队每个月会进行一次Skill审计,淘汰过时的,优化不够清晰的
上下文完整:优秀的Skill应该像给新同事的指导文档一样,包含足够的上下文。我们在关键Skill中添加了"Background"部分,解释为什么需要这些步骤
版本适配:当项目工具链升级时,要及时更新相关Skill。我们建立了简单的版本标记机制,在Skill头部添加兼容版本说明
效果度量:我们维护了一个Skill使用日志,记录每个Skill的触发次数和解决效果,作为改进依据
团队培训:定期举办Skill编写工作坊,分享优秀案例。新成员入职时,我们会指导他们如何利用现有Skill快速上手项目
这些经验让我们的Skill体系始终保持高可用性,真正成为团队知识沉淀的重要载体。