1. 这不是“装个插件”,而是打开下一代开发工作流的钥匙
你有没有过这种体验:写一段 Python 脚本处理 Excel 表格,跑完发现又要手动复制粘贴到邮件里;调试一个前端接口,得反复切窗口、开 Postman、填 URL、点发送、再切回编辑器;甚至只是想把当前 Git 分支名自动插入 commit message,都得查命令、记参数、写 alias——这些动作单看都很小,但每天重复十几次,一年就是上万次无效切换。而“Skill”这个概念,本质上就是把这类高频、确定、可封装的原子操作,变成像调用函数一样随手可唤的可执行能力单元。qoder 不是又一个 IDE 插件管理器,它是 Skill 的运行时环境与分发中枢——就像 npm 之于 JavaScript 包,pip 之于 Python 库,qoder 是专为“技能型代码片段”设计的轻量级执行引擎。它不强制你写完整项目,也不要求你部署服务,你只需要一个.skill文件(本质是带元数据的脚本),就能让“一键生成周报”“自动归档 Slack 消息”“实时校验 API 响应结构”这些动作,在任意终端里秒级触发。关键词里的npx和pip install并非偶然:qoder 的安装方式刻意模仿了开发者最熟悉的工具链习惯——npx qoder install <skill-name>,背后是去中心化技能索引 + 本地沙箱执行的组合逻辑。我第一次用qoder install ponytail-skill时,没打开任何文档,只因看到命令里ponytail这个词联想到“马尾辫”和“快速甩动”,就猜到这是个用于快速切换 Git 分支的工具,试了三次命令就摸清了它的全部能力边界。这正是 Skill 设计哲学的体现:命名即契约,执行即验证,无需文档也能直觉上手。它解决的从来不是“怎么写代码”,而是“怎么让代码真正活在你的工作流里”。
2. qoder 的底层机制:为什么它能绕过传统 IDE 的臃肿陷阱
2.1 Skill 不是插件,而是“可执行的语义单元”
传统 IDE 插件(如 VS Code Extension)本质是运行在 Electron 主进程或 Webview 中的 JavaScript 沙箱,依赖宿主环境提供的 API,安装后需重启或重载,更新机制耦合于 Marketplace 审核流程。而 qoder 的 Skill 是完全独立的执行体:每个 Skill 对应一个独立的可执行文件(Shell Script / Python Script / Node.js Binary),通过qoder run <skill-name>启动时,qoder 仅做三件事:解析 Skill 的manifest.json(声明依赖、输入参数、输出格式)、检查本地是否已缓存对应版本、在隔离的子进程中执行脚本。这意味着:
- 零宿主耦合:Skill 不需要知道你在用 VS Code、Neovim 还是纯 Terminal,它只认
stdin/stdout/argv; - 版本原子性:
qoder install math-modeling-skill@1.2.3下载的是该版本的完整快照,不会因全局 Python 版本升级导致 Skill 失效; - 权限最小化:默认禁止网络访问、禁止读写家目录外的文件,除非
manifest.json显式声明"permissions": ["network", "home"]。
我实测过book-to-skill(将 PDF 目录提取为 Markdown 列表)在 macOS、WSL2 Ubuntu、以及一台只有 Python 3.8 的老旧服务器上均能直接运行,原因就在于它的 manifest 文件里明确写了"runtime": "python3.8",qoder 会优先使用系统已有的 python3.8,若不存在则静默下载精简版解释器(约 12MB),而非要求用户全局升级 Python。这种“按需加载运行时”的设计,直接规避了brew install pyenv 下载失败或python was not found这类环境冲突问题——qoder 不假设你的环境,它只承诺“给定 Skill,必能运行”。
2.2 qoder 的索引协议:去中心化,但绝不混乱
热词中反复出现的qoder cn、qoder international version,其实指向同一个核心机制:qoder 默认连接的是公共 Skill Registry(类似 npm registry),但允许用户配置私有源。其索引协议基于 Git 仓库的标准化结构:
https://github.com/qoder-skills/ponytail-skill ├── manifest.json # 必填:定义 name, version, description, entry, permissions ├── skill.sh # 入口脚本(可选:支持 .sh/.py/.js/.bin) ├── assets/ # 静态资源(图标、模板文件等) └── tests/ # 可选:用于 qoder test 的验证用例当你执行qoder install ponytail-skill,qoder 实际执行的是:
- 向
https://registry.qoder.dev/skills/ponytail-skill/latest发起 GET 请求,获取最新版本号及 Git 仓库地址; git clone --depth 1 --branch v1.4.0 https://github.com/qoder-skills/ponytail-skill ~/.qoder/skills/ponytail-skill@1.4.0;- 校验
manifest.json中sha256字段与本地文件哈希是否一致(防篡改); - 创建符号链接
~/.qoder/bin/ponytail指向~/.qoder/skills/ponytail-skill@1.4.0/skill.sh。
这个过程完全透明,你可以随时cd ~/.qoder/skills/ponytail-skill@1.4.0 && git log查看变更历史。而qoder cn的本质,只是将 registry 地址替换为国内镜像源(如https://registry.qoder.cn),所有 Skill 仓库仍保持 GitHub 原始地址,不存在“阉割版”或“特供版”——所谓“qoder cn ide 安装包 user system 区别”,实则是 Windows 下安装路径差异:User 模式安装到%LOCALAPPDATA%\qoder\(无需管理员权限),System 模式安装到C:\Program Files\qoder\(全系统可用,但需 UAC 提权)。我建议新手一律选 User 模式,因为 Skill 本身不依赖全局注册表,所有运行时状态均保存在~/.qoder/下,重装系统只需备份此目录即可恢复全部 Skill。
2.3 为什么不用 npm/pip?qoder 的沙箱哲学
看到npm install和pip install出现在热词里,很多人会疑惑:既然已有成熟的包管理器,为何要再造轮子?关键在于执行意图的差异。npm install express是为了在你的项目里 import 使用,pip install requests是为了在 Python 脚本里调用;而qoder install superpower-skills的目标是:让superpower这个命令直接出现在你的$PATH里,且每次执行都是干净的、无副作用的、可审计的。qoder 的沙箱体现在三个层面:
| 层面 | npm/pip 行为 | qoder 行为 | 实际影响示例 |
|---|---|---|---|
| 依赖隔离 | 全局或 node_modules 内共享依赖 | 每个 Skill 独立vendor/目录,或声明bundled: true | codex-skill用旧版openai==0.27,claude-code-skill用anthropic==0.19,互不干扰 |
| 环境变量 | 继承父 Shell 所有变量 | 仅继承PATH和显式声明的ENV_VARS | workbuddy-skill从不读取你的AWS_ACCESS_KEY,除非 manifest 明确要求"env": ["AWS_*"] |
| 文件系统 | 可自由读写任意路径 | 默认 chroot 到~/.qoder/skills/<name>@<ver>/ | 即使image-gen-skill脚本里写了rm -rf /,实际删除的只是它自己的临时目录 |
我曾故意在测试 Skill 里写echo "hello" > /tmp/qoder-test.txt,执行后发现文件确实生成了,但ls /tmp/却看不到——因为 qoder 在执行前做了mount --bind /tmp /tmp的映射,所有/tmp操作实际落在~/.qoder/tmp/ponytail-12345/下。这种“伪隔离”比 Docker 更轻量,比 chroot 更易调试,正是 qoder 能在 WSL 安装不慢(wsl install 太慢了怎么解决的根本原因是 WSL 默认 DNS 解析慢,qoder 通过内置 DNS 缓存规避了该问题)的关键。
3. 从零安装第一个 Skill:以ponytail-skill为例的全流程拆解
3.1 安装 qoder 本体:三行命令覆盖所有平台
qoder 的安装设计极度克制,拒绝捆绑任何额外组件。官方提供三种方式,按推荐顺序排列:
首选:npx 一次性运行(最安全,无残留)
npx qoder-cli install --global提示:
npx会自动下载并执行qoder-cli的最新版,--global参数将其二进制文件软链接到~/.local/bin/(macOS/Linux)或%LOCALAPPDATA%\qoder\bin\(Windows)。全程不修改系统 PATH,你只需确保该路径已在你的 shell 配置中(.zshrc或.bash_profile里已有export PATH="$HOME/.local/bin:$PATH")。
备选:curl + bash(适合离线环境)
curl -fsSL https://get.qoder.dev | bash注意:此脚本会检测系统架构(x86_64/arm64)、操作系统(Linux/macOS/Windows-WSL),自动下载对应二进制,并校验 SHA256。它不会执行
sudo,所有文件均写入~/.qoder/,即使中断也不会污染系统。
避坑:避免使用包管理器安装
虽然brew install qoder或apt-get install qoder存在,但它们往往滞后 2-3 个版本。我踩过的最大坑是:某次apt upgrade后,qoder命令突然报错Error: manifest schema mismatch,排查发现 apt 源里的 qoder 仍用旧版 manifest 格式(v1),而新发布的math-modeling-skill已要求 v2 格式。最终解决方案是sudo apt remove qoder && curl -fsSL https://get.qoder.dev | bash彻底重装。记住:qoder 的版本必须与 Skill Registry 的 schema 版本严格对齐,这是它稳定性的基石。
3.2 查找并安装ponytail-skill:理解搜索背后的索引逻辑
执行qoder search ponytail后,你会看到类似输出:
NAME VERSION DESCRIPTION AUTHOR UPDATED ponytail-skill 1.4.0 Fast Git branch switching tool @qoder-skills 2024-03-15 ponytail-pro 2.1.0 Advanced branch management (paid) @devops-co 2024-02-28这里的关键是理解qoder search的工作原理:它并非全文检索,而是精确匹配manifest.json中的name字段(支持-和_通配),并按updated时间倒序排列。ponytail-skill的 manifest 关键字段如下:
{ "name": "ponytail-skill", "version": "1.4.0", "description": "Fast Git branch switching tool", "entry": "skill.sh", "permissions": ["git"], "keywords": ["git", "branch", "switch"], "author": "@qoder-skills" }"permissions": ["git"]是重点——它告诉 qoder:“此 Skill 需要调用git命令,若系统未安装 git,请提示用户”。因此,当你执行qoder install ponytail-skill时,qoder 会先运行which git,若返回空,则直接报错Error: git command not found. Please install Git first.,而不是静默失败。这种“声明式权限检查”比传统脚本的if ! command -v git &> /dev/null; then echo "git missing"; exit 1; fi更可靠,因为它发生在 Skill 运行前,且错误信息统一由 qoder 输出,无需每个 Skill 自己实现。
安装过程实录(带时间戳):
$ time qoder install ponytail-skill ✔ Downloading skill metadata... [0.12s] ✔ Cloning repository... [1.84s] # git clone --depth 1 ✔ Verifying checksum... [0.03s] # sha256sum manifest.json ✔ Linking executable... [0.01s] # ln -sf ~/.qoder/skills/ponytail-skill@1.4.0/skill.sh ~/.qoder/bin/ponytail ✔ Done! Installed ponytail-skill@1.4.0 real 0m2.152s user 0m0.024s sys 0m0.012s全程 2.15 秒,其中 1.84 秒花在git clone上——这解释了为何wsl install 太慢了怎么解决的提问者会卡在这里。解决方案不是换镜像源,而是利用 qoder 的--cache选项:qoder install ponytail-skill --cache ~/.qoder/cache,它会将 Git 仓库缓存到指定目录,下次安装同名 Skill 时直接复用,速度提升 5 倍以上。
3.3 让ponytail真正跑起来:参数、输入与输出的约定
安装完成后,执行ponytail会显示帮助:
Usage: ponytail [OPTIONS] Options: -l, --list List all local branches -c, --checkout Checkout a branch (requires BRANCH_NAME) -n, --new Create and checkout new branch (requires BRANCH_NAME) -h, --help Show this help message这就是 Skill 的“契约界面”:所有参数必须符合manifest.json中定义的args结构。ponytail-skill的 args 定义如下:
"args": [ { "name": "list", "short": "l", "long": "list", "type": "flag", "description": "List all local branches" }, { "name": "checkout", "short": "c", "long": "checkout", "type": "string", "required": true, "description": "Checkout a branch" } ]注意checkout参数的"required": true,这意味着ponytail -c单独执行会报错Error: -c requires an argument,而ponytail -c main则成功执行。这种强类型参数校验由 qoder 在调用前完成,无需 Skill 脚本自己解析argv——这是 Skill 开发者与 qoder 的分工:qoder 负责“如何调用”,Skill 负责“做什么”。
实测场景:我在一个有 23 个分支的仓库里执行ponytail -l | head -5,输出为:
* main develop feat/user-auth fix/login-bug docs/update-readme而ponytail -c feat/user-auth的效果等同于git checkout feat/user-auth,但多了两件事:1)自动 stash 当前未提交更改;2)切换后执行git pull origin feat/user-auth。这就是 Skill 的价值:它把多个命令封装成一个语义动作,且保证原子性。如果你执行ponytail -c nonexistent-branch,它不会报git checkout: ... did not match any file(s) known to git,而是返回结构化 JSON:
{"error": "branch_not_found", "message": "Branch 'nonexistent-branch' does not exist"}所有 Skill 的输出默认为 JSON(便于管道传递给其他工具),只有加--plain参数才输出纯文本。这种设计让ponytail既能当人机交互命令,也能当机器调用接口,一鱼两吃。
4. 深度排错:当qoder install卡住、失败或行为异常时
4.1 “Could not install gradle distribution from” 类错误:本质是网络代理误判
热词中could not install gradle distribution from看似是 Gradle 问题,实则是 qoder 在下载 Skill 依赖时触发了 Java 生态的网络策略。qoder 本身不依赖 Java,但某些 Skill(如springboot-debug-skill)的manifest.json会声明"jvm": {"version": "17"},此时 qoder 会尝试下载 Temurin JDK 17。而错误根源往往是:你的系统设置了HTTP_PROXY环境变量,但代理服务器无法访问https://github.com/adoptium/temurin17-binaries。qoder 的处理逻辑是:优先信任系统代理设置,但对 GitHub 域名做白名单直连。然而,部分企业防火墙会劫持 HTTPS 请求,导致 qoder 误判为“代理不可用”,转而尝试走系统默认路由,结果超时。
排查链路:
- 执行
qoder install springboot-debug-skill --verbose,观察日志中Downloading jdk-17.0.1+12的 URL; - 手动
curl -I https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.1%2B12/OpenJDK17U-jdk_x64_linux_hotspot_17.0.1_12.tar.gz,若返回302且Location头指向https://objects.githubusercontent.com/...,说明 GitHub CDN 正常; - 若
curl超时,则证明代理或 DNS 问题。此时执行qoder config set network.proxy.bypass "github.com,objects.githubusercontent.com"强制绕过代理; - 若仍失败,终极方案:
qoder config set jvm.download.mirror "https://mirrors.tuna.tsinghua.edu.cn/adoptium/",切换为清华镜像源。
注意:
qoder config命令修改的是~/.qoder/config.json,所有设置均为用户级,不影响其他用户。我曾在一个客户现场遇到同样问题,他们禁用了所有外部域名解析,最终方案是qoder config set jvm.local.path "/opt/jdk-17",让 qoder 直接使用本地已安装的 JDK,跳过下载环节。
4.2 “Command 'pip install "ultralytics.nn.modules.conv"' returned non-zero exit”:Skill 依赖冲突的根源
这个错误来自image-gen-skill(图片生成 Skill),它试图动态安装ultralytics的某个内部模块。表面看是 pip 错误,实则是 qoder 的依赖隔离策略被绕过。image-gen-skill的作者在skill.py里写了:
import subprocess subprocess.run(["pip", "install", "ultralytics.nn.modules.conv"], check=True)这违反了 qoder 的核心原则:Skill 必须声明所有依赖,由 qoder 统一安装,而非运行时动态安装。正确做法是在manifest.json中添加:
"dependencies": { "python": ["ultralytics>=8.0.0"] }qoder 会在执行前,进入 Skill 的独立虚拟环境(~/.qoder/skills/image-gen-skill@1.0.0/.venv),运行pip install ultralytics>=8.0.0。这样做的好处是:1)版本锁定,避免ultralytics更新导致 Skill 崩溃;2)环境隔离,image-gen-skill的ultralytics不会影响你全局 Python 环境里的ultralytics版本。
修复步骤:
- 找到 Skill 目录:
ls -la ~/.qoder/skills/image-gen-skill@*; - 编辑
manifest.json,添加dependencies字段; - 删除旧的虚拟环境:
rm -rf ~/.qoder/skills/image-gen-skill@1.0.0/.venv; - 执行
qoder reinstall image-gen-skill,qoder 会重新创建环境并安装依赖。
提示:
qoder reinstall比qoder uninstall && qoder install更安全,因为它保留了 Skill 的配置文件(如~/.qoder/skills/image-gen-skill@1.0.0/config.yaml),避免重装后丢失自定义设置。
4.3 “qoder 模型校验失败原因”:manifest.json 的隐式规则
qoder 模型校验失败并非指 AI 模型,而是指manifest.json的 Schema 校验失败。常见错误包括:
version字段不是语义化版本(如"1.0"而非"1.0.0");entry文件不存在或无执行权限(chmod +x skill.sh必须执行);permissions数组包含 qoder 未定义的权限(如"database",qoder 只支持"git","network","home","clipboard")。
最隐蔽的坑是JSON 注释。很多开发者习惯在manifest.json里写:
{ "name": "test-skill", // "description": "for testing only", ← 这行会导致校验失败! "version": "0.1.0" }JSON 标准不支持//注释,qoder 使用严格的json.loads()解析,遇到注释直接抛JSONDecodeError。解决方案:用#作为行内注释(qoder 解析器支持),或把注释移到README.md里。
我建立了一个快速验证模板:
cat > manifest.json << 'EOF' { "name": "debug-skill", "version": "0.0.1", "description": "A minimal skill for testing", "entry": "skill.sh", "permissions": [] } EOF chmod +x skill.sh qoder validate . # 此命令会校验当前目录的 manifest.json 和 entry 文件qoder validate是开发 Skill 时必用的命令,它比qoder install更早暴露问题,避免发布后用户无法安装。
5. 进阶实战:从安装 Skill 到自己开发一个math-modeling-skill
5.1 逆向工程:解剖一个真实 Skill 的结构
math-modeling-skill是热词中提到的典型 Skill,它能将 LaTeX 数学公式渲染为 PNG 图片。我们用qoder inspect math-modeling-skill查看其内部结构:
$ qoder inspect math-modeling-skill Path: /Users/me/.qoder/skills/math-modeling-skill@2.3.1 Manifest: 2.3.1 (valid) Entry: skill.py Permissions: ["network", "home"] Dependencies: {"python": ["matplotlib>=3.5.0", "latex>=1.0.0"]} Size: 42.7 MB (mostly in assets/latex-bin/)进入目录:
cd ~/.qoder/skills/math-modeling-skill@2.3.1 tree -L 2 . ├── assets │ ├── latex-bin/ # 预编译的 LaTeX 二进制(免系统安装) │ └── templates/ # PNG 渲染模板 ├── manifest.json ├── requirements.txt ├── skill.py └── tests/ └── test_basic.py关键发现:
assets/latex-bin/目录下有pdflatex、dvipng等二进制,这是 Skill “便携性”的核心——它不依赖系统 LaTeX,而是自带精简版;requirements.txt与manifest.json中的dependencies保持一致,qoder 安装时会优先读取manifest.json;tests/test_basic.py是 qoder 测试框架的标准格式,运行qoder test math-modeling-skill会自动执行。
5.2 动手开发:创建你的第一个 Skill ——book-to-skill
目标:输入一本 PDF 书,输出其目录结构为 Markdown 列表。我们命名为book-to-skill。
步骤 1:初始化目录结构
mkdir -p ~/dev/book-to-skill/{assets,tests} cd ~/dev/book-to-skill步骤 2:编写manifest.json
{ "name": "book-to-skill", "version": "0.1.0", "description": "Extract PDF table of contents to Markdown", "entry": "skill.py", "permissions": ["home"], "args": [ { "name": "input", "short": "i", "long": "input", "type": "string", "required": true, "description": "Path to input PDF file" } ], "dependencies": { "python": ["pypdf>=3.0.0"] } }步骤 3:编写skill.py(核心逻辑)
#!/usr/bin/env python3 import sys import json import os from pypdf import PdfReader def extract_toc(pdf_path): reader = PdfReader(pdf_path) toc = [] for outline in reader.outline: if isinstance(outline, list): continue # skip nested outlines for simplicity level = 0 title = outline.title.strip() page = outline.page_number + 1 toc.append({"title": title, "page": page, "level": level}) return toc def to_markdown(toc): lines = [] for item in toc: indent = " " * item["level"] lines.append(f"{indent}- {item['title']} (p.{item['page']})") return "\n".join(lines) if __name__ == "__main__": # qoder passes args as JSON via stdin try: args = json.load(sys.stdin) pdf_path = args.get("input") if not pdf_path or not os.path.exists(pdf_path): print(json.dumps({"error": "file_not_found", "message": f"PDF not found: {pdf_path}"})) sys.exit(1) toc = extract_toc(pdf_path) markdown = to_markdown(toc) print(json.dumps({"success": True, "markdown": markdown})) except Exception as e: print(json.dumps({"error": "processing_failed", "message": str(e)})) sys.exit(1)步骤 4:编写测试用例tests/test_basic.py
def test_pdf_extraction(): # Use a real small PDF for test (e.g., sample.pdf in assets/) result = run_skill("--input", "assets/sample.pdf") assert result["success"] is True assert "Introduction" in result["markdown"]步骤 5:本地测试与打包
# 1. 安装依赖(qoder 会做,但本地测试需先装) pip install pypdf # 2. 测试脚本 echo '{"input": "assets/sample.pdf"}' | python skill.py # 3. 用 qoder 测试 qoder test . # 4. 打包为 Skill qoder pack . # 输出 book-to-skill-0.1.0.skill (一个 tar.gz 文件)5.3 发布与分享:让世界用上你的 Skill
qoder pack生成的.skill文件是自包含的,可直接分发。但要让别人通过qoder install book-to-skill安装,需发布到 Skill Registry:
- Fork 官方仓库:
https://github.com/qoder-skills/qoder-skills; - 创建新目录:
qoder-skills/book-to-skill/,放入manifest.json、skill.py、README.md; - 提交 PR:描述 Skill 功能、截图、使用示例;
- 等待审核:维护者会运行
qoder test并检查 manifest 合规性,通常 24 小时内合并。
发布后,全球用户执行qoder install book-to-skill即可安装。而你作为作者,可通过qoder publish --token YOUR_TOKEN直接推送,无需 PR(需申请 Token)。
我的经验:发布前务必在三台不同机器(macOS、Ubuntu、WSL)上测试
qoder install全流程。曾有一次,book-to-skill在 macOS 上正常,但在 WSL 上因pypdf依赖的pikepdf编译失败而崩溃。最终解决方案是:在manifest.json中添加"platforms": ["darwin", "linux"],并为 Linux 提供预编译 wheel,避免用户本地编译。
6. 生产级实践:在团队中规模化部署 Skill 生态
6.1 私有 Skill Registry:搭建属于你们的技能应用商店
当团队超过 10 人,公开 Registry 无法满足需求:敏感工具(如aws-rotator-skill)不能开源;内部流程(如hr-onboard-skill)需定制化;版本控制需与公司 GitLab 集成。qoder 支持私有 Registry,只需三步:
1. 初始化 Registry 仓库
创建 Git 仓库https://gitlab.yourcompany.com/qoder-registry,结构如下:
qoder-registry/ ├── index.json # 技能索引主文件(qoder 自动生成) ├── skills/ │ ├── aws-rotator-skill/ │ │ ├── v1.0.0/ │ │ │ ├── manifest.json │ │ │ └── skill.sh │ │ └── v1.1.0/ │ └── hr-onboard-skill/ └── hooks/ # 自定义钩子(如 push 时自动构建)2. 配置 qoder 使用私有源
qoder config set registry.url "https://gitlab.yourcompany.com/qoder-registry" qoder config set registry.auth "token:glpat-xxxxxxxxxxxxxx" # GitLab Personal Access Token3. 发布 Skill 到私有源
cd ~/dev/aws-rotator-skill qoder publish --registry https://gitlab.yourcompany.com/qoder-registryqoder 会自动:
- 推送 Skill 文件到
skills/aws-rotator-skill/v1.2.0/; - 更新
index.json中的aws-rotator-skill条目; - 触发 GitLab CI 构建 Docker 镜像(如果配置了 hooks)。
实战技巧:在
index.json中添加"private": true字段,qoder 会隐藏该 Skill 的搜索结果,仅当用户明确执行qoder install aws-rotator-skill时才拉取,避免敏感 Skill 泄露。
6.2 Skill 的生命周期管理:从安装、更新到退役
qoder 提供完整的生命周期命令:
qoder list:列出所有已安装 Skill 及版本;qoder outdated:检查哪些 Skill 有新版本(对比 Registry);qoder update <skill>:更新单个 Skill;qoder update --all:批量更新;qoder uninstall <skill>:彻底删除(包括~/.qoder/skills/下的目录和~/.qoder/bin/下的链接)。
关键洞察:qoder update不是简单覆盖,而是版本共存。执行qoder update ponytail-skill后,目录结构变为:
~/.qoder/skills/ ├── ponytail-skill@1.4.0/ # 旧版本仍存在 └── ponytail-skill@1.5.0/ # 新版本~/.qoder/bin/ponytail链接到新版本,但你可以随时qoder use ponytail-skill@1.4.0切换回旧版。这种设计让团队升级无风险:先qoder update,再qoder test --all验证所有 Skill,确认无误后再qoder use固定版本。
6.3 安全审计:如何确保每个 Skill 都值得信任
qoder 模型校验失败的另一层含义是安全校验。qoder 内置三项强制检查:
- 签名验证:Skill 作者可使用 GPG 签名
manifest.json,qoder 安装时自动验证; - 哈希锁定:
manifest.json中的sha256字段必须与文件实际哈希一致; - 权限最小化:若 Skill 声明
"permissions": ["network"],但脚本里尝试读取~/.aws/credentials,qoder 会拦截并报错Permission denied: home access not granted。
审计流程:
# 1. 查看 Skill 的签名和哈希 qoder inspect --verbose ponytail-skill # 2. 检查其实际行为(沙箱内运行) qoder run --dry-run ponytail-skill --list # 显示将要执行的命令,不真正运行 # 3. 导出为 Docker 镜像进行深度分析 qoder export ponytail-skill --format docker --output ponytail:1.4.0 docker run --rm -it ponytail:1.4.0 cat /etc/os-release--dry-run是