agent-reader 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +213 -0
- package/bin/agent-reader.js +83 -0
- package/package.json +52 -0
- package/src/cli/commands.js +602 -0
- package/src/core/assets.js +429 -0
- package/src/core/exporter.js +710 -0
- package/src/core/opener.js +329 -0
- package/src/core/renderer.js +235 -0
- package/src/core/sanitizer.js +79 -0
- package/src/core/slideshow.js +383 -0
- package/src/core/templates/docx-table.lua +4 -0
- package/src/core/templates/reference.docx +0 -0
- package/src/core/themes/dark.css +256 -0
- package/src/core/themes/light.css +312 -0
- package/src/core/themes/print.css +54 -0
- package/src/mcp/server.js +381 -0
- package/src/templates/document.html +145 -0
- package/src/templates/slideshow.html +42 -0
- package/src/utils/logger.js +64 -0
- package/src/utils/naturalSort.js +12 -0
- package/src/utils/output.js +85 -0
- package/src/utils/preferences.js +89 -0
- package/src/utils/server.js +295 -0
package/README.md
ADDED
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
# Agent Reader — AI Agent 的文档美化引擎
|
|
2
|
+
|
|
3
|
+

|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/agent-reader)
|
|
6
|
+
[](https://opensource.org/licenses/MIT)
|
|
7
|
+
[](https://nodejs.org)
|
|
8
|
+
[](https://modelcontextprotocol.io)
|
|
9
|
+
|
|
10
|
+
AI Agent 擅长生成内容,但输出的 Markdown 对普通人不友好。Agent Reader 一键把 Markdown 变成漂亮网页、Word、PDF,还能把图片做成全屏幻灯片。
|
|
11
|
+
|
|
12
|
+
**专为 AI Agent 时代打造的格式化引擎 — 一条命令,输出即交付。**
|
|
13
|
+
|
|
14
|
+
## 为什么需要它
|
|
15
|
+
|
|
16
|
+
- AI Agent 输出的 `.md` 文件,非技术用户看不懂
|
|
17
|
+
- 手动复制到 Word 排版,格式全乱
|
|
18
|
+
- 图片散落在文件夹里,没法像 PPT 一样展示
|
|
19
|
+
|
|
20
|
+
Agent Reader 解决这三个问题:**一条命令,输出即交付**。
|
|
21
|
+
|
|
22
|
+
## 核心能力
|
|
23
|
+
|
|
24
|
+
| 能力 | 说明 |
|
|
25
|
+
|------|------|
|
|
26
|
+
| Markdown → 网页 | 带侧边目录导航、代码高亮、表格美化,可一键导出 Word/PDF |
|
|
27
|
+
| Markdown → Word | 智能表格列宽、标题层级、引用块样式,打印友好 |
|
|
28
|
+
| Markdown → PDF | 浏览器引擎打印,和网页视觉一致 |
|
|
29
|
+
| 图片 → 幻灯片 | 全屏播放、键盘翻页、自动轮播、缩略图导航 |
|
|
30
|
+
| 幻灯片 → PDF | 每张图片一页,适合存档分享 |
|
|
31
|
+
|
|
32
|
+
## 两种使用方式
|
|
33
|
+
|
|
34
|
+
**CLI** — 开发者和 Agent 通过命令行调用
|
|
35
|
+
**MCP Server** — AI Agent(Claude / OpenClaw 等)通过 MCP 协议直接调用
|
|
36
|
+
|
|
37
|
+
## 安装
|
|
38
|
+
|
|
39
|
+
### 前提条件
|
|
40
|
+
|
|
41
|
+
电脑上需要 Node.js 18+。终端输入 `node -v` 检查,没有去 https://nodejs.org 下载。
|
|
42
|
+
|
|
43
|
+
### 安装步骤
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
npm install -g agent-reader
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
验证:`agent-reader doctor`,全是 ✓ 就装好了。
|
|
50
|
+
|
|
51
|
+
> 开发模式:clone 仓库后 `npm install && npm link`
|
|
52
|
+
|
|
53
|
+
## 小白模式(推荐)
|
|
54
|
+
|
|
55
|
+
只需记住一个命令:
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
agent-reader open 文件路径
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
系统按你的偏好自动处理。第一次用先设置偏好:
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
# 默认用网页打开(推荐)
|
|
65
|
+
agent-reader setup --default-open web
|
|
66
|
+
|
|
67
|
+
# 或者默认生成 Word
|
|
68
|
+
agent-reader setup --default-open word
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
可选值:`web`、`word`、`pdf`、`ppt`。
|
|
72
|
+
|
|
73
|
+
临时指定格式:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
agent-reader open 报告.md --as word
|
|
77
|
+
agent-reader open 报告.md --as pdf
|
|
78
|
+
agent-reader open ./图片文件夹/ --as ppt --auto 5
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## 日常使用
|
|
82
|
+
|
|
83
|
+
### 预览 Markdown(自动打开浏览器)
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
agent-reader render 你的文件.md
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
打开后左侧有可点击目录,右上角有"导出 Word"和"导出 PDF"按钮,直接点击即可下载。
|
|
90
|
+
|
|
91
|
+
### 换主题
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
agent-reader render 你的文件.md --theme light # 亮色(默认)
|
|
95
|
+
agent-reader render 你的文件.md --theme dark # 暗色
|
|
96
|
+
agent-reader render 你的文件.md --theme print # 打印友好
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### 导出 Word
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
agent-reader export 你的文件.md --format docx
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### 导出 PDF
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
agent-reader export 你的文件.md --format pdf
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### 图片幻灯片
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
agent-reader slides ./图片文件夹/ # 手动翻页
|
|
115
|
+
agent-reader slides ./图片文件夹/ --auto 5 # 每 5 秒自动切换
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
支持键盘左右键、全屏、缩略图导航、目录跳转。
|
|
119
|
+
|
|
120
|
+
### 幻灯片导出 PDF
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
agent-reader slides ./图片文件夹/ --format pdf
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
每张图片一页,适合打印或分享。
|
|
127
|
+
|
|
128
|
+
### 指定输出位置
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
agent-reader render 你的文件.md --out-dir ~/Desktop
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### 清理临时文件
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
agent-reader clean
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### 检查环境
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
agent-reader doctor
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
## 给 AI Agent 用
|
|
147
|
+
|
|
148
|
+
### CLI Agent 模式
|
|
149
|
+
|
|
150
|
+
加 `--profile agent`,输出纯 JSON:
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
agent-reader render report.md --profile agent
|
|
154
|
+
# {"path":"...","format":"html","size":12345,"warnings":[]}
|
|
155
|
+
|
|
156
|
+
agent-reader export report.md --format docx --profile agent
|
|
157
|
+
# {"path":"...","format":"docx","size":8765,"warnings":[]}
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
### MCP Server
|
|
161
|
+
|
|
162
|
+
兼容 Claude Desktop、OpenClaw、Cline 等所有支持 MCP 协议的 AI Agent 框架。Agent 调用一次即学会"输出排版技能"。
|
|
163
|
+
|
|
164
|
+
启动:`npm run mcp`
|
|
165
|
+
|
|
166
|
+
Claude Desktop 配置(`claude_desktop_config.json`):
|
|
167
|
+
|
|
168
|
+
```json
|
|
169
|
+
{
|
|
170
|
+
"mcpServers": {
|
|
171
|
+
"agent-reader": {
|
|
172
|
+
"command": "node",
|
|
173
|
+
"args": ["/path/to/agent-reader/src/mcp/server.js"]
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
提供 6 个工具:
|
|
180
|
+
|
|
181
|
+
| 工具 | 功能 |
|
|
182
|
+
|------|------|
|
|
183
|
+
| `render_markdown` | Markdown → 网页预览 |
|
|
184
|
+
| `export_document` | Markdown → PDF / Word |
|
|
185
|
+
| `create_slideshow` | 图片目录 → 幻灯片 |
|
|
186
|
+
| `open_file` | 智能打开(按偏好自动选格式) |
|
|
187
|
+
| `configure_user_preferences` | 设置默认偏好 |
|
|
188
|
+
| `get_user_preferences` | 读取当前偏好 |
|
|
189
|
+
|
|
190
|
+
所有工具支持 `return_content` 参数,可直接返回文件内容(适合沙箱/Docker 环境)。
|
|
191
|
+
|
|
192
|
+
## 适用场景
|
|
193
|
+
|
|
194
|
+
- AI Agent 生成报告/方案 → 直接交付给客户看
|
|
195
|
+
- Claude / GPT 输出的长文档 → 不用手动复制到 Word 调格式
|
|
196
|
+
- AI 生图工具(Nano Banana 等)批量出图 → 一键做成幻灯片展示
|
|
197
|
+
- 团队内部 AI 工作流 → MCP 接入后 Agent 自动输出专业文档
|
|
198
|
+
|
|
199
|
+
## 技术亮点
|
|
200
|
+
|
|
201
|
+
- **统一视觉源**:HTML 是 PDF 的视觉基线(Puppeteer 打印),DOCX 保证结构一致
|
|
202
|
+
- **智能表格列宽**:根据内容长度自动计算比例,中文不会被挤压断行
|
|
203
|
+
- **安全默认**:HTML sanitize 防 XSS、CSP 策略、SSRF 防护(禁止内网 IP)
|
|
204
|
+
- **零配置可用**:Pandoc 缺失自动降级、端口冲突自动递增、临时文件自动隔离
|
|
205
|
+
- **双模式输出**:human 模式自动打开 + 本地服务;agent 模式纯 JSON 输出
|
|
206
|
+
|
|
207
|
+
## 依赖说明
|
|
208
|
+
|
|
209
|
+
| 依赖 | 必需? | 用途 |
|
|
210
|
+
|------|--------|------|
|
|
211
|
+
| Node.js 18+ | 是 | 运行环境 |
|
|
212
|
+
| Puppeteer | 是 | PDF 导出(安装时自动下载 Chromium) |
|
|
213
|
+
| Pandoc | 否 | Word 导出更好看(没有会自动降级为纯 JS 方案) |
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import {
|
|
4
|
+
cleanCommand,
|
|
5
|
+
doctorCommand,
|
|
6
|
+
exportCommand,
|
|
7
|
+
openCommand,
|
|
8
|
+
renderCommand,
|
|
9
|
+
runCommandSafely,
|
|
10
|
+
setupCommand,
|
|
11
|
+
setupCommonCommandOptions,
|
|
12
|
+
slidesCommand,
|
|
13
|
+
} from '../src/cli/commands.js';
|
|
14
|
+
|
|
15
|
+
const program = new Command();
|
|
16
|
+
program
|
|
17
|
+
.name('agent-reader')
|
|
18
|
+
.description('AI Agent output beautifier and slideshow generator')
|
|
19
|
+
.version('0.1.0');
|
|
20
|
+
|
|
21
|
+
setupCommonCommandOptions(
|
|
22
|
+
program
|
|
23
|
+
.command('render [file]')
|
|
24
|
+
.description('Render Markdown to beautiful HTML')
|
|
25
|
+
.action((file, options) => runCommandSafely(() => renderCommand(file, options))),
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
setupCommonCommandOptions(
|
|
29
|
+
program
|
|
30
|
+
.command('export [file]')
|
|
31
|
+
.description('Export Markdown to PDF or DOCX')
|
|
32
|
+
.requiredOption('--format <format>', 'output format: pdf|docx')
|
|
33
|
+
.option('--page-size <size>', 'PDF page size: A4|Letter|A3', 'A4')
|
|
34
|
+
.action((file, options) => runCommandSafely(() => exportCommand(file, options))),
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
setupCommonCommandOptions(
|
|
38
|
+
program
|
|
39
|
+
.command('slides <dir>')
|
|
40
|
+
.description('Create slideshow HTML from image directory')
|
|
41
|
+
.option('--auto <seconds>', 'auto play interval in seconds')
|
|
42
|
+
.option('--format <format>', 'export format: pdf')
|
|
43
|
+
.option('--page-size <size>', 'PDF page size: A4|Letter|A3', 'A4')
|
|
44
|
+
.action((dir, options) => runCommandSafely(() => slidesCommand(dir, options))),
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
setupCommonCommandOptions(
|
|
48
|
+
program
|
|
49
|
+
.command('open <target>')
|
|
50
|
+
.description('Open content using preferred mode (web/word/pdf/ppt)')
|
|
51
|
+
.option('--as <mode>', 'open mode: auto|web|word|pdf|ppt', 'auto')
|
|
52
|
+
.option('--auto <seconds>', 'auto play seconds for ppt mode')
|
|
53
|
+
.option('--page-size <size>', 'PDF page size: A4|Letter|A3', 'A4')
|
|
54
|
+
.action((target, options) => runCommandSafely(() => openCommand(target, options))),
|
|
55
|
+
);
|
|
56
|
+
|
|
57
|
+
program
|
|
58
|
+
.command('setup')
|
|
59
|
+
.description('Configure default open behavior for non-technical users')
|
|
60
|
+
.option('--profile <mode>', 'use profile: human|agent', 'human')
|
|
61
|
+
.option('--json', 'json output')
|
|
62
|
+
.option('--default-open <mode>', 'default open mode: web|word|pdf|ppt')
|
|
63
|
+
.option('--theme <name>', 'default theme for web rendering')
|
|
64
|
+
.option('--reset', 'reset to defaults')
|
|
65
|
+
.action((options) => runCommandSafely(() => setupCommand(options)));
|
|
66
|
+
|
|
67
|
+
program
|
|
68
|
+
.command('doctor')
|
|
69
|
+
.description('Check runtime dependencies')
|
|
70
|
+
.option('--profile <mode>', 'use profile: human|agent', 'human')
|
|
71
|
+
.option('--json', 'json output')
|
|
72
|
+
.action((options) => runCommandSafely(() => doctorCommand(options)));
|
|
73
|
+
|
|
74
|
+
program
|
|
75
|
+
.command('clean')
|
|
76
|
+
.description('Clean old temporary outputs')
|
|
77
|
+
.option('--profile <mode>', 'use profile: human|agent', 'human')
|
|
78
|
+
.option('--out-dir <dir>', 'output directory root')
|
|
79
|
+
.option('--json', 'json output')
|
|
80
|
+
.option('--days <days>', 'max age in days', '7')
|
|
81
|
+
.action((options) => runCommandSafely(() => cleanCommand(options)));
|
|
82
|
+
|
|
83
|
+
await program.parseAsync(process.argv);
|
package/package.json
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "agent-reader",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "AI Agent 的文档美化引擎 — 一键把 Markdown 变成漂亮网页、Word、PDF 和幻灯片",
|
|
5
|
+
"main": "index.js",
|
|
6
|
+
"directories": {
|
|
7
|
+
"test": "test"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"test": "vitest run",
|
|
11
|
+
"test:watch": "vitest",
|
|
12
|
+
"mcp": "node src/mcp/server.js"
|
|
13
|
+
},
|
|
14
|
+
"keywords": [
|
|
15
|
+
"markdown",
|
|
16
|
+
"ai-agent",
|
|
17
|
+
"document",
|
|
18
|
+
"pdf",
|
|
19
|
+
"docx",
|
|
20
|
+
"slideshow",
|
|
21
|
+
"mcp",
|
|
22
|
+
"renderer"
|
|
23
|
+
],
|
|
24
|
+
"author": "",
|
|
25
|
+
"license": "MIT",
|
|
26
|
+
"type": "module",
|
|
27
|
+
"bin": {
|
|
28
|
+
"agent-reader": "./bin/agent-reader.js"
|
|
29
|
+
},
|
|
30
|
+
"engines": {
|
|
31
|
+
"node": ">=18"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"vitest": "^4.0.18"
|
|
35
|
+
},
|
|
36
|
+
"dependencies": {
|
|
37
|
+
"@modelcontextprotocol/sdk": "^1.27.1",
|
|
38
|
+
"commander": "^14.0.3",
|
|
39
|
+
"docx": "^9.6.1",
|
|
40
|
+
"execa": "^9.6.1",
|
|
41
|
+
"github-markdown-css": "^5.9.0",
|
|
42
|
+
"highlight.js": "^11.11.1",
|
|
43
|
+
"markdown-it": "^14.1.1",
|
|
44
|
+
"open": "^11.0.0",
|
|
45
|
+
"sanitize-html": "^2.17.1",
|
|
46
|
+
"swiper": "^12.1.2",
|
|
47
|
+
"zod": "^4.3.6"
|
|
48
|
+
},
|
|
49
|
+
"optionalDependencies": {
|
|
50
|
+
"puppeteer": "^24.39.0"
|
|
51
|
+
}
|
|
52
|
+
}
|