✨ 亮点

本版本修复了 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 配置推导资源基础路径。如果 urlhttps://username.github.io/my-repo,docmd 会在内部将 base 设为 /my-repo/。无需手动配置 base

docmd.config.json
{
  "url": "https://username.github.io/my-repo"
}

就是这样。docmd 会处理其余工作。

显式设置 base 的用户不受影响。推导对 urlbase 的斜杠都容错 — "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。它现在按需安装,与 maththreads 及其他可选插件一样。

📐 测试覆盖

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