Repository navigation
v3.9.0
3.9.0 (2026-10-30)
新功能
- 设置新增「Agent Skill」页签,按安装、配对、试一试三步接入 AI agent:在页签里生成一次性配对码,把附带站点地址和配对码的一段话交给 agent,agent 用它换取 API Key,key 不会出现在对话记录中。页签实时显示接入的 agent,不是自己的 agent 时可以立即撤销;已接入的 agent 及其最近使用时间列在页签底部。配对码 10 分钟内有效,只能使用一次。手动创建 API Key 的方式照常保留 (8e33c30, 2a42fa0, 29bc371, cbb31a1, 91ae597)
- Agent Skill 改为按站点的实时 API 文档工作,可以用
npx skills add一条命令安装;API 文档提供目录,agent 只读取要用到的接口,不必每次读完整份文档;文章正文可以用 Markdown 读写 (ea93b66, 8b4706f, eddb686, b30b81e, 07b92ac) - 编辑冲突保护:文章在打开后被别处(另一个浏览器标签、agent 或 API)保存过时,自动保存会暂停,不再静默覆盖,可以选择载入最新版本或以当前内容覆盖。通过 API 写入时同样会被拒绝,并提示重新读取 (81c6389, 2ed9be5, 7fd5b66)
- 已发布文章有未发布的修改时,文章列表、编辑器和概览都会显示「已发布 · 有新修改」,发布按钮变为「发布修改」,列表可以按此筛选;也可以放弃修改,让草稿还原为已发布的版本(放弃前的草稿会先保存为一个新版本)(ff10297, cfc6bda, 7faf085, bab98da)
- 文章的分类和标签改为随发布生效:修改已发布文章的分类或标签后,公开页面在重新发布前保持原样,不再出现新标签配旧正文的情况。分类和标签本身的新建、改名、删除仍即时生效,删除前会提示有多少篇已发布文章受影响 (c0659c3)
- 在文章列表置顶或取消置顶即时生效,首页立即更新,不再需要重新发布 (60a1218)
- 被历史版本引用的图片会保留,恢复历史版本不会丢图;媒体库标出「仅历史版本引用」的图片 (1f79091, 7eed92f, 1e161f1)
- 编辑器校验标题和链接:链接格式不对、属于保留字或已被其他文章使用时,字段下方给出原因,其余内容照常自动保存;发布日期晚于当前时间时提示修改 (027073d, d89d97a, d29a310, 2d5850a)
- 公开页面访问不存在的分类或标签时,说明是哪个分类或标签不存在,并提供查看全部文章的入口 (f5ff2d8, ad5a108)
问题修复
- 安全:文章的 JSON-LD 结构化数据完整转义,任何标题、摘要或标签都无法提前结束脚本;拒绝
javascript:、data:等危险链接;正文只接受编辑器支持的节点与属性,公开页面和订阅源里的链接统一在新标签页打开并带noopener noreferrer nofollow;搜索高亮一律转义;SVG 图片无法在站点上执行脚本;上传文件的内容必须与声明的类型一致;从网址导入图片时拒绝内网和本机地址 (ebc997a, 6ce0097, 07e47fe, 47353a9, 5bce6d8, 0971a32, 050ea21, 228c5c3, e09a3bb) - RSS 和 Atom:任何文章内容都能生成合法的 XML,不会因为一个控制字符或多个
]]>让整个订阅源失效;纯文本标题按文本显示,Promise<void>这样的标题不会被阅读器吞掉;订阅源正文为 HTML (9641e04, 3a116de) - 公开页面、结构化数据、订阅源和 sitemap 的修改时间改用最后一次发布的时间,保存草稿不会再暴露正在编辑的痕迹 (02207d5, eca11fe)
- 分类、标签的名称和文章链接在数据库层保证唯一,比较时忽略大小写与全角半角,同时创建也不会产生重复;拒绝零宽空格、方向控制符等不可见字符 (bc7acd0, e26034e, 0a5459b)
- 正文引用不存在的媒体时拒绝保存;删除媒体与保存文章同时发生时,不会留下指向已删除文件的图片 (e575ba0, 4bbe588)
- 正文和发布版本设有大小上限,避免超出数据库单行限制;超大的代码块不再拖垮发布 (68460f1, 7b26319)
- 替换媒体文件后,所有文章立即显示新文件,不会因此产生未发布的修改;替换时必须保持同一图片格式 (ec6335f, 4b27701)
- 分类、标签改名或删除后,站内搜索同步更新 (2d28d21)
- 链接含
^的文章页面不再无限重定向;pinned和popular作为保留链接不可使用 (0f5b641) - 恢复历史版本失败时,原因显示在页面上,不会被确认框遮住而导致误覆盖 (846f1c2, 2a47292)
- Markdown 往返时,显式写成链接的视频地址保持为链接,不再变成视频块 (1e2bfc3)
API 不兼容变化
以下变化只影响通过 API Key 调用 HTTP API 的脚本和 agent:
- 后台写入拒绝未声明的字段;请求体或 query 中与路径参数同名的字段返回 400,不再覆盖路径参数;非 GET 请求带 query 参数、读取接口带未声明的 query 参数都返回 400 (a72964b, c2d2f39)
- 无效的 API Key 一律返回 401;未知路由和错误的请求方法返回 JSON 格式的 404、405;请求体过大返回 413 (87ac793, 33ee11b)
- 分页参数必须是范围内的整数;路径中的 id 必须是正整数,标签 id 必须是整数 (645eb1e, cec28bd)
- 保存文章的分类和标签只改草稿,发布后才上线;保存时不再接受置顶字段,置顶改用单独的接口 (c0659c3, 60a1218)
- 保存、设置标签、恢复版本、放弃修改和发布可以携带
saveToken,文章在读取后被保存过时返回 409EDIT_CONFLICT;发布与取消发布会返回新的saveToken(81c6389) - 文章链接不能包含
/ ? # % \ ^、空白和控制字符,pinned、popular为保留链接,被占用时返回 409 (027073d, 0f5b641) - 正文
contentJson按编辑器的规则校验节点、标记、属性和链接,/images/…图片必须是已有的媒体 (bece7c3, 07e47fe, e575ba0) - 媒体列表的
postCount只计草稿和已发布版本中的引用,另增revisionOnlyPostCount表示只在历史版本中出现的引用 (7eed92f)
完整的接口说明见站点的 /api/spec/index.json。
说明
- 本版本包含数据库迁移 0024–0031,部署时自动执行。其中 0029 会把仅大小写不同的分类或标签合并为最早创建的那一个,不会改动任何文章链接
- 与本版本匹配的 Agent Skill 压缩包附在下方 Assets 中,也可以在后台「Agent Skill」页签下载或用 npx 安装