- 人工智能
- 大模型
- AI 应用
- AI Agent
- RAG
- 金融科技
- 桌面应用
- MCP Clients
【免费下载链接】go-stock
🦄🦄🦄AI赋能股票分析:AI加持的股票分析/选股工具。股票行情获取,AI热点资讯分析,AI资金/财务分析,涨跌报警推送。支持A股,港股,美股。支持市场整体/个股情绪分析,AI辅助选股等。数据全部保留在本地。支持DeepSeek,OpenAI, Ollama,LMStudio,AnythingLLM,硅基流动,火山方舟,阿里云百炼等平台或模型。
导读:本文以 go-stock 的 SKILL_GUIDE.md 为主线,完整讲解「技能(Skill)」的完整生命周期——从「技能是什么」「SKILL.md 格式与存储结构」「三种获取方式」到「对话中斜杠指令 / DeepAgents 自动选用」「本地管理 / 分享到广场」以及 FAQ 与开发者视角的技术细节。文中每个操作步骤均标注了可验证的仓库源码(app.go、backend/agent/skill_backend.go 等),读完你可以独立创建一套可复用的专业 AI 指令(如龙头战法、复盘模板),并理解其底层实现原理。
一、技能是什么:一组可复用的 AI 专业指令
在 go-stock 中,技能(Skill)= 一组可复用的 AI 专业指令,以文件夹形式存放。一个技能目录的核心是SKILL.md文件——它由YAML 元数据(frontmatter)+ Markdown 指令正文两部分组成,同时可以附带脚本、配置文件等任意辅助资源。
技能系统解决的痛点非常明确:每次让 AI 扮演"龙头战法交易顾问"或执行"复盘模板",你都要把角色设定、方法论、纪律铁律重新敲一遍。把这段指令固化成一个技能后,一句话就能让 AI 以该角色、按该流程执行,还可以把技能打包分享给其他用户。
两种典型用法
| 用法 | 机制 | 适合场景 |
|---|---|---|
斜杠指令(/手动选择) | 选中技能后,SKILL.md 正文覆盖系统提示词,本轮对话按该技能的指令行事 | 明确想让 AI 扮演某个角色 / 执行固定流程 |
| AI 自动选用(DeepAgents 模式) | 技能列表注入 Agent,AI 依据 frontmatter 的name/description自主判断是否加载某个技能的正文 | 开放式提问,让 AI 自己挑合适的方法论 |
💡 斜杠指令在所有 Agent 模式下可用;AI 自动选用目前仅 DeepAgents 模式(默认模式)支持。
深入实现:AI 自动选用在 DeepAgents 启动时通过 backend/agent/agent.go 的buildSkillMiddleware()实现——它扫描rootDir/skills/下所有一级子目录中的SKILL.md,把解析出的 frontmatter 摘要注入 Agent;模型判断问题与某技能相关时,再通过skill工具读取该技能的完整正文执行。若无技能或skills目录不存在,中间件不注册(返回 nil)。
二、技能的存储结构与 SKILL.md 格式
2.1 目录结构
<go-stock 可执行文件所在目录>/ └── skills/ # 技能根目录(与工作目录无关) ├── 打板策略/ # 一个技能 = 一个子目录 │ ├── SKILL.md # 必需:技能定义 │ ├── scripts/run.sh # 可选:附带脚本 │ └── examples/demo.md # 可选:示例/参考资料 └── 复盘模板/ └── SKILL.md要点:
- 目录位置跟随可执行文件(
os.Executable()所在目录),从任何工作目录启动都不会变,避免「换目录启动数据丢失」; - 每个一级子目录就是一个技能,必须包含
SKILL.md,否则不被识别; - 目录名即技能的
dirName(用于斜杠指令与本地管理),显示名取自 SKILL.md 的name字段。
源码佐证:app.go 中skillsDir()的实现:优先取os.Executable()所在目录下的skills,获取失败时才降级到os.Getwd()。这也解释了"与工作目录无关"的设计——/斜杠指令、技能管理页、DeepAgents 自动选用统一走skillsDir(),三者数据源一致(见 app.go 的buildSingleSkillSection注释:"与技能管理页面(ListFilesystemSkills)数据源一致,确保 / 斜杠指令选择的就是用户在技能管理中看到的技能")。
2.2 SKILL.md 格式
--- name: 龙头战法 description: A股超短线龙头股识别与跟踪策略,覆盖情绪周期定位、连板高度预判、断板处理纪律 --- ## 你的任务 你是一名专注A股超短线的游资风格交易顾问…… ## 情绪周期定位 …… ## 纪律铁律 ……---包裹的头部是YAML frontmatter,只有两个字段:name(名称)与description(描述,务必写清楚适用场景——AI 自动选用全靠它判断);- 正文即喂给模型的完整指令,建议用 Markdown 结构化(角色设定 → 方法论 → 纪律约束 → 输出格式);
- ⚠️ frontmatter 的字段值必须是字符串,不要写成数组或数字,否则该技能解析失败会被静默跳过(详见第七节 FAQ)。
源码佐证:frontmatter 解析由 app.go 的parseSkillFrontmatter()完成——先定位首行---与结束---,再用yaml.Unmarshal解析name/description两个字符串字段;解析失败时返回空的FilesystemSkillInfo(技能被跳过而非报错)。DeepAgents 侧的 frontmatter 分离逻辑见 backend/agent/skill_backend.go 的parseSkillFrontmatter(),其loadSkillFromFile()还会对读取内容做stripSkillLineNumbers()行号前缀兼容处理。
三、入口位置
技能管理内嵌于深入研究页(路由/research):
- 技能管理区块:本地技能列表 / 导入技能包 / 内置编辑器 / 打开技能广场;
- MCP 服务区块:与技能系统相邻(见 MCP_GUIDE.md)。
前端佐证:技能管理前端位于 frontend/src/components/skill-manager.vue,它通过ImportSkillPackage、ListFilesystemSkills、DeleteFilesystemSkill、ListSkillFiles、ReadSkillFile、WriteSkillFile、DeleteSkillFile、EnableFilesystemSkill、DisableFilesystemSkill、UpdateFilesystemSkillDescription等 Wails 绑定方法与 app.go 交互;技能广场前端为 frontend/src/components/skillPlaza.vue。
四、获取技能的三种方式
方式 A — 技能广场下载(推荐)
- 技能管理 →「技能广场」按钮;
- 浏览/搜索/按分类与排序(最新/最热/最多下载)筛选;
- 点开技能详情 → 查看 SKILL.md 内容预览;
- 点「导入」→ 自动下载 zip(base64)并解压到本地
skills/目录,立即生效。
- VIP 专属技能(带 VIP 标识)需开通 VIP 后才能下载;
- 下载即本地化:之后离线可用,广场删除分享不影响已导入的本地副本。
源码佐证:广场下载走ImportSkillFromBase64()(app.go):先 base64 解码,再在内存中解压 zip,校验规则与本地导入 zip 完全一致(路径穿越拦截、SKILL.md 校验、解压限流)。VIP 校验由服务端权威完成——skillPlaza.vue 中"服务端权威校验赞助码后返回实际 VIP 状态,客户端提交的 vipLevel 仅作参考,服务端不信任"。
方式 B — 导入本地 zip 技能包
从其他渠道(网站、好友)拿到.zip技能包后:
- 技能管理 →「导入技能包」;
- 选择 zip 文件 → 自动校验并解压。
zip 包要求与安全校验:
- 必须包含
SKILL.md(在根目录或子目录均可,子目录名会作为技能名); - 自动拦截路径穿越(含
..的条目直接拒绝); - 解压写入量受限(防 zip 炸弹,声明大小与实际写入双重校验)。
源码佐证:app.go 的ImportSkillPackage()是这条路径的实现:
- SKILL.md 定位与命名:
SKILL.md在根目录时用 zip 文件名作技能名;在子目录时取第一级目录名(strings.SplitN(filepath.ToSlash(dir), "/", 2)[0]); - zip slip 防护:遍历条目时
strings.Contains(f.Name, "..")直接拒绝,返回「压缩包包含非法路径」; - 解压限流:单文件 10MB 上限(
maxFileSize = 10 * 1024 * 1024)、总计 100MB 上限(maxTotalSize = 100 * 1024 * 1024);ImportSkillFromBase64()更进一步用io.LimitReader(rc, maxFileSize+1)做实际写入字节数校验——因为 zip 头声明的UncompressedSize64可被伪造,不能仅信任声明值; - 覆盖导入:目标目录已存在时先删除再解压(
os.RemoveAll(targetDir))。
方式 C — 手工创建
- 在
skills/下新建文件夹(名字即 dirName,建议用英文或无特殊符号,如dragon-strategy); - 新建
SKILL.md,按第二节格式填写; - 回到技能管理页点「刷新」即可看到。
源码佐证:目录名清洗由 app.go 的sanitizeSkillDirName()完成——剔除..、/、\、:、;、|、?、*、"、<、>等非法字符;清洗后为空时导入流程会回退为imported-skill作为技能名。手动创建者无需执行该函数,但目录命名仍建议避开上述字符,避免后续斜杠指令/管理操作出现歧义。
五、在对话中使用技能
1. 斜杠指令(所有模式)
在 AI 助手输入框输入/:
/会弹出技能选择浮层,支持:
| 按键 | 作用 |
|---|---|
| 继续输入文字 | 按名称/描述过滤技能(如/龙头) |
↑/↓ | 上下选择 |
Enter | 选中(输入框中的/xxx文本自动清除) |
Esc | 关闭浮层 |
选中后顶部出现技能标签,提示「已选择技能『xxx』,将忽略系统提示词」——系统提示词下拉会被禁用(技能指令优先),发送后整轮对话按技能行事。点标签上的 × 可清除恢复默认。
选中状态持久保存在本地,下次打开助手仍生效,记得按需清除。
前端佐证:斜杠指令交互实现在 frontend/src/components/FloatingAgentAssistant.vue 的checkSlashCommand()(匹配最后一个/开头的词)及技能浮层逻辑中。从源码看该交互支持技能多选:选中技能后技能名以@技能名标记追加到输入框、随消息文本一起提交——这是为了"确保 DeepAgents 子 Agent 委派时也能感知用户指定的技能"(用户消息是唯一能经 task 委派描述传播到子 Agent 的通道,子 Agent 不继承系统提示词)。停用的技能不进入可选列表,已选中的停用技能会被自动移除。
后端佐证:多选技能由 app.go 的buildSkillContext()合并构建:系统提示词返回「技能全文 + 技能激活纪律」,问题块返回<selected_skills>激活块随用户消息提交。激活纪律(buildSkillDiscipline)包含三条强制要求:【立即应用】禁止用通用泛泛分析替代、【委派传播】委派子任务时 description 必须原样包含技能名称、【输出自查】最终输出前自查是否体现技能方法论特征步骤。
2. AI 自动选用(DeepAgents 模式)
无需任何操作。DeepAgents 启动时会扫描skills/下所有合法技能,把 frontmatter 摘要交给模型;模型判断问题与某技能相关时自动读取其正文执行。
例:本地有「龙头战法」技能(description 提到情绪周期、连板),直接问:
「今天大盘冰点,怎么判断明天有没有修复的接力机会?」
模型识别到与技能描述相关 → 自动加载技能指令作答。
description 的写法决定命中率:写「做什么 + 适用于什么问题」,不要只写「很厉害的策略」。
源码佐证:这一链路的核心在 backend/agent/skill_backend.go 的tolerantSkillBackend与 backend/agent/agent.go 的buildSkillMiddleware()——List()返回所有可正常解析技能的 frontmatter 注入 Agent,Get(name)按 frontmattername精确匹配读取正文。技能名必须与skill工具的<name>参数一致(均取自 SKILL.md frontmatter name),见 app.go 的buildSkillQuestionBlock注释。
六、管理本地技能
技能管理页表格列出所有本地技能(名称 / 目录名 / 描述),每行可:
| 操作 | 说明 |
|---|---|
| 编辑文件 | 打开内置编辑器:左侧文件树(含子目录),右侧编辑器;支持新建文件/目录(如scripts/run.sh)、保存、删除文件(SKILL.md不可删,防技能失效) |
| 删除技能 | 整目录删除,二次确认 |
| 刷新 | 重新扫描skills/(手工在文件系统里改文件后需要刷新) |
编辑器常用于微调下载来的技能(比如把指令里的默认参数改成自己的),改完即时生效,无需重启。
源码佐证(编辑器的文件操作全部带目录穿越防护,app.go):
ListSkillFiles():递归列出技能目录所有文件(名称/相对路径/大小/修改时间);ReadSkillFile()/WriteSkillFile()/DeleteSkillFile():统一先剔除..与\,再用filepath.Clean后校验路径仍以skillBase为前缀,越界即拒绝(「非法文件路径」);ListFilesystemSkills()(app.go):只扫描一级子目录,优先读取启用态SKILL.md,不存在时读取停用态SKILL.md.disabled并打上disabled标志——即技能管理页的停用/启用开关背后是 DisableFilesystemSkill / EnableFilesystemSkill 对文件名的重命名;UpdateFilesystemSkillDescription()(app.go):只改写 frontmatter 的description字段,其余字段与正文逐字节不变(采用行级处理而非 YAML 反序列化回写,支持单行值、块标量及无 frontmatter 时补建);- 停用技能可被重新启用,且每次对话重建都会重新扫描技能目录,因此停用/启用在下一次对话即实时生效。
说明:原指南提到"SKILL.md不可删",这是内置编辑器对删除操作的保护性约束(防止技能因失去定义文件而失效),删除整个技能请使用「删除技能」操作。
七、分享技能到广场
- 技能广场 →「分享我的技能」(需先登录广场账号);
- 从本地技能下拉中选择要分享的技能 → 自动打包为 base64 预填表单;
- 填写标题、分类、简介,可勾选VIP 专属(仅 VIP 用户可下载);
- 提交后广场出现你的分享,我的分享中可管理(更新/删除)。
分享的是打包快照:之后本地修改不会自动同步,需重新分享更新。
源码佐证:分享打包由 app.go 的PackSkillToBase64()完成:遍历技能目录全部文件(zip 内使用/分隔相对路径、顶层为技能目录名,便于对方导入),总大小超 2MB 拒绝分享(与服务端技能包 2MB 限制保持一致,maxShareTotal = 2 * 1024 * 1024),最后 zip 压缩后 base64 编码并附带name/description/fileCount/packageSize供前端预填分享表单。
八、常见问题
1. 技能管理页看不到我手工创建的技能
- 确认目录在可执行文件所在目录的
skills/下(不是工作目录); - 确认含
SKILL.md且文件名大小写正确; - 点「刷新」重新扫描。
2./弹不出技能菜单
本地没有任何合法技能时浮层为空。先按第四节导入或创建至少一个技能。
3. AI(DeepAgents)没有自动用我的技能
- 检查
description是否描述清楚适用场景(AI 靠它判断相关性); - frontmatter 格式错误会被静默跳过——日志(
logs/wails.log)中搜「跳过格式错误的技能」确认; - 常见错误:
name/description值写成了 YAML 数组或数字;---前有空行;缺结束---。
4. 一个格式错误的 SKILL.md 会不会拖垮 AI?
不会。技能加载采用容错后端(tolerantSkillBackend):单个技能解析失败仅记警告并跳过,其余技能与 Agent 正常运行。历史上曾出现一个错误技能导致整个 Agent 启动失败的问题,现已修复。
源码佐证:backend/agent/skill_backend.go 的注释记录了修复背景——eino 内置的filesystemBackend.list()遇到任意一个 frontmatter 解析失败的技能,错误会经Info()传播到NewToolNode,导致整个 DeepAgents 工具列表构建失败(failed to unmarshal frontmatter: yaml: unmarshal errors: line 2: cannot unmarshal !!seq into string)。tolerantSkillBackend复用 eino 的 frontmatter 提取解析逻辑,但单个技能失败只logger.SugaredLogger.Warnf("skill 中间件: 跳过格式错误的技能文件: %v", e)并跳过。对应测试 backend/agent/skill_backend_test.go 的TestTolerantSkillBackendSkipsBadFrontmatter构造了"正常技能 + name 写成 YAML 序列的坏技能 + 缺 frontmatter 分隔符的技能"三个用例,断言List只返回 1 个可用技能且不报错、Get坏技能返回未找到——与指南中「日志搜『跳过格式错误的技能』」的排查方式完全对应。
5. 导入 zip 报「压缩包包含非法路径」
zip 内条目名含..(路径穿越攻击特征),已按安全策略拒绝。来源不可信的包不要强行导入。
6. VIP 技能下载提示「请先开通 VIP」
广场侧权限控制(服务端校验,非客户端判断)。开通 VIP 后重新下载即可。
7. 选了技能后系统提示词不生效
这是设计行为:斜杠指令选中的技能正文会覆盖系统提示词。清除技能标签即可恢复。
九、技术细节(开发者参考)
下表汇总技能系统各环节的实现位置,便于深入研读:
| 内容 | 位置 |
|---|---|
技能目录定位(skills/,跟随可执行文件) | app.go →skillsDir() |
| zip 导入(zip slip 防护 / SKILL.md 校验 / 解压限流) | app.go →ImportSkillPackage();app.go →ImportSkillFromBase64() |
| 本地技能列表 / 删除 / 停用 / 启用 | app.go →ListFilesystemSkills();app.go →DeleteFilesystemSkill();app.go →DisableFilesystemSkill();app.go →EnableFilesystemSkill() |
| 描述在线编辑 | app.go →UpdateFilesystemSkillDescription()/replaceFrontmatterDescription() |
| 技能文件树 / 读 / 写 / 删(含穿越防护) | app.go →ListSkillFiles()/ReadSkillFile()/WriteSkillFile()/DeleteSkillFile() |
| 分享打包(base64,2MB 上限) | app.go →PackSkillToBase64() |
| frontmatter 解析 / 技能提示词组装 | app.go →parseSkillFrontmatter();app.go →buildSkillContext();app.go →buildSkillDiscipline()/buildSkillQuestionBlock() |
目录名清洗(去..//等非法字符) | app.go →sanitizeSkillDirName() |
| 容错技能后端(DeepAgents 自动选用) | backend/agent/skill_backend.go →tolerantSkillBackend |
技能中间件注册(扫描rootDir/skills/) | backend/agent/agent.go →buildSkillMiddleware() |
| 容错后端测试用例 | backend/agent/skill_backend_test.go →TestTolerantSkillBackendSkipsBadFrontmatter |
| 技能管理前端 | frontend/src/components/skill-manager.vue |
| 技能广场前端 | frontend/src/components/skillPlaza.vue |
| 斜杠指令交互 | frontend/src/components/FloatingAgentAssistant.vue →checkSlashCommand()等 |
许可证
go-stock 的技能系统遵循项目根目录 LICENSE 的开源许可。本文档对应的原始指南位于 docs/SKILL_GUIDE.md,MCP 服务与技能系统的配套说明见 docs/MCP_GUIDE.md。
- 人工智能
- 大模型
- AI 应用
- AI Agent
- RAG
- 金融科技
- 桌面应用
- MCP Clients
【免费下载链接】go-stock
🦄🦄🦄AI赋能股票分析:AI加持的股票分析/选股工具。股票行情获取,AI热点资讯分析,AI资金/财务分析,涨跌报警推送。支持A股,港股,美股。支持市场整体/个股情绪分析,AI辅助选股等。数据全部保留在本地。支持DeepSeek,OpenAI, Ollama,LMStudio,AnythingLLM,硅基流动,火山方舟,阿里云百炼等平台或模型。
相关推荐
Atuin AI 斜杠命令(Slash Commands)完全指南:内置命令与技能命令的注册、调度与使用
Atuin AI 斜杠命令(Slash Commands)完全指南:内置命令与技能命令的注册、调度与使用 Atuin AI 是随 Atuin 一起提供的终端内
CLI后端数据库Discord.js 指南:深入理解斜杠命令权限系统
Discord.js 指南:深入理解斜杠命令权限系统 前言 在 Discord 机器人开发中,斜杠命令(Slash Command)的权限管理是一个至关重要的环
ECC Command→Agent/Skill 映射全景指南:斜杠命令、Agent 与 Skill 的调用关系与仓库索引
ECC Command→Agent/Skill 映射全景指南:斜杠命令、Agent 与 Skill 的调用关系与仓库索引 本指南围绕 ECC(agent har
人工智能AI 技能AI 插件AI 评测Agent 评测MCP Clients开发工具
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考