1仕組みと動作原理
本体はローカルの Bun スクリプトおよびリポジトリ内の共有パッケージで構成されています。レンダリングには baoyu-md(marked/juice/highlight.js パイプライン)を使用し、Mermaid 画像出力には baoyu-chrome-cdp の headless Chrome レンダラーを使用します。
import { closeRenderer, renderMermaidToPng } from "baoyu-chrome-cdp/mermaid";
Mermaid コードブロックはローカル PNG(headless Chrome + CDP)としてレンダリングされ、コンテンツハッシュによるキャッシュが行われます。Chrome が存在しない場合やレンダリングに失敗した場合は <pre class="mermaid"> にフォールバックし、変換処理全体が失敗することはありません。
Code blocks fenced as ` ```mermaid ` are rendered to PNGs via headless Chrome (CDP) and cached at `imgs/.mermaid-cache/mermaid-<hash>.png`.
PlantUML コードブロックはデフォルトで公開 PlantUML サービスによってレンダリングされます。パイプラインに markedPlantUML が登録されており、デフォルトの serverUrl が plantuml.com を向いているため、図のソースコードは外部のサードパーティサービスへ送信されます。
serverUrl: options.serverUrl || `https://www.plantuml.com/plantuml`,
ドキュメント内のリモート画像は一時ディレクトリにダウンロードされ、HTML 内で data-local-path を持つ img タグに書き換えられます(下流のプラットフォームやクライアントによる再アップロードを容易にするため)。
await downloadFile(imagePath, localPath);
出力およびバックアップの規約:HTML は元のファイルと同じディレクトリかつ同じ名前(.html)で書き出されます。既に存在する場合は先にリネームしてバックアップし、最終結果を JSON として stdout に出力します。
backupPath = `${finalHtmlPath}.bak-${formatTimestamp()}`;
テーマ、カラー、フォントサイズ、引用モードは外部から設定可能な明示的オプションです。--cite は通常の外部リンクを末尾の番号付き引用にまとめますが、WeChat 自身のリンクは元の位置を維持します。
`https://mp.weixin.qq.com/...` links stay as direct links and are not moved to the bottom.
処理の前段で中国語の検出が行われ、ユーザーの同意が得られた場合は先に baoyu-format-markdown を呼び出して整形を行います(CJK の太字解析の不具合や中英間のスペーシングを修正)。
**If user agrees**: Invoke `baoyu-format-markdown` skill to format the file, then use formatted file as input.
設定インターフェースは EXTEND.md(デフォルトテーマ、カスタム CSS 変数、コードブロックのスタイル、mermaid のテーマ/scale/背景)であり、3 段階のパスで最初に一致したものが使用されます。見つからない場合は初期セットアップフローを実行せず、デフォルト値が使用されます。
**EXTEND.md supports**: default theme, custom CSS variables, code block style, mermaid defaults (`mermaid_theme`, `mermaid_scale`, `mermaid_background`).
2コア機能
3外部依存関係
| Kind | Dependency / Endpoint |
|---|---|
| package | baoyu-md(npm,仓库 packages/ 内的共享包;marked/juice/highlight.js/remark 管线) |
| package | baoyu-chrome-cdp(npm,仓库 packages/ 内共享包;提供 CDP 与 mermaid 渲染器) |
| network | PlantUML 公共渲染服务(默认 serverUrl,图表源码经 GET 送出) |
| network | Markdown 中出现的任意 http(s) 图片主机(下载到本地临时目录) |
| cli | 本地 Chrome/Chromium/Edge(headless 渲染 Mermaid;缺失则回退) |
| cli | bun(首选运行时;无 bun 时 npx -y bun) |
4推奨統制措置と判定根拠
- scripts/: ローカルスクリプトまたはコマンドの実行: bun {baseDir}/scripts/main.ts <markdown_file> [--theme …] [--cite] [--merma
- 网络端点: 宣言された外部ネットワークアクセス: https://www.plantuml.com/plantuml(デフォルト、ドキュメントに plantuml コードブロックが含まれる場合のみ:図のソースコードが URL エンコードされたペイロードとして送信され、画像が返却される)
- 本地工作目录: ファイルの読み書きと成果物の出力: 入力と同じディレクトリ・同じ名前の .html(上書き前に .html.bak-YYYYMMDDHHMMSS にリネーム)
5二重目の独立検証
- [ok] 共享包依赖与版本锁定 — scripts/package.json 仅声明 baoyu-md ^0.1.1 与 baoyu-chrome-cdp ^0.1.1,bun.lock 有锁定条目;两包在本仓 packages/ 内有源码(psync 可读),非黑盒。
- [ok] Mermaid 本地渲染且无 CDN — packages/baoyu-chrome-cdp/src/mermaid.ts 从包内 assets 读 mermaid.min.js(`if (fs.existsSync(path.join(candidate, "mermaid.min.js"))) return candidate;`)并注入本地页面,无外部脚本地址。
- [ok] PlantUML 默认出网到公共服务器(判橙依据) — packages/baoyu-md/src/extensions/plantuml.ts 默认 serverUrl=https://www.plantuml.com/plantuml;注册于 renderer.ts 的 markedPlantUML();本 skill 的 document.ts 路径调用 initRenderer,SKILL.md 亦将 PlantUML 列为支持特性。
- [ok] 远程图片会被真实下载 — packages/baoyu-md/src/images.ts 的 downloadFile 使用 node:http/https + Mozilla/5.0 UA 下载并跟随 301/302;本 skill 在 hasRemoteImages 时建临时目录承接,HTML 内保留原 URL 并附 data-local-path。
- [ok] 本 skill 的 Chrome 启动参数无安全降级/反检测项 — packages/baoyu-chrome-cdp/src/index.ts 的 launchChromeBase args 仅为 --remote-debugging-port/--user-data-dir/--no-first-run/--no-default-browser-check(+headless);全包 grep bypass/detect/webdriver/stealth 零命中,无 --no-sandbox。
- [ok] 无凭证读取 — 本目录 token 扫描 process.env/API_KEY/TOKEN/SECRET/.env 零命中;仅 EXTEND.md 偏好文件(路径在 SKILL.md 明列)。
- [ok] mermaid securityLevel: loose 的渲染面 — packages/baoyu-chrome-cdp/src/mermaid.ts 以 `mermaid.initialize({ startOnLoad: false, theme: …, securityLevel: "loose" })` 渲染文档中的图表代码,属本地无头浏览器内执行用户文档内容;已在 injection_surface 与 verdict.risks 标注。
- [ok] 『微信友好』定位与实际产物 — CSS 由 juice 内联(baoyu-md 依赖含 juice ^11.0.1),图片输出 localPath 供下游上传;--cite 默认关闭,与 SKILL.md 'Default: Off. Do not ask by default.' 一致。
6結論
548cfdf151b66892…