编程语言级别的Skill市场,AI Agent 的未来形态

📅 2026/7/5 13:26:10
编程语言级别的Skill市场,AI Agent 的未来形态
大家好我是前端之虎陈随易。最近研究 MoonBit 生态的时候发现了一个很有意思的东西skills.mooncakes.io。这玩意儿不是博客也不是 App 商店而是 MoonBit 的技能市场。一句话说清楚你写好一个 MoonBit 包往 mooncakes.io 上一扔别人一行命令就能跑起来不用管你用了啥依赖、啥操作系统、怎么编译。今天就用几个真实例子聊聊它到底怎么写、怎么用、有啥用跟传统包管理比起来到底新在哪。它是个啥举个例子假如我写了个小工具功能很简单把 JSON 文件里的字段按字母顺序排个序。要是在以前我想把这个工具分享给别人通常得这么折腾把源码发过去。告诉他怎么装依赖。教他怎么编译。然后帮他解决各种环境报错。说实话挺折腾的。而 skills.mooncakes.io 做的事情就是你上传一个支持 Wasm 后端的 MoonBit 模块平台会自动把它构建成经过 wasm-opt 优化的 Wasm 二进制。别人只需要一行命令moon runwasm 你的用户名/json-sort0.1.0input.json就能直接跑起来。不需要装 Node、Python 或者其他环境只要有 MoonBit 工具链就行。说白了就是把代码直接变成可执行能力。都能干点啥看几个真实例子skills.mooncakes.io 上已经有一些可以直接运行的技能比如Yoorkin/cowsay在终端生成 cowsay 图案。moonbit-community/embed把静态文件嵌入成 MoonBit 源文件。moonbit-community/moongrep结构化的 MoonBit 代码搜索工具。moonbitlang/yaccLR(1) 解析器生成器。moonbitlang/parser/cmd/moonfmtMoonBit 代码格式化工具。这些功能本身都不复杂但以前要用它们往往得装各种不同的工具、依赖和环境。现在统一的命令就能把它们跑起来moon runwasm 作者名/包名版本号比如moon runwasm Yoorkin/cowsay0.1.2 -- hello moon runwasm moonbit-community/embed0.1.1 ./fixtures-ofixtures_bundle.mbt moon runwasm moonbit-community/moongrep0.1.11 -- scan--rulespath/to/rules path/to/src moon runwasm moonbitlang/yacc0.7.17 ----helpmoon runwasm moonbitlang/parser/cmd/moonfmt0.3.7每个技能都是独立的、可执行的、可复用的。一个技能项目长啥样光说不练假把式咱直接看个最小项目。假设项目叫json-sort/目录结构如下json-sort/ ├── moon.mod ├── moon.pkg ├── main.mbt └── SKILL.mdmoon.mod是模块配置文件用 MoonBit 自己的 DSL 格式name 你的用户名/json-sort version 0.1.0 preferred_target wasm supported_targets wasm import { moonbit-community/miniio0.2.0, }注意两个 target 字段的区别preferred_target只是设置moon build、moon check等命令的默认后端代表开发时的偏好。supported_targets才是真正限制模块支持哪些后端省略它时默认支持所有后端。如果模块和包都声明了最终支持范围取两者的交集。只有有效范围包含wasmmooncakes.io 才会尝试为这个包构建 Wasm 二进制moon runwasm才能运行。moon.pkg说明这是一个可执行包声明只支持 Wasm 后端并导入需要的依赖import { moonbit-community/miniio, } options( is-main: true, supported-targets: wasm, )main.mbt是入口文件读取标准输入的 JSON排序字段后输出fn main { // 从标准输入读取 JSON // 按字母顺序排序字段 // 输出结果 }SKILL.md是关键文件。它说明这个技能是什么、怎么调用、适合什么场景。平台会根据这个文件识别和展示你的技能。比如name: 你的用户名/json-sort description: 读取 JSON 文件按字母顺序排序字段后输出。json-sort用于整理 JSON 文件字段顺序方便代码审查和版本控制。用法moon runwasm 你的用户名/json-sort0.1.0input.json示例输入{b:2,a:1}输出{a:1,b:2}写好之后用moon publish把模块上传到 mooncakes.io。平台会自动检测到SKILL.md把它展示到 skills.mooncakes.io 上。别人不需要知道你的源码在哪也不需要手动编译只需要运行moon runwasm 你的用户名/json-sort0.1.0input.json就能看到结果。怎么发布怎么运行发布步骤不复杂写一个 MoonBit 模块。在项目中加上SKILL.md。确保可执行包声明is-main: true并且有效支持的后端包含wasm通过supported_targets显式声明或者默认支持所有后端且代码确实能在 Wasm 下编译通过。执行moon publish把模块上传到 mooncakes.io。平台会自动为支持 Wasm 后端的包构建 Wasm并用 wasm-opt 优化然后展示到skills.mooncakes.io。整个过程不用你自己手动编译 Wasm也不用写复杂的发布脚本上传之后平台自动搞定。运行moon runwasm目前是实验性命令experimental发布之后别人只需要一行命令moon runwasm 用户名/包名[版本号][参数]版本号可以省略省略时从 registry 解析最新版本已经下载过的会优先用本地缓存。比如moon runwasm Yoorkin/cowsay -- hello moon runwasm Yoorkin/cowsay0.1.2 -- hello如果模块里有多个可执行子包可以通过包路径指定入口。版本号可以放在模块名后也可以放在完整包路径后两种写法等价moon runwasm moonbitlang/parser/cmd/moonfmt0.3.7 moon runwasm moonbitlang/parser0.3.7/cmd/moonfmt给 Wasm 程序传参数时建议用--把moon runwasm的选项和要传给程序的参数分开moon runwasm Yoorkin/cowsay -- hello world这跟安装 Python 包、Node 包完全是两回事不需要虚拟环境不需要安装依赖也不会污染系统。跟传统方式对比一下假设你想用某个 JavaScript 工具传统流程可能是npminstall-g某个工具# 或者 npx 某个工具# 或者 clone 仓库 - npm install - npm run build这个过程中你大概率会遇到版本冲突、全局污染、Node 版本不兼容、依赖安装失败、网络问题等等。而用 MoonBit Skills只需要moon runwasm 作者/包版本就这一行。它能解决啥问题直接看几个场景。临时工具你临时想在终端里整点活比如生成个 cowsay 图案moon runwasm Yoorkin/cowsay0.1.2 -- hello用完即走不用安装不污染系统。CI/CD 脚本构建流程里需要某个文本处理工具。传统方式可能要拉 Docker 镜像或者配特定语言环境。用 MoonBit Skills 就一行命令省事。AI Agent 工具调用未来 AI Agent 可能会调用大量工具。如果每个工具都能打包成一个可解释、可执行、可分发的技能单元Agent 直接读SKILL.md就知道它是什么、怎么调用然后执行。跨团队协作你写了个内部格式化工具想给同事用。以前得发文档、配环境、教安装。现在直接给同事一个命令moon runwasm 你的用户名/格式化工具0.1.0他就能直接用。总结它解决的问题大致有这些发布工具麻烦。环境依赖复杂。运行不可控。跨平台兼容性差。可发现性差。可执行性差。一句话它让能力变得像 URL 一样容易被分享和调用。跟传统包管理比新在哪可能有人会问这不就是 npm、cargo、pip 干的事吗差别其实挺大的。我给大家列个表对比一下特性传统语言包管理MoonBit Skills分发对象源码包 依赖声明预构建的 Wasm 二进制依赖隔离有依赖树常有版本冲突技能互相独立没有依赖树沙箱隔离脚本可执行任意代码Wasm 沙箱隔离自我说明README 格式不统一标准 SKILL.mdAgent 可直接理解把包变成技能有人会说npx也是一行命令啊。但npx跑的是源码包背后还要解析依赖树、处理版本冲突、可能跑 postinstall 脚本。MoonBit Skills 跑的是平台已经构建好的 Wasm 二进制没有node_modules没有版本冲突也没有生命周期脚本。传统包管理管的是依赖你安装了一个包还得写代码去用它。MoonBit Skills 管的是能力找到一个技能直接就能执行。说白了传统包管理像给人发一堆零件MoonBit Skills 是直接给你一个装好的成品。Wasm 作为默认执行格式很多语言生态里Wasm 只是可选目标而在 MoonBit Skills 里Wasm 是默认的分发形态。选 Wasm 做分发格式不是随便定的。它有几个特别契合技能场景的优势跨平台一致同一份 Wasm 二进制在 Windows、macOS、Linux 上行为一致不用为不同系统分别打包。沙箱隔离Wasm 跑在受限环境里默认不能随意访问文件系统或网络比直接跑脚本更安全。无依赖、独立执行一个技能就是一个二进制没有node_modules那种依赖树也不会和系统里其他工具冲突。启动快、体积小经过 wasm-opt 优化后二进制体积小冷启动快很适合 CI/CD 和 Agent 工具调用。所以 MoonBit Skills 才能做到写完一个工具上传后别人直接一行命令跑起来。SKILL.md 作为能力描述标准这个设计挺有意思。SKILL.md用结构化的 frontmattername、description加 Markdown 正文统一了技能的描述方式。未来 AI Agent 要调用工具不用猜你的 API 怎么用读SKILL.md就知道命令格式和场景。语言级别的工具链整合moon runwasm是 MoonBit 工具链原生支持的命令不是第三方插件。从写代码到发布技能再到被别人运行整条链路都是原生打通的。对开发者意味着啥你写的工具不再只是自己的脚本而是可以被全世界直接运行的能力。不用写复杂的安装文档一行命令就能让别人用起来。不用为不同平台打包Wasm 帮你解决跨平台问题。你的能力更容易被 AI Agent 和其他工具发现并调用。对普通用户意味着啥看到一个工具不用研究源码不用配环境一行命令就能试。不污染系统不安装全局依赖。用完即走像调用一个本地命令一样自然。结语skills.mooncakes.io是 MoonBit 生态里一个挺有意思的尝试。它不只是让包更容易发布而是让能力变得更容易被分享、被发现、被调用。核心思路就三句话写一次工具。上传成一个技能。别人一行命令就能跑。它不是在发库而是在发能力说实话我个人挺看好这个方向。尤其是 AI Agent 越来越火之后这种「写完就能跑、跑完就能丢」的能力单元价值只会越来越大。不知道你怎么看呢欢迎在评论区留言。