paperfit-cli 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/.claude/commands/adjust-length.md +21 -0
- package/.claude/commands/check-visual.md +27 -0
- package/.claude/commands/fix-layout.md +31 -0
- package/.claude/commands/migrate-template.md +23 -0
- package/.claude/commands/repair-table.md +21 -0
- package/.claude/commands/show-status.md +32 -0
- package/.claude-plugin/README.md +77 -0
- package/.claude-plugin/marketplace.json +41 -0
- package/.claude-plugin/plugin.json +39 -0
- package/CLAUDE.md +266 -0
- package/CONTRIBUTING.md +131 -0
- package/LICENSE +21 -0
- package/README.md +164 -0
- package/agents/code-surgeon-agent.md +214 -0
- package/agents/layout-detective-agent.md +229 -0
- package/agents/orchestrator-agent.md +254 -0
- package/agents/quality-gatekeeper-agent.md +270 -0
- package/agents/rule-engine-agent.md +224 -0
- package/agents/semantic-polish-agent.md +250 -0
- package/bin/paperfit.js +176 -0
- package/config/agent_roles.yaml +56 -0
- package/config/layout_rules.yaml +54 -0
- package/config/templates.yaml +241 -0
- package/config/vto_taxonomy.yaml +489 -0
- package/config/writing_rules.yaml +64 -0
- package/install.sh +30 -0
- package/package.json +52 -0
- package/requirements.txt +5 -0
- package/scripts/benchmark_runner.py +629 -0
- package/scripts/compile.sh +244 -0
- package/scripts/config_validator.py +339 -0
- package/scripts/cv_detector.py +600 -0
- package/scripts/evidence_collector.py +167 -0
- package/scripts/float_fixers.py +861 -0
- package/scripts/inject_defects.py +549 -0
- package/scripts/install-claude-global.js +148 -0
- package/scripts/install.js +66 -0
- package/scripts/install.sh +106 -0
- package/scripts/overflow_fixers.py +656 -0
- package/scripts/package-for-opensource.sh +138 -0
- package/scripts/parse_log.py +260 -0
- package/scripts/postinstall.js +38 -0
- package/scripts/pre_tool_use.py +265 -0
- package/scripts/render_pages.py +244 -0
- package/scripts/session_logger.py +329 -0
- package/scripts/space_util_fixers.py +773 -0
- package/scripts/state_manager.py +352 -0
- package/scripts/test_commands.py +187 -0
- package/scripts/test_cv_detector.py +214 -0
- package/scripts/test_integration.py +290 -0
- package/skills/consistency-polisher/SKILL.md +337 -0
- package/skills/float-optimizer/SKILL.md +284 -0
- package/skills/latex_fixers/__init__.py +82 -0
- package/skills/latex_fixers/float_fixers.py +392 -0
- package/skills/latex_fixers/fullwidth_fixers.py +375 -0
- package/skills/latex_fixers/overflow_fixers.py +250 -0
- package/skills/latex_fixers/semantic_micro_tuning.py +362 -0
- package/skills/latex_fixers/space_util_fixers.py +389 -0
- package/skills/latex_fixers/utils.py +55 -0
- package/skills/overflow-repair/SKILL.md +304 -0
- package/skills/space-util-fixer/SKILL.md +307 -0
- package/skills/taxonomy-vto/SKILL.md +486 -0
- package/skills/template-migrator/SKILL.md +251 -0
- package/skills/visual-inspector/SKILL.md +217 -0
- package/skills/writing-polish/SKILL.md +289 -0
package/CONTRIBUTING.md
ADDED
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# Contributing to PaperFit
|
|
2
|
+
|
|
3
|
+
感谢你考虑为 PaperFit 做出贡献!
|
|
4
|
+
|
|
5
|
+
## 项目概述
|
|
6
|
+
|
|
7
|
+
PaperFit 是一个基于 vision-in-the-loop 范式的多层智能体系统,专门对 LaTeX 学术论文执行视觉排版优化(VTO)。
|
|
8
|
+
|
|
9
|
+
## 如何贡献
|
|
10
|
+
|
|
11
|
+
### 报告问题
|
|
12
|
+
|
|
13
|
+
发现问题?请查看 [Issue 模板](.github/ISSUE_TEMPLATE/bug_report.md),提供尽可能多的上下文:
|
|
14
|
+
- 执行的命令
|
|
15
|
+
- 编译日志
|
|
16
|
+
- 视觉缺陷类别
|
|
17
|
+
- 截图(如适用)
|
|
18
|
+
|
|
19
|
+
### 提出新功能
|
|
20
|
+
|
|
21
|
+
有改进建议?使用 [Feature Request 模板](.github/ISSUE_TEMPLATE/feature_request.md) 描述你的想法。
|
|
22
|
+
|
|
23
|
+
### 提交代码
|
|
24
|
+
|
|
25
|
+
1. **Fork 项目**
|
|
26
|
+
2. **创建分支**:`git checkout -b feature/amazing-feature`
|
|
27
|
+
3. **进行修改**
|
|
28
|
+
4. **运行测试**:
|
|
29
|
+
```bash
|
|
30
|
+
python3 scripts/test_commands.py
|
|
31
|
+
python3 scripts/test_integration.py
|
|
32
|
+
```
|
|
33
|
+
5. **提交变更**:使用清晰的提交信息
|
|
34
|
+
```
|
|
35
|
+
feat: 添加新的 VTO 缺陷检测策略
|
|
36
|
+
|
|
37
|
+
- 实现 Category X 的检测逻辑
|
|
38
|
+
- 添加对应的 Skill
|
|
39
|
+
- 更新文档
|
|
40
|
+
```
|
|
41
|
+
6. **推送分支**:`git push origin feature/amazing-feature`
|
|
42
|
+
7. **创建 Pull Request**
|
|
43
|
+
|
|
44
|
+
## 开发环境设置
|
|
45
|
+
|
|
46
|
+
### 系统依赖
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
# macOS
|
|
50
|
+
brew install poppler
|
|
51
|
+
|
|
52
|
+
# Ubuntu/Debian
|
|
53
|
+
sudo apt install poppler-utils
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### Python 依赖
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
pip install -r requirements.txt
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### Claude Code 设置
|
|
63
|
+
|
|
64
|
+
确保你有 Claude Code CLI installed,并且项目位于 `~/果壳/PaperFit_VTO/` 目录下。
|
|
65
|
+
|
|
66
|
+
## 架构指南
|
|
67
|
+
|
|
68
|
+
### 添加新的 Command
|
|
69
|
+
|
|
70
|
+
在 `.claude/commands/` 目录下创建新的 `.md` 文件:
|
|
71
|
+
|
|
72
|
+
```markdown
|
|
73
|
+
# /my-command — 命令描述
|
|
74
|
+
|
|
75
|
+
**作用**: 简短描述
|
|
76
|
+
|
|
77
|
+
## 用法
|
|
78
|
+
|
|
79
|
+
```
|
|
80
|
+
/my-command
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## 执行流程
|
|
84
|
+
|
|
85
|
+
1. 步骤 1
|
|
86
|
+
2. 步骤 2
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### 添加新的 Skill
|
|
90
|
+
|
|
91
|
+
在 `skills/` 目录下创建新的技能目录和 `SKILL.md` 文件。参考现有 Skill 的结构。
|
|
92
|
+
|
|
93
|
+
### 添加新的 Agent
|
|
94
|
+
|
|
95
|
+
在 `agents/` 目录下创建新的 `.md` 文件。参考 [CLAUDE.md](CLAUDE.md) 中的 Agent 职责定义。
|
|
96
|
+
|
|
97
|
+
## 代码风格
|
|
98
|
+
|
|
99
|
+
- 遵循项目现有的编码风格
|
|
100
|
+
- Python 代码遵循 PEP 8
|
|
101
|
+
- Markdown 文件使用统一的标题层级
|
|
102
|
+
- 注释使用中文(项目主要语言)
|
|
103
|
+
|
|
104
|
+
## 测试
|
|
105
|
+
|
|
106
|
+
确保所有测试通过:
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
# 测试命令格式验证
|
|
110
|
+
python3 scripts/test_commands.py
|
|
111
|
+
|
|
112
|
+
# 测试集成关系
|
|
113
|
+
python3 scripts/test_integration.py
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## 发布流程
|
|
117
|
+
|
|
118
|
+
项目维护者会定期发布新版本。发布前会:
|
|
119
|
+
|
|
120
|
+
1. 运行完整的测试套件
|
|
121
|
+
2. 更新 CHANGELOG.md
|
|
122
|
+
3. 打 Git 标签
|
|
123
|
+
4. 发布到 GitHub Releases
|
|
124
|
+
|
|
125
|
+
## 许可
|
|
126
|
+
|
|
127
|
+
本项目采用 MIT 许可 - 详见 [LICENSE](LICENSE) 文件。
|
|
128
|
+
|
|
129
|
+
## 联系方式
|
|
130
|
+
|
|
131
|
+
如有问题,请通过 GitHub Issues 联系项目维护者。
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 PaperFit
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
# PaperFit — Vision-in-the-Loop Academic Typesetting Agent System
|
|
2
|
+
|
|
3
|
+
[](https://opensource.org/licenses/MIT)
|
|
4
|
+
|
|
5
|
+
PaperFit 是一个基于 vision-in-the-loop 范式的多层智能体系统,专门对 LaTeX 学术论文执行**视觉排版优化(Visual Typesetting Optimization, VTO)**。
|
|
6
|
+
|
|
7
|
+
## 核心使命
|
|
8
|
+
|
|
9
|
+
在论文已完成结构化格式排版(LaTeX 编译通过、内容完整)之后,通过**多模态证据链(源码 + 编译日志 + PDF + 页面图片)**驱动迭代闭环,消除视觉排版缺陷,使论文在专业审美、信息密度和可读性上达到出版级标准。
|
|
10
|
+
|
|
11
|
+
## 安装
|
|
12
|
+
|
|
13
|
+
### 方式 A:npm 一键部署到全局 Claude Code(推荐)
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
# 从 npm 安装(发布后)
|
|
17
|
+
npm install -g paperfit-cli
|
|
18
|
+
paperfit-install
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
或从 GitHub 直接装(无需先发 npm):
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
npm install -g git+https://github.com/OpenRaiser/PaperFit.git
|
|
25
|
+
paperfit-install
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
本地克隆一键脚本(等价:全局安装当前目录 + `paperfit-install`):
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
git clone https://github.com/OpenRaiser/PaperFit.git
|
|
32
|
+
cd PaperFit
|
|
33
|
+
bash install.sh --local
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
安装完成后建议:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
paperfit doctor
|
|
40
|
+
pip3 install -r "$(npm root -g)/paperfit-cli/requirements.txt"
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
**Claude Code Marketplace**(推荐与官方插件发现流程对齐):本仓库包含 `.claude-plugin/marketplace.json`,Marketplace 名为 `openraiser-paperfit`。在 Claude Code 中先添加市场再安装插件(具体 slash 命令以当前 CLI 为准):
|
|
44
|
+
|
|
45
|
+
```text
|
|
46
|
+
/plugin marketplace add https://github.com/OpenRaiser/PaperFit
|
|
47
|
+
/plugin install paperfit@openraiser-paperfit
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
详见 [.claude-plugin/README.md](.claude-plugin/README.md)。
|
|
51
|
+
|
|
52
|
+
**直接添加插件(不经 marketplace)**:在克隆后的仓库根目录执行 `claude plugin add .`(若 CLI 支持)。
|
|
53
|
+
|
|
54
|
+
全局配置副本位于 `~/.paperfit/config`,可通过 `export PAPERFIT_HOME=$HOME/.paperfit` 供脚本解析(可选)。
|
|
55
|
+
|
|
56
|
+
### 方式 B:仅克隆仓库(开发或离线)
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
git clone https://github.com/OpenRaiser/PaperFit.git
|
|
60
|
+
cd PaperFit
|
|
61
|
+
npm install
|
|
62
|
+
paperfit install-global --dry-run # 预览将写入 ~/.claude 的文件
|
|
63
|
+
paperfit install-global # 实际写入
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### 系统依赖
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
# macOS
|
|
70
|
+
brew install poppler
|
|
71
|
+
|
|
72
|
+
# Ubuntu/Debian
|
|
73
|
+
sudo apt install poppler-utils
|
|
74
|
+
|
|
75
|
+
# Python(渲染 PDF 页图等)
|
|
76
|
+
pip install pdf2image pillow pyyaml
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## 快速开始
|
|
80
|
+
|
|
81
|
+
PaperFit 通过 Claude Code 的斜杠命令系统工作。在 Claude Code 会话中输入:
|
|
82
|
+
|
|
83
|
+
```
|
|
84
|
+
/fix-layout
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
这将启动完整的 VTO 排版优化流程。
|
|
88
|
+
|
|
89
|
+
### 可用命令
|
|
90
|
+
|
|
91
|
+
| 命令 | 作用 |
|
|
92
|
+
|------|------|
|
|
93
|
+
| `/fix-layout` | 启动完整 VTO 闭环,自动迭代至通过或用户中断 |
|
|
94
|
+
| `/check-visual` | 仅执行视觉检测,输出诊断报告,不修改源文件 |
|
|
95
|
+
| `/repair-table` | 针对所有表格执行修复闭环 |
|
|
96
|
+
| `/adjust-length` | 尝试通过排版微调或语义改写逼近目标页数 |
|
|
97
|
+
| `/show-status` | 显示当前状态、缺陷列表与证据链摘要 |
|
|
98
|
+
|
|
99
|
+
## VTO 缺陷分类体系
|
|
100
|
+
|
|
101
|
+
PaperFit 采用五类层次化缺陷分类:
|
|
102
|
+
|
|
103
|
+
- **Category A:空间利用缺陷** — 孤行寡行、末页留白、页数预算、双栏末页高度不齐
|
|
104
|
+
- **Category B:浮动体缺陷** — 远离引用、尺寸不适配、连续堆叠、跨页分裂
|
|
105
|
+
- **Category C:排版一致性缺陷** — 表格字号不统一、图片风格不一致、Caption 格式不统一
|
|
106
|
+
- **Category D:溢出与对齐缺陷** — Overfull hbox、长公式未断行、URL 溢出
|
|
107
|
+
- **Category E:跨模板迁移缺陷** — 单双栏图表失配、页数重分布、宏兼容性问题
|
|
108
|
+
|
|
109
|
+
## 系统架构
|
|
110
|
+
|
|
111
|
+
### Agents(智能体层)
|
|
112
|
+
|
|
113
|
+
| Agent | 职责 |
|
|
114
|
+
|-------|------|
|
|
115
|
+
| `orchestrator-agent` | 主调度器:解析用户意图,管理闭环状态机,派发子 Agent |
|
|
116
|
+
| `layout-detective-agent` | 排版侦探:基于 VTO 分类体系进行视觉缺陷检测 |
|
|
117
|
+
| `rule-engine-agent` | 规则引擎:解析编译日志,提供硬约束通过保证 |
|
|
118
|
+
| `code-surgeon-agent` | 代码外科医生:执行表格重构、浮动体调整等代码级修复 |
|
|
119
|
+
| `semantic-polish-agent` | 语义润色:执行最小语义改写(孤行修复、扩写/缩写) |
|
|
120
|
+
| `quality-gatekeeper-agent` | 质量门禁:汇总多模态证据链,决定 DONE 或 CONTINUE |
|
|
121
|
+
|
|
122
|
+
### Skills(可复用技能库)
|
|
123
|
+
|
|
124
|
+
| Skill | 对应缺陷类别 |
|
|
125
|
+
|-------|-------------|
|
|
126
|
+
| `taxonomy-vto` | 全部 — VTO 缺陷分类知识库 |
|
|
127
|
+
| `space-util-fixer` | Category A — 孤行寡行修复、末页留白压缩 |
|
|
128
|
+
| `float-optimizer` | Category B — 浮动体位置优化 |
|
|
129
|
+
| `consistency-polisher` | Category C — 表格字号统一、格式规范 |
|
|
130
|
+
| `overflow-repair` | Category D — Overfull 处理、公式断行 |
|
|
131
|
+
| `template-migrator` | Category E — 跨模板迁移 |
|
|
132
|
+
| `visual-inspector` | 视觉验收 — PDF 页图渲染 |
|
|
133
|
+
| `writing-polish` | 语义微调 — 受控扩写/缩写 |
|
|
134
|
+
|
|
135
|
+
## 标准工作流
|
|
136
|
+
|
|
137
|
+
```
|
|
138
|
+
[用户输入] → 初始化 → 编译 → 规则检测 → 视觉检测 → 修复 → 门禁验收 → 决策
|
|
139
|
+
↑ ↓
|
|
140
|
+
└─────────────── CONTINUE ─────────────────────┘
|
|
141
|
+
↓
|
|
142
|
+
DONE → 交付结果
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
## 项目结构
|
|
146
|
+
|
|
147
|
+
```
|
|
148
|
+
PaperFit/
|
|
149
|
+
├── agents/ # Agent 定义文件
|
|
150
|
+
├── skills/ # 可复用技能库
|
|
151
|
+
├── config/ # 配置文件 (VTO 分类、规则等)
|
|
152
|
+
├── scripts/ # 工具脚本 (编译、渲染、状态管理)
|
|
153
|
+
├── docs/ # 文档
|
|
154
|
+
├── data/ # 运行时数据 (已 gitignore)
|
|
155
|
+
├── .claude/ # Claude Code 配置
|
|
156
|
+
│ ├── commands/ # 斜杠命令定义
|
|
157
|
+
│ └── CLAUDE.md # 系统提示词
|
|
158
|
+
├── CLAUDE.md # 主系统提示词
|
|
159
|
+
└── README.md
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
## License
|
|
163
|
+
|
|
164
|
+
MIT License — 详见 [LICENSE](LICENSE) 文件
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
# Code Surgeon Agent
|
|
2
|
+
|
|
3
|
+
## 角色与使命
|
|
4
|
+
|
|
5
|
+
你是 **Code Surgeon Agent**(代码外科医生),是 PaperFit 系统中专门负责 **执行 LaTeX 源码级排版修复** 的智能体。你的核心职责是:
|
|
6
|
+
|
|
7
|
+
- 接收来自 `layout-detective-agent` 和 `rule-engine-agent` 的诊断报告。
|
|
8
|
+
- 根据缺陷类型(`defect_id`)调用对应的修复 Skill(`overflow-repair`、`float-optimizer`、`space-util-fixer` 等)。
|
|
9
|
+
- 对 `.tex` 源文件进行精确、最小化的修改,消除或缓解排版缺陷。
|
|
10
|
+
- 记录每一次修改的 diff,确保可追溯和可回滚。
|
|
11
|
+
- 将修改后的文件路径和变更摘要返回给 `orchestrator-agent`,触发下一轮编译验证。
|
|
12
|
+
|
|
13
|
+
你 **不进行视觉判断**,也不决定修复策略的优先级——这些由上游 Agent 完成。你专注于 **执行**:定位代码位置、应用修复模板、写回文件。
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## 输入规范
|
|
18
|
+
|
|
19
|
+
| 输入项 | 来源 | 必需 | 说明 |
|
|
20
|
+
|--------|------|------|------|
|
|
21
|
+
| 主 `.tex` 文件路径 | 项目上下文 | ✅ | 项目主文件,可能包含 `\input` 或 `\include` 的子文件 |
|
|
22
|
+
| 诊断报告 | `layout-detective-agent` 或 `rule-engine-agent` | ✅ | 包含至少一个待修复缺陷,每个缺陷含 `defect_id`、`object`、`fix_suggestion`、`fix_skill` |
|
|
23
|
+
| 项目文件树 | 文件系统 | ✅ | 用于定位表格、图片等分散在子文件中的源码 |
|
|
24
|
+
| `state.json` | `orchestrator-agent` 维护 | ⚠️ | 提供历史修复记录,用于避免重复修改 |
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## 输出规范
|
|
29
|
+
|
|
30
|
+
完成修复后,你必须返回一份 **结构化 JSON 修改报告**:
|
|
31
|
+
|
|
32
|
+
```json
|
|
33
|
+
{
|
|
34
|
+
"agent": "code-surgeon",
|
|
35
|
+
"status": "success | partial | failed",
|
|
36
|
+
"modified_files": ["main.tex", "tables/results.tex"],
|
|
37
|
+
"backup_paths": ["data/backups/main_20260408_153000.tex", "..."],
|
|
38
|
+
"changes": [
|
|
39
|
+
{
|
|
40
|
+
"defect_id": "B2",
|
|
41
|
+
"object": "Figure 3",
|
|
42
|
+
"file": "main.tex",
|
|
43
|
+
"line_range": [156, 162],
|
|
44
|
+
"action": "将图片宽度改为 \\linewidth",
|
|
45
|
+
"before_snippet": "\\includegraphics[width=0.6\\textwidth]{fig3.pdf}",
|
|
46
|
+
"after_snippet": "\\includegraphics[width=\\linewidth]{fig3.pdf}",
|
|
47
|
+
"fix_skill": "float-optimizer"
|
|
48
|
+
}
|
|
49
|
+
],
|
|
50
|
+
"unresolved": [
|
|
51
|
+
{
|
|
52
|
+
"defect_id": "D2",
|
|
53
|
+
"object": "Equation (12)",
|
|
54
|
+
"reason": "公式结构复杂,自动断行可能破坏语义,需人工介入"
|
|
55
|
+
}
|
|
56
|
+
],
|
|
57
|
+
"next_required_action": "recompile"
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## 工作流程
|
|
64
|
+
|
|
65
|
+
### 第一步:接收诊断报告并预处理
|
|
66
|
+
|
|
67
|
+
1. 从 `orchestrator-agent` 获取本轮待修复的缺陷列表。
|
|
68
|
+
2. 按缺陷类别和对象去重,避免对同一处代码重复修改。
|
|
69
|
+
3. 确定修复顺序:
|
|
70
|
+
- 优先修复 **Critical** 和 **Major** 缺陷。
|
|
71
|
+
- 先修结构性改动(如环境替换),再修参数调整(如宽度、位置参数)。
|
|
72
|
+
- 表格和浮动体修复可能相互影响,建议先修表格宽度(B2/D1),再调浮动体位置(B1/B3)。
|
|
73
|
+
|
|
74
|
+
### 第二步:定位源码位置
|
|
75
|
+
|
|
76
|
+
根据诊断报告中的 `object`(如图表标签 `fig:result`、`tab:ablation`)或日志中的行号,在项目文件中定位需要修改的代码块。
|
|
77
|
+
|
|
78
|
+
**定位策略**:
|
|
79
|
+
- 若有明确行号:直接跳转。
|
|
80
|
+
- 若有标签:在 `.tex` 文件中搜索 `\label{fig:result}`,向上找到对应的环境起始位置。
|
|
81
|
+
- 若对象为段落文本:根据日志中的行号或上下文关键词搜索。
|
|
82
|
+
|
|
83
|
+
**多文件项目处理**:
|
|
84
|
+
- 若主文件通过 `\input` 或 `\include` 引入子文件,需递归搜索。
|
|
85
|
+
- 修改子文件后,记录子文件路径,主文件无需改动。
|
|
86
|
+
|
|
87
|
+
### 第三步:备份源文件
|
|
88
|
+
|
|
89
|
+
在修改任何文件之前,调用 `state_manager.py` 或手动将目标文件复制到 `data/backups/` 目录,使用时间戳命名:
|
|
90
|
+
```
|
|
91
|
+
data/backups/main_20260408_153000.tex
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
**备份规则**:
|
|
95
|
+
- 同一轮次修改多个文件时,每个文件单独备份。
|
|
96
|
+
- 备份完成后,在输出 JSON 中记录备份路径。
|
|
97
|
+
|
|
98
|
+
### 第四步:执行代码修改
|
|
99
|
+
|
|
100
|
+
根据缺陷的 `fix_skill` 字段,加载对应 Skill 的 `SKILL.md` 文档,按照其中定义的修复策略执行修改。
|
|
101
|
+
|
|
102
|
+
**通用修改原则**:
|
|
103
|
+
- **最小修改**:只改动必要的部分,不重构整个环境,除非确有必要。
|
|
104
|
+
- **保持语义**:不更改任何学术内容、数据、引用键、公式含义。
|
|
105
|
+
- **保留注释**:原有注释尽量保留,必要时添加简短说明(如 `% adjusted for column width`)。
|
|
106
|
+
- **格式规范**:保持原有缩进风格,避免引入无意义的空白变化。
|
|
107
|
+
|
|
108
|
+
#### 4.1 调用 `overflow-repair` Skill
|
|
109
|
+
|
|
110
|
+
适用于 D1(段落/表格溢出)、D2(公式溢出)、D3(URL 溢出)。
|
|
111
|
+
|
|
112
|
+
**典型修改示例**:
|
|
113
|
+
- 表格:将 `tabular` 替换为 `tabularx`,调整列定义。
|
|
114
|
+
- 公式:将 `equation` 替换为 `align` 或 `multline`。
|
|
115
|
+
- URL:为 `\href` 或裸 URL 添加 `\url{}` 包装。
|
|
116
|
+
|
|
117
|
+
**执行后**:记录修改前后的代码片段。
|
|
118
|
+
|
|
119
|
+
#### 4.2 调用 `float-optimizer` Skill
|
|
120
|
+
|
|
121
|
+
适用于 B1(远离引用)、B2(宽度不适配)、B3(堆叠)、B4(跨页分裂)。
|
|
122
|
+
|
|
123
|
+
**典型修改示例**:
|
|
124
|
+
- 位置参数:`[t]` → `[htbp]`。
|
|
125
|
+
- 图片宽度:`width=0.8\textwidth` → `width=\linewidth`。
|
|
126
|
+
- 长表格:`table` + `tabular` → `longtable`。
|
|
127
|
+
|
|
128
|
+
**注意**:若修改涉及跨栏图表(`figure*`),需确保模板支持且未与其它宏包冲突。
|
|
129
|
+
|
|
130
|
+
#### 4.3 调用 `space-util-fixer` Skill(待实现)
|
|
131
|
+
|
|
132
|
+
适用于 A1(孤行寡行)、A2(末页留白)、A3(页数预算)、A4(双栏末页不齐)。
|
|
133
|
+
|
|
134
|
+
**典型修改示例**:
|
|
135
|
+
- 孤行:在段落前添加 `{\looseness=-1 ... }` 或微调措辞。
|
|
136
|
+
- 末页留白:前移浮动体或轻微扩写结论。
|
|
137
|
+
- 页数调整:在 Discussion 部分增删若干句子(需联动 `semantic-polish-agent`)。
|
|
138
|
+
|
|
139
|
+
**注意**:涉及语义修改的部分(如扩写),应转交 `semantic-polish-agent` 处理,而非由本 Agent 自行生成内容。
|
|
140
|
+
|
|
141
|
+
### 第五步:写回文件并记录变更
|
|
142
|
+
|
|
143
|
+
1. 将修改后的内容写回原文件(覆盖)。
|
|
144
|
+
2. 为每个修改生成一条变更记录,包含:
|
|
145
|
+
- `defect_id`
|
|
146
|
+
- 对象名称
|
|
147
|
+
- 文件路径和行号范围
|
|
148
|
+
- 修改前后的关键代码片段
|
|
149
|
+
- 调用的 Skill 名称
|
|
150
|
+
3. 若某项修复无法完成(如公式过于复杂),将其放入 `unresolved` 列表并说明原因。
|
|
151
|
+
|
|
152
|
+
### 第六步:输出修改报告
|
|
153
|
+
|
|
154
|
+
按照输出规范生成 JSON 报告,返回给 `orchestrator-agent`,并设置 `next_required_action: "recompile"`。
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## 修复决策树
|
|
159
|
+
|
|
160
|
+
```mermaid
|
|
161
|
+
graph TD
|
|
162
|
+
A[接收缺陷] --> B{缺陷类别}
|
|
163
|
+
B -->|D1/D2/D3| C[调用 overflow-repair]
|
|
164
|
+
B -->|B1/B2/B3/B4| D[调用 float-optimizer]
|
|
165
|
+
B -->|A1/A2/A4| E[调用 space-util-fixer]
|
|
166
|
+
B -->|A3| F{需扩写/缩写?}
|
|
167
|
+
F -->|是| G[转交 semantic-polish-agent]
|
|
168
|
+
F -->|否| E
|
|
169
|
+
C --> H[定位源码]
|
|
170
|
+
D --> H
|
|
171
|
+
E --> H
|
|
172
|
+
H --> I[备份文件]
|
|
173
|
+
I --> J[应用修复模板]
|
|
174
|
+
J --> K{修改成功?}
|
|
175
|
+
K -->|是| L[写回文件,记录 diff]
|
|
176
|
+
K -->|否| M[标记 unresolved]
|
|
177
|
+
L --> N[输出修改报告]
|
|
178
|
+
M --> N
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
## 与其它 Agent 的协作
|
|
184
|
+
|
|
185
|
+
- **上游**:
|
|
186
|
+
- `rule-engine-agent` 提供基于日志的精确位置(行号)。
|
|
187
|
+
- `layout-detective-agent` 提供基于视觉的缺陷对象(图表标签、页码)。
|
|
188
|
+
- `orchestrator-agent` 汇总并派发修复任务。
|
|
189
|
+
- **下游**:
|
|
190
|
+
- 修改报告返回给 `orchestrator-agent`,触发重新编译和下一轮视觉检测。
|
|
191
|
+
- 若需语义级干预,将请求转发给 `semantic-polish-agent`。
|
|
192
|
+
- **同级**:
|
|
193
|
+
- 与 `semantic-polish-agent` 协同:本 Agent 处理排版级修改,语义 Agent 处理内容级修改。
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
## 错误处理与回滚
|
|
198
|
+
|
|
199
|
+
1. **定位失败**:若无法找到缺陷对应的源码位置,标记为 `failed`,在 `unresolved` 中说明“无法定位”。
|
|
200
|
+
2. **修改导致编译错误**:若下一轮编译失败,`orchestrator-agent` 将通知你回滚。使用备份文件恢复,并在报告中记录回滚操作。
|
|
201
|
+
3. **部分成功**:若一个文件中有多处修改,部分成功部分失败,状态标记为 `partial`,分别列出成功和失败项。
|
|
202
|
+
|
|
203
|
+
---
|
|
204
|
+
|
|
205
|
+
## 注意事项
|
|
206
|
+
|
|
207
|
+
- **不要修改学术内容**:你的修改仅限于 LaTeX 控制序列、环境参数、宽度设置等排版层面。任何涉及文字增删、句子改写的行为,必须转交 `semantic-polish-agent`。
|
|
208
|
+
- **保持代码可读性**:修改后的代码仍应易于人类阅读和后续编辑。
|
|
209
|
+
- **避免引入新的缺陷**:例如,将 `tabular` 改为 `tabularx` 时,确保导言区已加载 `tabularx` 宏包。若未加载,需同时在导言区添加 `\usepackage{tabularx}`。
|
|
210
|
+
- **多文件项目同步**:若修改了子文件中的表格,而该表格的 `\label` 在主文件中被引用,无需额外操作;LaTeX 的交叉引用机制会自动处理。
|
|
211
|
+
|
|
212
|
+
---
|
|
213
|
+
|
|
214
|
+
**Code Surgeon Agent 就绪。** 等待诊断报告,开始执行精准的源码修复。
|