✨ 亮点
本版本修复了 GitHub Pages 项目页面资源加载失败的回归问题 (#175),加固了插件/模板/引擎自动安装管道以防御 Shell 注入 (CWE-78),并从默认安装中移除了 @docmd/plugin-pwa(它从来不是核心插件)。
无破坏性变更。无需新增配置。现有配置、插件和 CI 管道无需修改即可正常工作。
🐛 修复:GitHub Pages 项目页面所有资源 404 (#175)
部署到 https://username.github.io/repo-name/ 的用户在从 0.8.9 升级后发现所有 CSS、JS 和图片文件都返回 404。原因:0.8.10 添加了 <base href="/"> 标签以修复另一个工作区问题,导致浏览器将所有相对 URL 解析到域名根路径而非子路径。
修复方案: docmd 现在自动从您的 url 配置推导资源基础路径。如果 url 为 https://username.github.io/my-repo,docmd 会在内部将 base 设为 /my-repo/。无需手动配置 base。
{
"url": "https://username.github.io/my-repo"
}
就是这样。docmd 会处理其余工作。
显式设置 base 的用户不受影响。推导对 url 和 base 的斜杠都容错 — "my-repo"、"/my-repo" 和 "/my-repo/" 都可以正常工作。
🔒 安全:自动安装中的 Shell 注入 (CWE-78)
插件自动安装路径通过将包名插入 pnpm add ${pkg} 来构建 Shell 字符串命令。包含 Shell 元字符的包名可以在用户账户下执行任意命令。
修复方案: 新的共享模块 (packages/api/src/runtime-deps.ts) 用 spawn(pm, args, { shell: false }) 替换了 Shell 字符串,使用固定参数数组。严格的正则验证器和注册表查找作为纵深防御。自动安装路径无法再被转为通用的 npm install 加载器。
🧰 共享 runtime-deps 模块
插件加载器 (hooks.ts) 和引擎加载器 (engine.ts) 各自维护一份自动安装管道的副本。两者现在都通过 runtime-deps.ts。一处安装行为,处处适用。TUI 状态报告器在每次构建中是幂等的,因此开发服务器重建不会产生重复的 [ WAIT ] / [ DONE ] 行。
🛠 引擎自动安装
在配置中请求 engine: "rust" 时,如果未安装 @docmd/engine-rust,以前会直接回退到 JS。新流程会先尝试安装 engine-rust;如果安装失败或原生二进制文件在当前平台不可用,则回退到 JS 并在 [ FAIL ] 行中显示原因。
📦 修正核心依赖清单
@docmd/plugin-pwa 被列为 @docmd/core 的直接依赖,但从未包含在 CORE_PLUGINS 中。每次 npm install @docmd/core 都会安装它,即使用户从未启用 PWA。
修复方案: 从 packages/core/package.json#dependencies 中移除 @docmd/plugin-pwa。它现在按需安装,与 math、threads 及其他可选插件一样。
📐 测试覆盖
tests/cli-contracts/runtime-deps.test.js 中新增 51 个断言:公共 API、验证器(12 个正向用例、13 个负向用例,包括 Shell 元字符)、注册表缓存幂等性、安装拒绝路径,以及静态源码检查。
迁移
无需迁移。现有配置、插件和 CI 管道无需修改即可正常工作。
完整变更日志: https://github.com/docmd-io/docmd/compare/0.8.11...0.8.12