{"_id":"@bluemeat0724/md-viewer","_rev":"9-58d2f7a4bba9032e96b1827e3d3ac540","name":"@bluemeat0724/md-viewer","dist-tags":{"latest":"0.9.0"},"versions":{"0.1.0":{"name":"@bluemeat0724/md-viewer","version":"0.1.0","keywords":["markdown","viewer","cli","mermaid","offline"],"license":"MIT","_id":"@bluemeat0724/md-viewer@0.1.0","maintainers":[{"name":"bluemeat0724","email":"wangrenyuan@outlook.com"}],"bin":{"md-viewer":"bin/md-viewer.mjs"},"dist":{"shasum":"d4e92890b68ef73b2294f0e4a172e5b3e680089e","tarball":"https://registry.npmjs.org/@bluemeat0724/md-viewer/-/md-viewer-0.1.0.tgz","fileCount":5,"integrity":"sha512-5OycBVAn7yxvPP1CEtNletSR10XM8barG5uiEUwtGBNWIR1DXFPHooGTlGoRWQuJQcsQs2IIZtBoc2twJZXiIQ==","signatures":[{"sig":"MEQCICClNpjhpO4BuQzv9luzz5NOW0956OocFZ2/MOnqr3MvAiBYG0ndzs6rml7Grhn9oLZ513dG50HY3THEFXWS6uMKxA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":58151},"type":"module","engines":{"node":">=18"},"gitHead":"355e3081dcc984f1ee4a152767ee83945aebe49d","_npmUser":{"name":"bluemeat0724","email":"wangrenyuan@outlook.com"},"_npmVersion":"11.12.1","description":"Scan a directory of Markdown files and build a self-contained, offline md-viewer.html","directories":{},"_nodeVersion":"24.15.0","dependencies":{"marked":"^18.0.10","esbuild":"^0.28.2","mermaid":"^11.16.1","highlight.js":"^11.12.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/md-viewer_0.1.0_1787037120588_0.4510346052026295","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@bluemeat0724/md-viewer","version":"0.2.0","keywords":["markdown","viewer","cli","mermaid","offline"],"license":"MIT","_id":"@bluemeat0724/md-viewer@0.2.0","maintainers":[{"name":"bluemeat0724","email":"wangrenyuan@outlook.com"}],"bin":{"md-viewer":"bin/md-viewer.mjs"},"dist":{"shasum":"dc881c64abaf10550807aef356947b504913130e","tarball":"https://registry.npmjs.org/@bluemeat0724/md-viewer/-/md-viewer-0.2.0.tgz","fileCount":5,"integrity":"sha512-ny6E4V6ytOfc2ctg+vY4mia/fpbH81uqpnKWXTGvXpV1GgaNsiX/Da21FZaERah+yZshKb/+pUIMnmwDYXFcFA==","signatures":[{"sig":"MEQCIHQqJQtFAmLtqdT1VfVmQCp9bD5IaPvqAzSnGIk5aOolAiASSUixu/VjN4XjMDkQ8hL2J4nRiVP1eoq0SLMK/4aAPQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":59157},"type":"module","engines":{"node":">=18"},"gitHead":"51f7351bb823e248406449a4b3c8bac0dcf41933","_npmUser":{"name":"bluemeat0724","email":"wangrenyuan@outlook.com"},"_npmVersion":"11.12.1","description":"Scan a directory of Markdown files and build a self-contained, offline md-viewer.html","directories":{},"_nodeVersion":"24.15.0","dependencies":{"marked":"^18.0.10","esbuild":"^0.28.2","mermaid":"^11.16.1","highlight.js":"^11.12.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/md-viewer_0.2.0_1787038053870_0.42750571310165286","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@bluemeat0724/md-viewer","version":"0.3.0","keywords":["markdown","viewer","cli","mermaid","offline"],"license":"MIT","_id":"@bluemeat0724/md-viewer@0.3.0","maintainers":[{"name":"bluemeat0724","email":"wangrenyuan@outlook.com"}],"bin":{"md-viewer":"bin/md-viewer.mjs"},"dist":{"shasum":"41b56c034115a21e3bd731af6c84133bc73c7446","tarball":"https://registry.npmjs.org/@bluemeat0724/md-viewer/-/md-viewer-0.3.0.tgz","fileCount":5,"integrity":"sha512-dki0O9YbXDthXMYEUakgSdXxYd2dhlOcaXlIjm47BGMdZf2BsMP6muMmeWph4gfpDFtmZ3Wx09CJGa1dKH6/FA==","signatures":[{"sig":"MEYCIQDRCtaDZmcR4dVF+pvr6bPkqX6Fw9BlQugzGVL9bedXFQIhAOwJnhO/pOvTRT2BDYesx/ZbWwnRNQ3XgouTeD9YKPBd","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":60099},"type":"module","engines":{"node":">=18"},"gitHead":"c22b508d95b965b404676c09b405facc4a8df045","_npmUser":{"name":"bluemeat0724","email":"wangrenyuan@outlook.com"},"_npmVersion":"11.12.1","description":"Scan a directory of Markdown files and build a self-contained, offline md-viewer.html","directories":{},"_nodeVersion":"24.15.0","dependencies":{"marked":"^18.0.10","esbuild":"^0.28.2","mermaid":"^11.16.1","highlight.js":"^11.12.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/md-viewer_0.3.0_1787044128832_0.5282324949626604","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@bluemeat0724/md-viewer","version":"0.4.0","keywords":["markdown","viewer","cli","mermaid","offline"],"license":"MIT","_id":"@bluemeat0724/md-viewer@0.4.0","maintainers":[{"name":"bluemeat0724","email":"wangrenyuan@outlook.com"}],"bin":{"md-viewer":"bin/md-viewer.mjs"},"dist":{"shasum":"ffa916931c4759a673c5700d4b1b7754b0a16f26","tarball":"https://registry.npmjs.org/@bluemeat0724/md-viewer/-/md-viewer-0.4.0.tgz","fileCount":11,"integrity":"sha512-NwlJnDsJqmINX5gmwgQRjC6Kna4X+clPLyeGu7mLzl5fS8TQk9nqil7tx3JlEz8aEhp6jiCURloGSKgNLlAnWw==","signatures":[{"sig":"MEUCIQDrdxNVrIGa1yNtsw6iblNLsKhil454RkmzbaIwoJniCwIgHeKjWkrQqovtBM8WRm6CjeBVMofkImlhxzIlSVMKJow=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":64308},"main":"lib/index.mjs","type":"module","types":"lib/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./lib/index.d.ts","default":"./lib/index.mjs"},"./lib/*":"./lib/*","./package.json":"./package.json"},"gitHead":"40228d0c455de949663e9f19759b3d61ba48cbe1","scripts":{"test":"node --test"},"_npmUser":{"name":"bluemeat0724","email":"wangrenyuan@outlook.com"},"_npmVersion":"11.12.1","description":"Scan a directory of Markdown files and build a self-contained, offline md-viewer.html","directories":{},"_nodeVersion":"24.15.0","dependencies":{"marked":"^18.0.10","esbuild":"^0.28.2","mermaid":"^11.16.1","highlight.js":"^11.12.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/md-viewer_0.4.0_1787126771406_0.7671027692642538","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@bluemeat0724/md-viewer","version":"0.5.0","keywords":["markdown","viewer","cli","mermaid","offline"],"license":"MIT","_id":"@bluemeat0724/md-viewer@0.5.0","maintainers":[{"name":"bluemeat0724","email":"wangrenyuan@outlook.com"}],"bin":{"md-viewer":"bin/md-viewer.mjs"},"dist":{"shasum":"ffb919c51bca00a265d008431b9df9ec4d366e23","tarball":"https://registry.npmjs.org/@bluemeat0724/md-viewer/-/md-viewer-0.5.0.tgz","fileCount":11,"integrity":"sha512-obdOBl0HVtgbcEHIbZ1fNLoXt9CDmrkTyzrEp0EBOmsSEwiHEKEZE/9YHp7T699h+gBeHdtOD3VkN1NNm7Lc3w==","signatures":[{"sig":"MEUCICUh7CkAyMy7HTPKAYiTUH+PJT0hbYTbidmJhgpW5QldAiEAoiaH1QWP6FsLVyPbnTBKOvpruYWuY0D4tc8AEQYKGaE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":64759},"main":"lib/index.mjs","type":"module","types":"lib/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./lib/index.d.ts","default":"./lib/index.mjs"},"./lib/*":"./lib/*","./package.json":"./package.json"},"gitHead":"9c134e9d96ed0fe42951aaa9a8012faa7e77cfbd","scripts":{"test":"node --test"},"_npmUser":{"name":"bluemeat0724","email":"wangrenyuan@outlook.com"},"_npmVersion":"11.12.1","description":"Scan a directory of Markdown files and build a self-contained, offline md-viewer.html","directories":{},"_nodeVersion":"24.15.0","dependencies":{"marked":"^18.0.10","esbuild":"^0.28.2","mermaid":"^11.16.1","highlight.js":"^11.12.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/md-viewer_0.5.0_1787129689684_0.6856617319230123","host":"s3://npm-registry-packages-npm-production"}},"0.6.1":{"name":"@bluemeat0724/md-viewer","version":"0.6.1","keywords":["markdown","viewer","cli","mermaid","offline"],"license":"MIT","_id":"@bluemeat0724/md-viewer@0.6.1","maintainers":[{"name":"bluemeat0724","email":"wangrenyuan@outlook.com"}],"bin":{"md-viewer":"bin/md-viewer.mjs"},"dist":{"shasum":"a2cdf7e75deab9c9d44bb9397b0bbb9b557b5d18","tarball":"https://registry.npmjs.org/@bluemeat0724/md-viewer/-/md-viewer-0.6.1.tgz","fileCount":11,"integrity":"sha512-BMnrVmuEEGGEkACv74tcvAfY3ItlR1cFVd/QLrwRCMHLzUj5ZKvI4DtNLnLdpo2QD5SivatY/C8qxOcSDuSwiQ==","signatures":[{"sig":"MEUCIHXLNt/mHG47H7lsb6e/Fry09qsnFlCRltLwnzzkKnGqAiEAk3eJ6nxmdzmys5ZHSbjkbAns2kQtvYobYZdCGpVW9rg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":89531},"main":"lib/index.mjs","type":"module","types":"lib/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./lib/index.d.ts","default":"./lib/index.mjs"},"./lib/*":"./lib/*","./package.json":"./package.json"},"gitHead":"dd5595135d5f01ec6fa4ee68c23cc42c323fd4d8","scripts":{"test":"node --test"},"_npmUser":{"name":"bluemeat0724","email":"wangrenyuan@outlook.com"},"_npmVersion":"11.12.1","description":"Scan a directory of Markdown files and build a self-contained, offline md-viewer.html","directories":{},"_nodeVersion":"24.15.0","dependencies":{"marked":"^18.0.10","esbuild":"^0.28.2","mermaid":"^11.16.1","highlight.js":"^11.12.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/md-viewer_0.6.1_1787276572601_0.02716318672357132","host":"s3://npm-registry-packages-npm-production"}},"0.6.2":{"name":"@bluemeat0724/md-viewer","version":"0.6.2","keywords":["markdown","viewer","cli","mermaid","offline"],"license":"MIT","_id":"@bluemeat0724/md-viewer@0.6.2","maintainers":[{"name":"bluemeat0724","email":"wangrenyuan@outlook.com"}],"bin":{"md-viewer":"bin/md-viewer.mjs"},"dist":{"shasum":"6e550230741c037ad4f2902bd5485f405e1bd674","tarball":"https://registry.npmjs.org/@bluemeat0724/md-viewer/-/md-viewer-0.6.2.tgz","fileCount":11,"integrity":"sha512-7FyMrI2mo+rPhRRWFTF3P+DIVoQEebC4mZWQ147IHcj6sLXdlIlmIjJnRXSTn6uEH5T5k3XQahJFQSv4Y9OIYA==","signatures":[{"sig":"MEYCIQChIHxZWsVvu6Y8cwoTGnL0QnI/9rfoFP031WNzO8IfhwIhAJtMhGxjTks+Ps1CSxJC9Dp4B8fn96bExAaHU67053L6","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":89989},"main":"lib/index.mjs","type":"module","types":"lib/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./lib/index.d.ts","default":"./lib/index.mjs"},"./lib/*":"./lib/*","./package.json":"./package.json"},"gitHead":"c426718e8ce31cc1d863967d43ea061b8510d8ff","scripts":{"test":"node --test"},"_npmUser":{"name":"bluemeat0724","email":"wangrenyuan@outlook.com"},"_npmVersion":"11.12.1","description":"Scan a directory of Markdown files and build a self-contained, offline md-viewer.html","directories":{},"_nodeVersion":"24.15.0","dependencies":{"marked":"^18.0.10","esbuild":"^0.28.2","mermaid":"^11.16.1","highlight.js":"^11.12.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/md-viewer_0.6.2_1787282777829_0.14496257640492027","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@bluemeat0724/md-viewer","version":"0.8.0","keywords":["markdown","viewer","cli","mermaid","offline"],"license":"MIT","_id":"@bluemeat0724/md-viewer@0.8.0","maintainers":[{"name":"bluemeat0724","email":"wangrenyuan@outlook.com"}],"bin":{"md-viewer":"bin/md-viewer.mjs"},"dist":{"shasum":"04d9497f62550ce2252759ffdcad7ff9a7db20d6","tarball":"https://registry.npmjs.org/@bluemeat0724/md-viewer/-/md-viewer-0.8.0.tgz","fileCount":11,"integrity":"sha512-DkBUhm6MESuY10he3bgl5Cn1LIqCRcbQV1NLtRZbeXkHHfpqsFoYFJNR40Hi9zbaV5hUN5cBjv3J/vC1zBp3zQ==","signatures":[{"sig":"MEUCIDrqtNOXr4TDdKFlFstAesg8wFGJPyLD1kYzj8RT7UYTAiEAp7CmYJOW4/+I1Qiw5Dp+Y3ClrjmpiH7+tqPAWmw4Uk4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":112309},"main":"lib/index.mjs","type":"module","types":"lib/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./lib/index.d.ts","default":"./lib/index.mjs"},"./lib/*":"./lib/*","./package.json":"./package.json"},"gitHead":"9545f9eb00cfa7019e82b8c06cedaec11250926d","scripts":{"test":"node test/core.test.mjs && node test/build.test.mjs"},"_npmUser":{"name":"bluemeat0724","email":"wangrenyuan@outlook.com"},"_npmVersion":"11.12.1","description":"Scan a directory of Markdown/JSON files and build a self-contained, offline md-viewer.html","directories":{},"_nodeVersion":"24.15.0","dependencies":{"marked":"^18.0.10","esbuild":"^0.28.2","mermaid":"^11.16.1","highlight.js":"^11.12.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/md-viewer_0.8.0_1787292615074_0.04010944538061323","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"@bluemeat0724/md-viewer","version":"0.9.0","description":"Scan a directory of Markdown/JSON files and build a self-contained, offline md-viewer.html","type":"module","bin":{"md-viewer":"bin/md-viewer.mjs"},"main":"lib/index.mjs","types":"lib/index.d.ts","exports":{".":{"types":"./lib/index.d.ts","default":"./lib/index.mjs"},"./lib/*":"./lib/*","./package.json":"./package.json"},"engines":{"node":">=20"},"keywords":["markdown","viewer","cli","mermaid","offline"],"license":"MIT","dependencies":{"marked":"^18.0.10","highlight.js":"^11.12.0","mermaid":"^11.16.1","esbuild":"^0.28.2"},"scripts":{"test":"node test/core.test.mjs && node test/build.test.mjs"},"gitHead":"6ff02bf319ac288f4bdbdd33f1b782c58378e0ca","_id":"@bluemeat0724/md-viewer@0.9.0","_nodeVersion":"24.15.0","_npmVersion":"11.12.1","dist":{"integrity":"sha512-H7+cpw29wHA3EIfOu+7UEQN63lHEyFaopSdVDzR6dKNVm/SW6imT5n9/HdnJfszKwhLJ1hJWhJVP7XIV4m836A==","shasum":"ce436b366ab7e53bd14c63a973ee7ef762692acf","tarball":"https://registry.npmjs.org/@bluemeat0724/md-viewer/-/md-viewer-0.9.0.tgz","fileCount":11,"unpackedSize":112588,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIAaxfsXf4Evt94p0uoDHMoTn1ZBIRopfiblkNuWhb2bQAiAYOTvQlAF9h9uBwcb/sG40Rm8WWbF5upQ3Ongz8669Hg=="}]},"_npmUser":{"name":"bluemeat0724","email":"wangrenyuan@outlook.com"},"directories":{},"maintainers":[{"name":"bluemeat0724","email":"wangrenyuan@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/md-viewer_0.9.0_1787505751427_0.2913345965908698"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-18T07:12:00.416Z","modified":"2026-08-23T17:22:31.703Z","0.1.0":"2026-08-18T07:12:00.762Z","0.2.0":"2026-08-18T07:27:34.018Z","0.3.0":"2026-08-18T09:08:48.974Z","0.4.0":"2026-08-19T08:06:11.537Z","0.5.0":"2026-08-19T08:54:49.823Z","0.6.1":"2026-08-21T01:42:52.769Z","0.6.2":"2026-08-21T03:26:18.113Z","0.8.0":"2026-08-21T06:10:15.231Z","0.9.0":"2026-08-23T17:22:31.570Z"},"license":"MIT","keywords":["markdown","viewer","cli","mermaid","offline"],"description":"Scan a directory of Markdown/JSON files and build a self-contained, offline md-viewer.html","maintainers":[{"name":"bluemeat0724","email":"wangrenyuan@outlook.com"}],"readme":"# md-viewer\n\n[![npm version](https://img.shields.io/npm/v/%40bluemeat0724%2Fmd-viewer)](https://www.npmjs.com/package/@bluemeat0724/md-viewer)\n\n扫描目录下所有 Markdown / JSON 文件，构建一个**自包含、离线可用**的 `md-viewer.html`——`file://` 双击直开，无需任何服务。\n\n## 特性\n\n- 递归扫描 `*.md` / `*.json`（自动跳过 `node_modules`、`.git`、`dist`、`build`、`.venv` 及隐藏目录）\n- GFM 渲染（marked）+ 代码高亮（highlight.js）+ Mermaid 图表渲染\n- 文件树侧边栏：文件夹在前、文件在后，目录默认折叠，深链自动展开祖先\n- 全文搜索（标题 + 路径 + 正文，`/` 键聚焦，一键清空，无命中的分组自动隐藏）\n- 深浅主题三态循环（auto / light / dark），Mermaid 随主题重渲染，打印固定浅色\n- 上一篇 / 下一篇导航、页内大纲（右侧 outline 滚动高亮；窄屏改为工具栏弹层）\n- 代码块一键复制（`file://` 下自动降级 execCommand）、标题悬停锚点跳转\n- 跨文档 `.md` 链接自动重写为页内锚点跳转\n- Mermaid 独立缩放容器：滚轮缩放、拖拽平移、100%–400%、全屏\n- 内嵌 Tabler 线性图标（MIT）与设计令牌体系；键盘可达（`:focus-visible` 焦点环、`prefers-reduced-motion` 降级）\n- `--watch` 监听 md / json 变动自动重建\n- 构建秒级完成：依赖随安装预置，运行零等待\n\n## 安装\n\n需要 Node.js 20 或更高版本。\n\n```bash\nnpm install -g @bluemeat0724/md-viewer\n```\n\n或免安装直接运行（npx）：\n\n```bash\nnpx @bluemeat0724/md-viewer\n```\n\n开发调试时也可在项目目录本地挂载：\n\n```bash\nnpm install\nnpm link\n```\n\n## 使用\n\n在任意目录执行，即以**执行目录**为根目录扫描：\n\n```bash\ncd /path/to/any/docs-dir\nmd-viewer              # 扫描当前目录，生成 ./md-viewer.html\nmd-viewer --open       # 构建后自动用浏览器打开\nmd-viewer --watch      # 常驻监听，md / json 变动自动重建\nmd-viewer docs         # 指定扫描目录（位置参数）\nmd-viewer --out x.html # 自定义输出文件\nmd-viewer --title \"我的文档\"  # 自定义站点标题\nmd-viewer --harness   # 生成到 .agents/md-viewer/index.html 并开启 watch\n```\n\n打开生成的 HTML：使用 `--open`，或双击文件，或 `open md-viewer.html`。md / json 有变动时重新运行命令（或保持 `--watch` 常驻），刷新浏览器即可。\n\n## 参数\n\n| 选项 | 说明 |\n|---|---|\n| `[目录]` | 扫描根目录，默认当前执行目录 |\n| `-w, --watch` | 构建后持续监听 md / json 变动并自动重建 |\n| `-o, --open` | 构建后用系统默认浏览器打开生成的 HTML |\n| `--harness` | 输出到 `<目录>/.agents/md-viewer/index.html` 并强制开启 watch（供 Agent 环境常驻） |\n| `--out <file>` | 输出文件路径，默认 `<目录>/md-viewer.html` |\n| `--title <text>` | 站点标题，默认为扫描目录名 |\n| `-h, --help` | 显示帮助 |\n| `-v, --version` | 显示版本号 |\n\n## 环境变量\n\n| 变量 | 说明 |\n|---|---|\n| `MD_VIEWER_OUT` | 输出文件路径（`--out` 优先） |\n| `MD_VIEWER_TITLE` | 站点标题（`--title` 优先） |\n\n优先级：CLI 参数 > 环境变量 > 默认值。\n\n## DSH 插件（dsh-md-viewer）\n\n`packages/dsh-md-viewer/` 是本引擎的 DSH 插件封装（独立 npm 包\n`@bluemeat0724/dsh-md-viewer`）：在 DeepSeek Harness Web GUI 中浏览任意工作区\n的 Markdown——进程内复用本引擎的渲染管线，提供会话标题栏/侧边栏入口、全屏\niframe 预览与 `mdv_build` / `mdv_status` Agent 工具。详见\n[packages/dsh-md-viewer/README.zh.md](packages/dsh-md-viewer/README.zh.md)。\n\n## 程序化 API\n\n除 CLI 外，`@bluemeat0724/md-viewer` 提供 Node 程序化入口（`lib/index.mjs`，含\n`lib/index.d.ts` 类型声明），供其他工具（如 dsh 插件）直接复用渲染能力：\n\n```js\nimport { build, startWatch, findDocs } from '@bluemeat0724/md-viewer';\n\nawait build({ srcDir: '/path/to/docs', outFile: '/tmp/md-viewer.html', title: '我的文档' });\nconst docs = await findDocs('/path/to/docs'); // md/json 相对路径列表（跳过隐藏项与依赖目录）\nstartWatch('/path/to/docs', () => build({ srcDir: '/path/to/docs', outFile: '/tmp/md-viewer.html', title: '我的文档' }));\n```\n\n依赖（marked / highlight.js / mermaid / esbuild）随包安装预置，调用零等待。\n\n## 开发与测试\n\n- 资产文件（页面样式 / 共享渲染核心 / 浏览器查看器）位于 `lib/assets/`：\n  Node 构建侧与浏览器查看器共用 `viewer-core.js` 一份源码，不要在别处复制\n  这些函数（`npm test` 有行为一致性护栏）。\n- 测试：`npm test`（node:test 单测 + 集成测试，覆盖渲染 / 高亮 / mermaid /\n  链接重写 / 跳过规则）。\n\n## 注意事项\n\n- 主题令牌基于 CSS `light-dark()`，需 Chrome 123+ / Safari 17.5+ / Firefox 120+（2024 年中以来的主流浏览器均满足）；更旧的浏览器会退化为无主题样式。\n- `--watch` 基于 `fs.watch(recursive)`，是 OS 级事件监听（macOS 走 FSEvents，非轮询）：空闲时近零 CPU，仅 md / json 变动时触发重建；事件带 300ms 防抖与重建串行锁，连续保存不会连环重建。macOS / Windows / 较新 Linux 内核均支持；部分旧 Linux 发行版（< 5.x 内核）对递归监听支持有限，如不生效可退回「改动后手动重跑 `md-viewer`」。\n- 生成的 HTML 内嵌 marked / highlight.js / mermaid 浏览器 bundle（约 3–4 MB），文档越多文件越大。\n- Markdown / JSON 正文默认全部嵌入；程序化 API 可显式设置 `maxRawKB`，让超限文件只保留目录项。\n- Markdown 引用的本地图片和附件不会嵌入 HTML；移动产物时需保留相同的相对目录结构。\n- 构建失败时退出码为 1，并输出可读错误信息。\n\n## 许可\n\nMIT\n\n\n## change log\n\n见 [change-log.md](./change-log.md)。\n","readmeFilename":"README.md"}