版本历史
- 0.8.1最新
搜索没有合适的技能时,可以翻页或换个说法再搜一次(原来是同一个任务只搜一次)
2026-11-02与 0.8.0 对比
操作步骤改为每个对话第一次用灵栈时读 https://lingzhanskill.com/helper.md,以后改步骤不用再更新助手;MCP 主地址改为 https://api.lingzhanskill.com/mcp,备用地址 https://lingzhanskill.com/mcp
2026-10-26与 0.7.1 对比
更正 0.7.0 的变更说明:那一版实际新增的是积分与等级(看用户的积分、等级和明细),0.7.0 的说明误写成了 0.6.0 的内容
2026-10-24与 0.7.0 对比
看技能评论;用户同意后替用户发评论、回复,查看站内信
2026-10-24与 0.6.0 对比
看技能评论;用户同意后替用户发评论、回复,查看站内信
2026-10-23与 0.5.0 对比
请求灵栈时带上匿名装机编号、客户端、系统,装完报告一次结果,用来统计使用情况;用户说“灵栈不要统计”就不再带
2026-10-23与 0.4.1 对比
安装时能找到更多客户端的技能目录(Trae、Qoder、通义灵码、CodeBuddy、Qwen Code 等)
2026-10-23与 0.4.0 对比
让每个新对话都记得灵栈:接入时把灵栈规则写进 AI 的全局设置,规则和助手过期会自动提醒更新;动手做任务前先在灵栈搜一次
2026-10-22与 0.3.3 对比
发布说明补充:在 SKILL.md 旁放 icon.png 即可作为技能图标;用户还没设置作者信息时,问过用户后替用户设置;介绍技能时作者声明与平台识别两份都说;不一致时按风险更高的说
2026-10-22与 0.3.1 对比
发布说明补上来源和许可证的写法:原创或不说明来源时不选许可证就按 MIT 发布,来自别人的项目必须选,和原项目一致
2026-10-21与 0.3.0 对比
安装改为在临时目录解压、SKILL.md 最后复制,修复 Windows 上客户端监视技能目录时装不上、留下半成品的问题;检查更新:一次查所有已装技能,最多 7 天一次,权限有变化时逐条确认;更新的备份放到技能目录以外;任务收尾时可以问一次要不要把用户自己做的技能发布到灵栈(先查隐私)
2026-10-19与 0.2.0 对比
新增:替作者把技能发布到灵栈(浏览器里点一次“允许”授权);说明改为“发布前自动检查,官方与精选经过人工审核”
2026-10-18与 0.1.1 对比
介绍技能时先讲用途,再讲条件、权限与脚本,来源和许可证一句话带过;补充“官方精选”说明
2026-10-17与 0.1.0 对比
首个版本:搜索、介绍、确认、下载、核对 SHA-256、安装与更新说明
2026-10-17
版本对比
改动了 2 个文件,1 个文件没有变化;共增加 97 行,删除 17 行。
SKILL.md
+96 −16查看文件| ⋯ 未改动的行 ⋯ | |||
| 79 | 79 | ||
| 80 | 80 | 只在项目里使用时,换成项目下的 `.agents/skills/` 或 `.claude/skills/`。 | |
| 81 | 81 | ||
| 82 | 增加: | 安装的三条规矩(客户端会一直监视技能目录,违反了容易“看起来装好了、其实装了一半”): | |
| 83 | 增加: | ||
| 84 | 增加: | - 在系统临时目录里下载、核对、解压,不在技能目录里解压,也不在技能目录里改名或移动文件夹 | |
| 85 | 增加: | (Windows 上客户端监视这个目录时,改名会被拒绝)。 | |
| 86 | 增加: | - 技能文件要直接放在 `<技能目录>/<slug>/` 下:包里的 `SKILL.md` 可能在唯一的子文件夹里, | |
| 87 | 增加: | 要从那个子文件夹复制。客户端只认 `<slug>/SKILL.md`。 | |
| 88 | 增加: | - **`SKILL.md` 最后复制**。没有 `SKILL.md` 的文件夹客户端不会当成技能,中途失败也不会出现半成品。 | |
| 89 | 增加: | ||
| 82 | 90 | Windows PowerShell(把前两行换成要装的技能、详情里的 `latest_version` 和当前客户端的目录): | |
| 83 | 91 | ||
| 84 | 92 | ```powershell | |
| 85 | 93 | $owner = "lingzhan"; $slug = "pdf"; $version = "0.1.0" | |
| 86 | 94 | $dest = Join-Path $HOME ".agents\skills\$slug" | |
| 87 | 95 | $api = "https://lingzhanskill.com/api/v1" | |
| 88 | 删除: | if (Test-Path $dest) { throw "已经有 $dest,先问用户是否替换" } | |
| 96 | 增加: | [Net.ServicePointManager]::SecurityProtocol = [Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls12 | |
| 97 | 增加: | if (Test-Path $dest) { throw "已经有 $dest,先问用户是否替换(更新的步骤见下文)" } | |
| 89 | 98 | $grant = Invoke-RestMethod -Method Post "$api/skills/$owner/$slug/versions/$version/download" | |
| 90 | 99 | $tmp = Join-Path ([IO.Path]::GetTempPath()) ("lingzhan-" + [guid]::NewGuid()) | |
| 91 | 100 | New-Item -ItemType Directory $tmp | Out-Null | |
| 92 | 删除: | $zip = Join-Path $tmp "$slug.zip" | |
| 101 | 增加: | $zip = Join-Path $tmp "pkg.zip" | |
| 93 | 102 | Invoke-WebRequest -UseBasicParsing $grant.url -OutFile $zip | |
| 94 | 103 | if ((Get-FileHash $zip -Algorithm SHA256).Hash.ToLower() -ne $grant.sha256) { | |
| 95 | 104 | Remove-Item -Recurse -Force $tmp; throw "SHA-256 不一致,已停止安装" | |
| 96 | 105 | } | |
| 97 | 删除: | New-Item -ItemType Directory -Force (Split-Path $dest) | Out-Null | |
| 98 | 删除: | $part = "$dest.partial" | |
| 99 | 删除: | if (Test-Path $part) { Remove-Item -Recurse -Force $part } | |
| 100 | 删除: | Expand-Archive $zip -DestinationPath $part | |
| 106 | 增加: | Expand-Archive $zip -DestinationPath (Join-Path $tmp "pkg") | |
| 107 | 增加: | $skill = Get-ChildItem (Join-Path $tmp "pkg") -Recurse -Depth 1 -File -Filter "SKILL.md" | | |
| 108 | 增加: | Sort-Object { $_.FullName.Length } | Select-Object -First 1 | |
| 109 | 增加: | if (-not $skill) { Remove-Item -Recurse -Force $tmp; throw "包里没有 SKILL.md" } | |
| 110 | 增加: | $root = $skill.Directory.FullName | |
| 101 | 111 | @{ source = "lingzhanskill.com"; owner = $owner; slug = $slug; version = $version; sha256 = $grant.sha256 } | | |
| 102 | 删除: | ConvertTo-Json | Set-Content -Encoding UTF8 (Join-Path $part ".lingzhan.json") | |
| 103 | 删除: | Rename-Item $part (Split-Path $dest -Leaf) | |
| 112 | 增加: | ConvertTo-Json | Set-Content -Encoding UTF8 (Join-Path $root ".lingzhan.json") | |
| 113 | 增加: | New-Item -ItemType Directory -Force $dest | Out-Null | |
| 114 | 增加: | Get-ChildItem $root -Force | Where-Object { $_.Name -ne $skill.Name } | | |
| 115 | 增加: | Copy-Item -Destination $dest -Recurse -Force | |
| 116 | 增加: | Copy-Item $skill.FullName (Join-Path $dest "SKILL.md") | |
| 117 | 增加: | $want = (Get-ChildItem $root -Recurse -File -Force).Count | |
| 118 | 增加: | $got = (Get-ChildItem $dest -Recurse -File -Force).Count | |
| 104 | 119 | Remove-Item -Recurse -Force $tmp | |
| 120 | 增加: | if ($got -ne $want) { | |
| 121 | 增加: | Remove-Item -Force (Join-Path $dest "SKILL.md") | |
| 122 | 增加: | throw "复制不完整($got / $want),已删除 SKILL.md,客户端不会加载它;请重试" | |
| 123 | 增加: | } | |
| 105 | 124 | ``` | |
| 125 | 增加: | ||
| 126 | 增加: | Windows PowerShell 5.1 访问灵栈报 TLS 错误、上面加了 Tls12 也不行时,可以改用 Node(`fetch`)或 | |
| 127 | 增加: | Python(`urllib`、`zipfile`)完成同样的几步:取下载链接、下载、核对 SHA-256、解压、按上面的规矩复制。 | |
| 128 | 增加: | 用 Python 时请求头要带 `User-Agent`(例如 `lingzhan-skills`),不带会被网站的防护拦下(403)。 | |
| 106 | 129 | ||
| 107 | 130 | macOS / Linux: | |
| 108 | 131 | ||
| ⋯ 未改动的行 ⋯ | |||
| 113 | 136 | curl -fsS -X POST "https://lingzhanskill.com/api/v1/skills/$owner/$slug/versions/$version/download" | |
| 114 | 137 | ``` | |
| 115 | 138 | ||
| 116 | 删除: | 从返回的 JSON 里取出 `url` 与 `sha256`,接着: | |
| 139 | 增加: | 从返回的 JSON 里取出 `url` 与 `sha256`,接着(没有 `unzip` 时可以用 `python3 -m zipfile -e pkg.zip pkg`): | |
| 117 | 140 | ||
| 118 | 141 | ```bash | |
| 119 | 142 | tmp=$(mktemp -d) | |
| 120 | 143 | curl -fsS -o "$tmp/pkg.zip" "<url>" | |
| 121 | 删除: | echo "<sha256> $tmp/pkg.zip" | shasum -a 256 -c - # Linux 也可以用 sha256sum -c - | |
| 122 | 删除: | unzip -q "$tmp/pkg.zip" -d "$tmp/pkg" && mkdir -p "$(dirname "$dest")" && mv "$tmp/pkg" "$dest" | |
| 144 | 增加: | echo "<sha256> $tmp/pkg.zip" | shasum -a 256 -c - || { rm -rf "$tmp"; exit 1; } # Linux 也可以用 sha256sum | |
| 145 | 增加: | unzip -q "$tmp/pkg.zip" -d "$tmp/pkg" | |
| 146 | 增加: | skill=$(find "$tmp/pkg" -maxdepth 2 -type f -iname SKILL.md | awk '{ print length, $0 }' | sort -n | head -1 | cut -d" " -f2-) | |
| 147 | 增加: | [ -n "$skill" ] || { echo "包里没有 SKILL.md"; rm -rf "$tmp"; exit 1; } | |
| 148 | 增加: | root=$(dirname "$skill") | |
| 123 | 149 | printf '{"source":"lingzhanskill.com","owner":"%s","slug":"%s","version":"%s","sha256":"%s"}\n' \ | |
| 124 | 删除: | "$owner" "$slug" "$version" "<sha256>" > "$dest/.lingzhan.json" | |
| 150 | 增加: | "$owner" "$slug" "$version" "<sha256>" > "$root/.lingzhan.json" | |
| 151 | 增加: | mv "$skill" "$tmp/SKILL.md" | |
| 152 | 增加: | mkdir -p "$dest" && cp -R "$root/." "$dest/" && cp "$tmp/SKILL.md" "$dest/SKILL.md" | |
| 125 | 153 | rm -rf "$tmp" | |
| 126 | 154 | ``` | |
| 127 | 155 | ||
| 128 | 删除: | 装好后告诉用户装在哪里。客户端一般会自动发现新技能;没有出现时,请用户重启客户端。 | |
| 156 | 增加: | 装好后用一两句话告诉用户:装在哪里、来自哪里(例如“来自灵栈,作者是灵栈官方,版本 0.1.0”), | |
| 157 | 增加: | 并提一句“以后说‘灵栈更新’,我帮你查有没有新版本”。客户端一般会自动发现新技能;没有出现时,请用户重启客户端。 | |
| 129 | 158 | ||
| 130 | 删除: | ## 更新 | |
| 159 | 增加: | 卸载:先删 `SKILL.md`,再删整个文件夹。 | |
| 131 | 160 | ||
| 132 | 删除: | 已装技能的 `.lingzhan.json` 记录了来源和版本。用户要更新时,用详情接口查看 `latest_version`; | |
| 133 | 删除: | 有新版本就把变更说明告诉用户,同意后先把旧目录移到临时目录作为备份,再按第三步安装,成功后删除备份。 | |
| 161 | 增加: | ## 检查更新与更新 | |
| 162 | 增加: | ||
| 163 | 增加: | 从灵栈装的技能,文件夹里有 `.lingzhan.json`(来源 `lingzhanskill.com`、owner、slug、版本、sha256)。 | |
| 164 | 增加: | 只认技能目录下一层、带 `.lingzhan.json` 的文件夹。 | |
| 165 | 增加: | ||
| 166 | 增加: | **什么时候检查**(只检查,不下载):用户说“灵栈更新”“检查技能更新”时;或者你在用这个技能、 | |
| 167 | 增加: | 而 `~/.lingzhan/state.json` 里的 `checked_at` 已经超过 7 天(没有这个文件也算)。不足 7 天就不要主动检查, | |
| 168 | 增加: | 也不要每次用技能都查。 | |
| 169 | 增加: | ||
| 170 | 增加: | **怎么检查**:把所有已装技能拼成一次请求(最多 50 个): | |
| 171 | 增加: | `GET /skills/updates?pairs=lingzhan/[email protected],github/[email protected]`。 | |
| 172 | 增加: | 只返回有新版本、或已装版本被撤回的技能。查完把当前时间写回 `~/.lingzhan/state.json` 的 `checked_at`, | |
| 173 | 增加: | 有没有更新都写。 | |
| 174 | 增加: | ||
| 175 | 增加: | **怎么告诉用户**:一次说完,例如“你有 2 个技能可以更新”,每个一行:旧版本 → 新版本、`changes` 里的第一条、 | |
| 176 | 增加: | 权限有没有变化。`permission_delta` 为 `none` 时说“权限没有变化”;为 `added` 时把 `added_permissions` | |
| 177 | 增加: | 逐条列出来,请用户确认;`installed_withdrawn` 为 true 时说明已装的版本被撤回了,建议更新或卸载。 | |
| 178 | 增加: | 用户同意前不下载、不替换。 | |
| 179 | 增加: | ||
| 180 | 增加: | **怎么更新**(用户同意后,一个一个来): | |
| 181 | 增加: | ||
| 182 | 增加: | 1. 备份到技能目录以外:把旧文件夹**复制**到 `~/.lingzhan/backups/<slug>-<旧版本>/`。 | |
| 183 | 增加: | 不要把备份放在技能目录里,客户端会把它当成另一个同名技能。 | |
| 184 | 增加: | 2. 删除旧文件夹:先删 `SKILL.md`,再删其余文件。 | |
| 185 | 增加: | 3. 按第三步安装新版本。失败时从备份复制回来(`SKILL.md` 最后复制)。 | |
| 186 | 增加: | 4. 告诉用户新版本号和 SHA-256 前 8 位,例如“已更新到 0.1.1(a1b2c3d4),权限没有变化。 | |
| 187 | 增加: | 不满意可以说‘回滚’”。回滚:从备份复制回来,或者重新安装旧版本(没被撤回的旧版本一直可以下载)。 | |
| 188 | 增加: | 5. 用户确认没问题后,再删除备份。 | |
| 134 | 189 | ||
| 135 | 190 | ## 发布用户自己的技能 | |
| 136 | 191 | ||
| 137 | 192 | 用户请你把一个技能文件夹发布到灵栈时,按下面做。完整说明(错误码、各种情况)在 | |
| 138 | 193 | https://lingzhanskill.com/publish.md ,遇到这里没写的情况就读它。 | |
| 139 | 194 | ||
| 195 | 增加: | **可以在任务收尾时问一句**:下面三条同时成立时,在任务结束时(不要在开头或中途)问一次 | |
| 196 | 增加: | “这个技能已经跑通了,要不要发布到灵栈?发布后所有人可见,也能随时撤回;不想的话就留在本地。” | |
| 197 | 增加: | ||
| 198 | 增加: | 1. 这次任务里新建或大改了一个技能(`<技能目录>/<slug>/SKILL.md`),而且它不是从灵栈装的 | |
| 199 | 增加: | (没有 `.lingzhan.json`); | |
| 200 | 增加: | 2. 这个技能至少成功用过一次; | |
| 201 | 增加: | 3. 用户对结果满意,没有返工或抱怨。 | |
| 202 | 增加: | ||
| 203 | 增加: | 只问一次。用户说不要,就在这个技能文件夹的 `.lingzhan-local.json` 里写 `{"publish_declined": true}`, | |
| 204 | 增加: | 以后不再问。不要说“我帮你传上去吧”这类预设答案的话。 | |
| 205 | 增加: | ||
| 206 | 增加: | **先查隐私,再问**:发布是公开的,已经被下载的收不回来。问之前先在要发布的文件里找下面这些, | |
| 207 | 增加: | 找到就把文件名、行号和这一行(密钥只显示前 4 个字符)列给用户,请用户先处理,处理完再问: | |
| 208 | 增加: | ||
| 209 | 增加: | - 绝对路径和用户名,例如 `C:\Users\<名字>\`、`/home/<名字>/`、`/Users/<名字>/`; | |
| 210 | 增加: | - 内网地址和内部域名,例如 `10.`、`192.168.`、`172.16`~`172.31` 开头的地址,`.internal`、`.corp`、`.local`; | |
| 211 | 增加: | - 密钥和凭据,例如 `sk-`、`ghp_`、`AKIA`、`-----BEGIN`、`password=`、`.env` 文件; | |
| 212 | 增加: | - 公司、客户、项目代号,手机号、邮箱、身份证号等个人信息。 | |
| 213 | 增加: | ||
| 140 | 214 | **先确认**:文件夹里必须有 `SKILL.md`(在最上层,或在唯一的子文件夹里)。向用户确认文件夹、 | |
| 141 | 215 | 技能标识(小写字母、数字、连字符,例如 `weekly-report`)、显示名称和一句话描述。 | |
| 142 | 216 | 发布后所有人都能看到和下载,不要包含密钥、密码、`.env`、私人数据或 `.git` 目录。 | |
| 143 | 217 | 最多 500 个文件,ZIP 不超过 20MB。 | |
| 218 | 增加: | ||
| 219 | 增加: | **写清楚它是什么**:`SKILL.md` 开头的 `name` 用小写字母和连字符;`description` 用中文写清楚用途。 | |
| 220 | 增加: | 正文开头最好有两三行中文说明:能做什么、带不带脚本、联不联网、写不写文件。 | |
| 221 | 增加: | 客户端只读 `SKILL.md`,这几行是用户和 AI 一定能看到的。 | |
| 144 | 222 | ||
| 145 | 223 | **取得授权(只需要一次)**:已经保存过以 `lzk_` 开头的发布密钥就跳过。 | |
| 146 | 224 | ||
| ⋯ 未改动的行 ⋯ | |||
| 164 | 242 | 4. 每 5 秒 `GET /agent/releases/<slug>/<version>`,最多 3 分钟。`stage` 为 `published` 时把 `url` 告诉用户; | |
| 165 | 243 | `in_review` 是交给灵栈人工审核了;`blocked` 时 `problems` 是原因,和用户一起改好后重新打包发布。 | |
| 166 | 244 | `message` 可以直接转告用户。 | |
| 245 | 增加: | 5. 发布后告诉用户:公开页面地址;在 https://lingzhanskill.com/account/skills 能看到它、能撤回。 | |
| 167 | 246 | ||
| 168 | 247 | 401 说明密钥失效(用户撤销或改了密码),删掉保存的密钥,重新授权。用户可以在 | |
| 169 | 248 | https://lingzhanskill.com/account/agent 查看和撤销授权。 | |
| ⋯ 未改动的行 ⋯ | |||
| 184 | 263 | - 下载链接 5 分钟内有效,带临时签名,不要贴到对话里或保存下来。 | |
| 185 | 264 | - “检查通过”表示平台的检查没有发现所列问题,不代表绝对安全;权限是作者的声明。 | |
| 186 | 265 | - 发布时不要替用户点“允许”,不要索取用户的密码或登录验证码,不要发布用户没有同意发布的文件。 | |
| 266 | 增加: | - 不要后台自动更新,也不要每次用技能都检查更新;检查更新不等于更新,替换前一定先问用户。 | |
skill.yaml
+1 −1查看文件| 1 | 1 | schema_version: "0.1" | |
| 2 | 2 | name: lingzhan-skills | |
| 3 | 3 | display_name: "灵栈技能助手" | |
| 4 | 删除: | version: 0.2.0 | |
| 4 | 增加: | version: 0.3.0 | |
| 5 | 5 | description: "让 AI 在灵栈搜索、介绍并安装技能,也能替作者把技能发布到灵栈;用户找技能、遇到没有现成技能的任务或要发布技能时使用。" | |
| 6 | 6 | license: Apache-2.0 | |
| 7 | 7 | entry: |

