papilot 0.8.0 → 0.8.2

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.
Files changed (71) hide show
  1. package/README.de.md +110 -0
  2. package/README.es.md +110 -0
  3. package/README.fr.md +110 -0
  4. package/README.it.md +110 -0
  5. package/README.ja.md +110 -0
  6. package/README.ko.md +110 -0
  7. package/README.md +54 -121
  8. package/README.pt.md +110 -0
  9. package/README.sv.md +110 -0
  10. package/README.zh-CN.md +58 -117
  11. package/README.zh-Hant.md +110 -0
  12. package/bin/doctor.mjs +7 -5
  13. package/dist/assets/{_virtual_papilot-licenses-D7ro6ecN.js → _virtual_papilot-licenses-CMfCtEYQ.js} +1 -1
  14. package/dist/assets/index-oAIkxhfp.js +265 -0
  15. package/dist/assets/index-t_qCOF_B.css +1 -0
  16. package/dist/assets/{math-V9uUaUzA.js → math-CEU4m4-H.js} +1 -1
  17. package/dist/assets/{pdf-view-Bnb2uIBE.js → pdf-view-HWRGBLsZ.js} +1 -1
  18. package/dist/index.html +2 -2
  19. package/examples/papilot-paper/preview/main.pdf +0 -0
  20. package/examples/papilot-paper/preview/main.synctex.gz +0 -0
  21. package/package.json +18 -5
  22. package/src/server/acp.ts +44 -7
  23. package/src/server/agents.ts +5 -3
  24. package/src/server/app.ts +10 -3
  25. package/src/server/desktop-demo.ts +38 -0
  26. package/src/server/imports.ts +60 -21
  27. package/src/server/manuscript.ts +44 -8
  28. package/src/server/reconcile.ts +20 -0
  29. package/src/server/review.ts +3 -2
  30. package/src/server/start.ts +26 -4
  31. package/src/server/store.ts +0 -8
  32. package/src/server/update-install.ts +22 -2
  33. package/src/server/updates.ts +32 -12
  34. package/src/server/workspace.ts +78 -15
  35. package/src/shared.ts +20 -9
  36. package/src/skill-metadata.ts +1 -1
  37. package/vendor/latex-review/dist/web/assets/index-DVs7cTBl.js +19 -0
  38. package/vendor/latex-review/dist/web/assets/index-ysOpu05D.css +1 -0
  39. package/vendor/latex-review/dist/web/index.html +2 -2
  40. package/vendor/latex-review/src/core/build.ts +180 -97
  41. package/vendor/latex-review/src/core/current-commit.ts +104 -0
  42. package/vendor/latex-review/src/core/delivery.ts +62 -16
  43. package/vendor/latex-review/src/core/git.ts +135 -29
  44. package/vendor/latex-review/src/core/outline.ts +0 -9
  45. package/vendor/latex-review/src/core/publish.ts +7 -1
  46. package/vendor/latex-review/src/core/reconcile.ts +101 -0
  47. package/vendor/latex-review/src/core/review.ts +5 -2
  48. package/vendor/latex-review/src/core/store.ts +1 -0
  49. package/vendor/latex-review/src/core/tasks.ts +1 -1
  50. package/vendor/latex-review/src/locales.ts +47 -0
  51. package/vendor/latex-review/src/server.ts +12 -1
  52. package/vendor/latex-review/src/types.ts +5 -2
  53. package/vendor/latex-review/src/web/i18n.ts +9 -21
  54. package/vendor/latex-review/src/web/locales/de.json +250 -0
  55. package/vendor/latex-review/src/web/locales/es.json +250 -0
  56. package/vendor/latex-review/src/web/locales/fr.json +250 -0
  57. package/vendor/latex-review/src/web/locales/index.ts +16 -0
  58. package/vendor/latex-review/src/web/locales/it.json +250 -0
  59. package/vendor/latex-review/src/web/locales/ja.json +250 -0
  60. package/vendor/latex-review/src/web/locales/ko.json +250 -0
  61. package/vendor/latex-review/src/web/locales/pt.json +250 -0
  62. package/vendor/latex-review/src/web/locales/sv.json +250 -0
  63. package/vendor/latex-review/src/web/locales/zh-Hant.json +250 -0
  64. package/vendor/latex-review/src/web/references.tsx +1 -1
  65. package/vendor/latex-review/src/web/review.tsx +8 -6
  66. package/vendor/latex-review/src/web/style.css +1 -11
  67. package/vendor/latex-review/src/web/zh-CN.ts +4 -2
  68. package/dist/assets/index-Cc-awdNn.css +0 -1
  69. package/dist/assets/index-D_VX51no.js +0 -265
  70. package/vendor/latex-review/dist/web/assets/index-7VKAte5x.js +0 -19
  71. package/vendor/latex-review/dist/web/assets/index-DEz-LsGl.css +0 -1
package/README.zh-CN.md CHANGED
@@ -1,169 +1,110 @@
1
1
  <div align="center">
2
2
 
3
3
  <h1>
4
- <picture>
5
- <source media="(prefers-color-scheme: dark)" srcset="docs/assets/logo-dark.svg">
6
- <img src="docs/assets/logo.svg" width="48" height="48" align="absmiddle" alt="Papilot 标志">
7
- </picture>
8
- Papilot
4
+ <img src="docs/assets/wordmark.svg#gh-light-mode-only" width="280" height="88" alt="Papilot">
5
+ <img src="docs/assets/wordmark-dark.svg#gh-dark-mode-only" width="280" height="88" alt="Papilot">
9
6
  </h1>
10
7
 
11
- <p><b>像 Cursor 一样改论文:直接在 PDF 上批注和审阅,完全不用碰 LaTeX。</b></p>
8
+ <p><b>借助 AI 修订 LaTeX 论文,并在 PDF 上审阅修改。</b></p>
12
9
 
13
- <p><a href="README.md">English</a> · 简体中文</p>
10
+ <p><a href="https://papilot.ai">官网</a> · <a href="docs/guide.md">文档</a></p>
14
11
 
15
- [![CI](https://github.com/cu1ch3n/papilot/actions/workflows/ci.yml/badge.svg)](https://github.com/cu1ch3n/papilot/actions/workflows/ci.yml)
12
+ <p data-language-switcher><a href="README.md">English</a> · <a href="README.zh-CN.md">简体中文</a> · <a href="README.zh-Hant.md">繁體中文</a> · <a href="README.ja.md">日本語</a> · <a href="README.ko.md">한국어</a> · <a href="README.de.md">Deutsch</a> · <a href="README.fr.md">Français</a> · <a href="README.es.md">Español</a> · <a href="README.pt.md">Português</a> · <a href="README.it.md">Italiano</a> · <a href="README.sv.md">Svenska</a></p>
13
+
14
+ [![CI](https://github.com/PapilotAI/papilot/actions/workflows/ci.yml/badge.svg)](https://github.com/PapilotAI/papilot/actions/workflows/ci.yml)
16
15
  [![npm](https://img.shields.io/npm/v/papilot?color=2563eb&logo=npm)](https://www.npmjs.com/package/papilot)
17
16
  [![License: MIT](https://img.shields.io/badge/license-MIT-2563eb)](LICENSE)
18
- [![Node.js](https://img.shields.io/badge/node-%E2%89%A522.22-5FA04E?logo=nodedotjs&logoColor=white)](https://nodejs.org)
19
- [![TypeScript](https://img.shields.io/badge/TypeScript-3178C6?logo=typescript&logoColor=white)](https://www.typescriptlang.org)
20
- [![React](https://img.shields.io/badge/React-19-087EA4?logo=react&logoColor=white)](https://react.dev)
21
- [![LaTeX](https://img.shields.io/badge/LaTeX-008080?logo=latex&logoColor=white)](https://www.latex-project.org)
22
- [![PRs welcome](https://img.shields.io/badge/PRs-welcome-22c55e)](https://github.com/cu1ch3n/papilot/pulls)
23
-
24
- **目录:** [功能](#-功能) · [快速开始](#-快速开始) · [智能体](#-智能体) · [文档](#-文档) · [社区](#-社区) · [友情链接](#-友情链接) · [许可证](#-许可证)
25
17
 
26
- <img src="docs/assets/demo.gif" alt="Papilot:在 PDF 上批注一段文字,交给智能体,接受排版后的改动并提交" width="100%">
18
+ <p><img src="docs/assets/demo.gif" alt="Papilot:在 PDF 上标注段落,交给智能体处理,并审阅排版后的修改" width="100%"></p>
27
19
 
28
20
  </div>
29
21
 
30
- 你像导师批改学生的稿子一样,直接在 PDF 上阅读和批注;AI 智能体去改 LaTeX,每一处改动都以排版后修改前后的对比回到你面前。你点头之前,论文一个字都不会变。
22
+ Papilot 是一个与 AI 智能体协作撰写和修订 LaTeX 论文的本地工作区。在 PDF 上标注段落和公式,让智能体在独立的源码副本上进行编辑,随后审阅排版后的修改并选择要保留的内容。
31
23
 
32
- > [!TIP]
33
- > **0.7 新功能**:全新设计的工作台、按颜色分组的批注、任务中附带文件和图片、技能库,以及接受的改动保存到哪里由你选择。详见[更新日志](CHANGELOG.md)。
24
+ <a id="features"></a>
34
25
 
35
- ## ✨ 功能
26
+ ## 功能特性
36
27
 
37
28
  <table>
38
29
  <tr>
39
30
  <td width="50%" valign="top">
40
- <img src="docs/assets/readme-note.zh-CN.jpg" alt="两段文字在黄色批注组里,一个公式上有区域批注">
41
- <h3>📝 在 PDF 上批注</h3>
42
- 选中一句话或框出一个公式,写下要怎么改。SyncTeX 会把对应的 LaTeX 行准确交给智能体。相关的批注可以用颜色归成一组,整组只写一条要求。
43
- </td>
44
- <td width="50%" valign="top">
45
- <img src="docs/assets/readme-review.zh-CN.jpg" alt="排版页面上改动的修改前后对比,带接受、拒绝和评论按钮">
46
- <h3>✅ 逐条点头</h3>
47
- 每处改动都以排版后的差异呈现,连同它在别处引起的变化,比如重新编号的公式和目录。接受、拒绝或评论,任何决定都能撤销。
48
- </td>
49
- </tr>
50
- <tr>
51
- <td width="50%" valign="top">
52
- <img src="docs/assets/readme-deliver.zh-CN.jpg" alt="审阅结束后,带智能体写好的提交信息,以及「应用到工作目录」和「提交」按钮">
53
- <h3>📦 改动去哪由你定</h3>
54
- 审阅结束前,接受的改动只保存在任务里。之后可以应用到工作目录,也可以提交到独立的 <code>papilot/…</code> 分支,提交信息由智能体来写。
31
+ <a href="docs/assets/readme-note.jpg"><img src="docs/assets/readme-note.jpg" alt="PDF 上按颜色分组的段落批注与框选的公式批注"></a>
32
+ <h3>在 PDF 上添加批注</h3>
33
+ 选中句子或框选公式,说明需要修改的内容。按颜色将相关批注分组,即可对多个段落统一下达指令。
55
34
  </td>
56
35
  <td width="50%" valign="top">
57
- <img src="docs/assets/readme-git.zh-CN.jpg" alt="Git 面板:已暂存的文件、自动生成的提交信息、任务工作树和提交关系图">
58
- <h3>🌿 不离开页面用 Git</h3>
59
- 暂存文件,让智能体写提交信息,再 pull、push。每个任务的工作树都显示在提交关系图里;合并合作者的改动时,冲突可以交给智能体解决。
36
+ <a href="docs/assets/readme-review.jpg"><img src="docs/assets/readme-review.jpg" alt="页面上的排版前后对比差异,带有接受、拒绝和评论按钮"></a>
37
+ <h3>审阅每处修改</h3>
38
+ 对比修改前后的排版页面,包括公式重新编号等其他位置的变动。对每处编辑执行接受、拒绝或评论操作,并可在审阅过程中随时撤销决定。
60
39
  </td>
61
40
  </tr>
62
41
  <tr>
63
42
  <td width="50%" valign="top">
64
- <img src="docs/assets/readme-contents.zh-CN.jpg" alt="打开目录面板的 PDF 阅读器">
65
- <h3>📖 像本地 PDF 一样阅读</h3>
66
- 用目录随意跳转,全文搜索,缩放清晰。选中的文字与印出的词完全对齐。
43
+ <a href="docs/assets/readme-deliver.jpg"><img src="docs/assets/readme-deliver.jpg" alt="将已接受的编辑应用到论文原稿"></a>
44
+ <h3>选择编辑的去向</h3>
45
+ 每个新任务都在各自的论文副本上运行。审阅编辑后,选择 **提交到论文原稿** 将此任务保存为当前分支上的一次提交,或选择 **应用到工作区** 使编辑保持未提交状态。如果同一段落在此期间发生了变动,AI 会自动解决冲突,仅在预期内容不明确时向你询问。保存前可先审阅合并后的 PDF,准备就绪后即可从 Git 面板推送。
67
46
  </td>
68
47
  <td width="50%" valign="top">
69
- <h3>🧰 还有</h3>
70
- <ul>
71
- <li>✨ <b>技能(skill)</b>,如润色、校对、检查数学,输入 <code>/</code> 即可选用,也能在设置里写你自己的</li>
72
- <li>📎 任务和消息都能附带<b>文件和图片</b></li>
73
- <li>🤖 <b>Codex、Claude、Cursor、Kimi Code、GLM、DeepSeek、Qwen Code、OpenCode 或 Antigravity</b>:电脑上装了哪个就用哪个,各用你自己的登录</li>
74
- <li>🌳 <b>每个任务都有独立的 Git 工作树</b>,最多两个同时运行</li>
75
- <li>🌗 <b>浅色与深色</b>,界面支持中文和英文</li>
76
- <li>📱 <b>运行在你的电脑上</b>,也能用手机打开</li>
77
- </ul>
48
+ <a href="docs/assets/readme-git.jpg"><img src="docs/assets/readme-git.jpg" alt="包含已暂存文件、生成的提交说明和提交图的 Git 面板"></a>
49
+ <h3>与 Git 配合使用</h3>
50
+ 在工作区中暂存和提交文件、拉取及推送更改。智能体可以起草提交说明并协助解决合并冲突;提交图会显示每个任务的工作树。
78
51
  </td>
79
52
  </tr>
80
53
  </table>
81
54
 
82
- ## 🚀 快速开始
83
-
84
- > [!NOTE]
85
- > 需要 **Node.js 22.22+**、**Git** 和完整的 **TeX** 发行版([MacTeX](https://www.tug.org/mactex/) 或 [TeX Live](https://www.tug.org/texlive/))。修改论文还需要至少一个[已登录的智能体](#-智能体)。
86
-
87
- ```sh
88
- npm install -g papilot
89
- papilot demo
90
- ```
55
+ - **[技能](docs/guide.md#skills)与[附件](docs/guide.md#task-attachments):** 运行 `/` 技能来润色行文、校对文本或检查数学公式,在设置中定义自定义技能,并向任务和消息添加参考文件或图片附件。
56
+ - **阅读与工作区:** 通过 PDF 目录和全文搜索浏览论文原稿,支持浅色与深色主题以及英文或中文界面。
91
57
 
92
- 打开 **http://127.0.0.1:7274**,在侧栏选择 **稿件**。demo 会添加一篇示例论文供你修改:一篇讲 Papilot 本身的 26 页 LaTeX 论文,满是公式。准备好之后,运行 `papilot`,在论文菜单中选择 **添加论文…**,选择 LaTeX 文件夹或拖入 ZIP。Papilot 会识别主文件、准备 Git 历史并尝试编译,遇到问题可在导入窗口中重试或请求助手修复。
58
+ <a id="quick-start"></a>
93
59
 
94
- ## 🤖 智能体
60
+ ## 快速开始
95
61
 
96
- | 智能体 | 登录(一次即可) | Papilot 如何运行它 |
97
- | --- | --- | --- |
98
- | **Codex** | `papilot codex login` | 通过 Codex app server 在其工作区沙箱中运行;已装有 `codex` 就直接用,没有则在首次启动时自动安装。 |
99
- | **Claude** | 安装 [Claude Code](https://code.claude.com) 并运行 `claude auth login`,或设置好 `ANTHROPIC_API_KEY` 再启动 `papilot` | 装了 Claude Code 时,用你自己的登录(Claude 订阅或密钥)运行 `claude -p`,在 Claude Code 的沙箱中工作;没装时通过 Claude Agent SDK 运行,需要 API 密钥。 |
100
- | **Cursor** | 设置好 `CURSOR_API_KEY` 再启动 `papilot` | 通过 Cursor SDK 在 Cursor 的沙箱中运行,首次使用时下载;该 SDK 不使用 Cursor 应用或 CLI 的登录。 |
101
- | **Kimi Code** | 安装 [Kimi Code CLI](https://www.kimi.com/code/docs/en/kimi-code-cli/guides/getting-started),运行 `kimi login` | 通过 `kimi acp` 使用本机配置,支持流式回复、会话恢复和工具审批。 |
102
- | **GLM** | 设置好 `ZHIPU_API_KEY`(或 `ZAI_API_KEY`)再启动 `papilot` | 按智谱为 GLM Coding Plan 给出的方式,让 Claude Code 连接智谱的 Anthropic 兼容接口。 |
103
- | **DeepSeek** | 安装 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness)(`npm install -g @deepseek-ai/dsh`)并在其中配置好模型 | 通过 `dsh acp` 在其工作区沙箱中运行;工作树以外的操作需要审批。 |
104
- | **Qwen Code** | 安装 [Qwen Code](https://github.com/QwenLM/qwen-code),运行 `qwen` 登录 | 以自动编辑模式运行 `qwen --acp`:改文件直接进行,运行命令需要审批。 |
105
- | **OpenCode** | 安装 [OpenCode](https://opencode.ai),用 `opencode auth login` 连接模型服务商 | 用你配置的服务商运行 `opencode acp`;运行命令和工作树以外的操作需要审批。 |
106
- | **Antigravity** | 安装 Antigravity 并登录 `agy` | 运行 `agy -p`,每轮一个进程,只编辑文件;所在地区需要代理时设置 `PAPILOT_AGY_PROXY`。 |
62
+ 有关 macOS 和 Linux 桌面应用及本地构建说明,请参阅 [Papilot Desktop](desktop/README.md)。桌面端 CI 会构建 Apple Silicon 和 Intel Mac 安装程序,以及 Linux x64 AppImage 和 deb 软件包。
107
63
 
108
- Papilot 会自动找出电脑上已有的智能体,只列出这些;Codex 始终可用。Papilot 运行期间安装或登录了新的智能体,点击 **重新连接** 即可。如果服务找不到 CLI,可以用 `PAPILOT_KIMI_BIN`、`PAPILOT_DSH_BIN`、`PAPILOT_QWEN_BIN` 或 `PAPILOT_OPENCODE_BIN` 指定其路径。各智能体支持的功能和已验证的版本见[智能体指南](docs/guide.md#agents)。
109
-
110
- Papilot 从不保存你的凭据。CLI 智能体使用各自的登录;为 Claude、Cursor 或 GLM 设置的密钥只会交给对应的服务。已找到但没有登录的智能体会显示为不可用。
111
-
112
- 启动遇到问题?打开 **设置 → 运行环境**,在**智能体**中查看智能体配置,或在 **LaTeX** 中查看识别到的发行版、版本和位置,或运行 `papilot doctor` 检查环境并查看修复建议,用 `papilot doctor --repo /path/to/paper` 一并检查论文。加上 `--json` 可输出机器可读的报告。诊断不会安装软件、启动服务或修改论文。检查范围见[诊断指南](docs/guide.md#diagnostics)。
113
-
114
- <details>
115
- <summary><b>⚙️ 选项与远程访问</b></summary>
116
-
117
- <br>
64
+ Papilot 需要 **Node.js 22.22+**、**Git**,以及包含 `latexmk` 和 `synctex` 的完整 **TeX** 发行版([MacTeX](https://www.tug.org/mactex/) 或 [TeX Live](https://www.tug.org/texlive/))。修订论文还需要至少配置一个[智能体](#agents)。
118
65
 
119
66
  ```sh
120
- papilot --port 4400 # 使用其他本地端口
121
- papilot --data ~/papilot-data # 把状态放在别处(默认 ~/.papilot)
122
- papilot service install # macOS:登录后自动启动,退出后自动重启
123
- npm uninstall -g papilot # 卸载;状态仍保留在 ~/.papilot,可自行删除
67
+ npm install -g papilot
68
+ papilot demo
124
69
  ```
125
70
 
126
- 有新版本时,**设置** 旁会出现 **有新版本**,点击即可在浏览器中安装。Papilot 会等任务和 PDF 编译结束后重启,并重新连接页面。更新会保留你的数据,也会保留上一版安装以便回滚。详见[更新](docs/guide.md#updates)。
127
-
128
- Papilot 只监听 `127.0.0.1`。若要从其他设备访问,用 Tailscale Serve 把它发布到你的 tailnet,并设置 `PAPILOT_PUBLIC_ORIGIN` 和 `PAPILOT_TAILSCALE_LOGIN`;Papilot 会校验每个请求的主机、浏览器来源和 Tailscale 身份。具体步骤见[指南](docs/guide.md#remote-access-with-tailscale)。
71
+ 打开 [http://127.0.0.1:7274](http://127.0.0.1:7274),在侧边栏中选择 **论文原稿**,即可浏览内置的示例论文。
129
72
 
130
- 要邀请导师或合作者,用 `PAPILOT_ACCOUNT_ORIGIN` 给 Papilot 一个公开的 HTTPS 地址,然后打开 **设置 → 共享**:每个人用通行密钥登录,只能看到你共享的论文。只邀请你愿意让其访问运行 Papilot 的这台电脑的人,详见[协作者](docs/guide.md#collaborators)。
131
-
132
- </details>
133
-
134
- <details>
135
- <summary><b>🛠️ 参与开发</b></summary>
136
-
137
- <br>
138
-
139
- ```sh
140
- git clone https://github.com/cu1ch3n/papilot && cd papilot
141
- npm ci && npm run setup:review
142
- npm run build && npm start
143
- ```
73
+ 若要处理你自己的论文原稿,请运行 `papilot` 并选择 **添加论文…** 以打开本地 LaTeX 文件夹或 ZIP 压缩包。Papilot 会查找主 `.tex` 文件,在需要时准备 Git 历史记录,并尝试编译。如果主文件不明确或构建失败,导入对话框会协助你选择文件或修复问题。
144
74
 
145
- 提交 pull request 前,请运行 `npm run typecheck`、`npm test` 和 `npm run test:ui`。
75
+ 可在 **设置 → 运行环境** 下的 **智能体** 或 **LaTeX** 中检查配置。运行 `papilot doctor` 进行环境检查,或运行 `papilot doctor --repo /path/to/paper` 一并检查论文原稿([诊断说明](docs/guide.md#diagnostics))。
146
76
 
147
- </details>
77
+ <a id="agents"></a>
148
78
 
149
- ## 📚 文档
79
+ ## 智能体
150
80
 
151
- **[指南](docs/guide.md)**(英文)介绍工作台的每个部分、配置变量、重启后的恢复以及开发流程。[`examples/papilot-paper`](examples/papilot-paper) 中的示例论文深入讲解了设计,并附有证明。每个版本的变化见[更新日志](CHANGELOG.md)。
81
+ <!-- BEGIN AGENT ICONS -->
82
+ <p align="center">
83
+ <a href="docs/guide.md#agents">
84
+ <picture>
85
+ <source media="(prefers-color-scheme: dark) and (max-width: 600px)" srcset="docs/assets/readme-agents/compact-dark.svg">
86
+ <source media="(prefers-color-scheme: dark)" srcset="docs/assets/readme-agents/desktop-dark.svg">
87
+ <source media="(max-width: 600px)" srcset="docs/assets/readme-agents/compact.svg">
88
+ <img src="docs/assets/readme-agents/desktop.svg" alt="Codex, Claude, Cursor, Copilot, Grok, Antigravity, Kimi, GLM, DeepSeek, Qwen, OpenCode" width="816">
89
+ </picture>
90
+ </a>
91
+ </p>
92
+ <!-- END AGENT ICONS -->
152
93
 
153
- ## 💬 社区
94
+ 你可以为每个任务选择智能体和模型。根据集成方式的不同,Papilot 会使用智能体的本地 CLI 登录状态或你提供的服务商 API 凭据来运行智能体,且不会存储你的密钥。
154
95
 
155
- - 💡 **提问和想法**:[Discussions](https://github.com/cu1ch3n/papilot/discussions)
156
- - 🐛 **遇到问题**:[提交 issue](https://github.com/cu1ch3n/papilot/issues/new/choose)
157
- - 🤝 **想参与**:从 [good first issue](https://github.com/cu1ch3n/papilot/labels/good%20first%20issue) 开始,并阅读 [CONTRIBUTING.md](CONTRIBUTING.md)
96
+ 打开 **设置 → 运行环境 → 智能体** 查看状态、模型和配置说明(例如 `papilot codex login`)。如果在 Papilot 运行期间安装或登录了智能体,请点击 **重新连接**;如果修改了环境变量,请重启 `papilot`。有关各智能体的要求与功能,请参阅[智能体指南](docs/guide.md#agents)。
158
97
 
159
- 如果 Papilot 帮你省下了改论文的时间,点个 ⭐ 能让更多研究者发现它。
98
+ <a id="documentation-and-community"></a>
160
99
 
161
- <a href="https://github.com/cu1ch3n/papilot/graphs/contributors"><img src="https://contrib.rocks/image?repo=cu1ch3n/papilot" alt="Papilot 贡献者"></a>
100
+ ## 文档与社区
162
101
 
163
- ## 🔗 友情链接
102
+ - **文档:** 阅读[用户指南](docs/guide.md),了解工作区流程、配置、[应用内更新](docs/guide.md#updates)、[通过 Tailscale 远程访问](docs/guide.md#remote-access-with-tailscale)以及[面向协作者的通行密钥共享](docs/guide.md#collaborators)。
103
+ - **设计与历史:** 浏览 [`examples/papilot-paper`](examples/papilot-paper) 查看正式的设计论文与证明,并查阅[更新日志](CHANGELOG.md)了解版本说明。
104
+ - **社区与支持:** 在 [Discussions](https://github.com/PapilotAI/papilot/discussions) 中提问,在 [Issues](https://github.com/PapilotAI/papilot/issues) 中报告问题,或阅读 [CONTRIBUTING.md](CONTRIBUTING.md) 参与贡献。
164
105
 
165
- [LINUX DO](https://linux.do/) 是一个交流技术、分享开源项目的中文社区。Papilot 认同真诚、友善、团结、专业的社区理念,欢迎大家去发现有趣的项目、交流使用经验。
106
+ ---
166
107
 
167
- ## 📄 许可证
108
+ [MIT](LICENSE) © 2026 PapilotAI
168
109
 
169
- [MIT](LICENSE) © 2026 Cui Chen。内置的审阅引擎 [`vendor/latex-review`](vendor/latex-review) 同样采用 MIT 许可证。
110
+ 友情链接:[LINUX DO](https://linux.do/)。
@@ -0,0 +1,110 @@
1
+ <div align="center">
2
+
3
+ <h1>
4
+ <img src="docs/assets/wordmark.svg#gh-light-mode-only" width="280" height="88" alt="Papilot">
5
+ <img src="docs/assets/wordmark-dark.svg#gh-dark-mode-only" width="280" height="88" alt="Papilot">
6
+ </h1>
7
+
8
+ <p><b>使用 AI 修訂 LaTeX 論文,並在 PDF 上審閱變更。</b></p>
9
+
10
+ <p><a href="https://papilot.ai">網站</a> · <a href="docs/guide.md">說明文件</a></p>
11
+
12
+ <p data-language-switcher><a href="README.md">English</a> · <a href="README.zh-CN.md">简体中文</a> · <a href="README.zh-Hant.md">繁體中文</a> · <a href="README.ja.md">日本語</a> · <a href="README.ko.md">한국어</a> · <a href="README.de.md">Deutsch</a> · <a href="README.fr.md">Français</a> · <a href="README.es.md">Español</a> · <a href="README.pt.md">Português</a> · <a href="README.it.md">Italiano</a> · <a href="README.sv.md">Svenska</a></p>
13
+
14
+ [![CI](https://github.com/PapilotAI/papilot/actions/workflows/ci.yml/badge.svg)](https://github.com/PapilotAI/papilot/actions/workflows/ci.yml)
15
+ [![npm](https://img.shields.io/npm/v/papilot?color=2563eb&logo=npm)](https://www.npmjs.com/package/papilot)
16
+ [![License: MIT](https://img.shields.io/badge/license-MIT-2563eb)](LICENSE)
17
+
18
+ <p><img src="docs/assets/demo.gif" alt="Papilot:在 PDF 上標記段落、交由智慧代理處理,並審閱排版後的變更" width="100%"></p>
19
+
20
+ </div>
21
+
22
+ Papilot 是用於與 AI 智慧代理共同撰寫及修訂 LaTeX 論文的本機工作區。在 PDF 上標記段落與公式,讓智慧代理編輯獨立的原始碼副本,接著審閱排版後的變更並選擇要保留的修改。
23
+
24
+ <a id="features"></a>
25
+
26
+ ## 功能特色
27
+
28
+ <table>
29
+ <tr>
30
+ <td width="50%" valign="top">
31
+ <a href="docs/assets/readme-note.jpg"><img src="docs/assets/readme-note.jpg" alt="PDF 上依顏色分組的段落註解與框選的公式註解"></a>
32
+ <h3>在 PDF 上加上註解</h3>
33
+ 選取句子或框選公式,並說明需要修改的內容。依顏色將相關註解分組,即可對多個段落同時下達同一條指令。
34
+ </td>
35
+ <td width="50%" valign="top">
36
+ <a href="docs/assets/readme-review.jpg"><img src="docs/assets/readme-review.jpg" alt="頁面上的排版前後差異對比,附有接受、拒絕與評論按鈕"></a>
37
+ <h3>審閱每一項變更</h3>
38
+ 對比修改前後的排版頁面,包含公式重新編號等其他位置的連帶變更。您可以接受、拒絕或評論每一處修改,並在審閱過程中隨時復原決定。
39
+ </td>
40
+ </tr>
41
+ <tr>
42
+ <td width="50%" valign="top">
43
+ <a href="docs/assets/readme-deliver.jpg"><img src="docs/assets/readme-deliver.jpg" alt="將已接受的修改套用至論文原稿"></a>
44
+ <h3>選擇修改的套用位置</h3>
45
+ 每項新任務都會在獨立的論文副本上運作。審閱修改後,選擇 **提交至論文原稿** 將此任務儲存為目前分支上的一次提交,或選擇 **套用至工作區** 保留修改而不提交。若同一段落在這段期間也發生了變更,AI 會自動解決衝突,僅在目標內容不明確時向您詢問。儲存前可先審閱合併後的 PDF,準備就緒後即可從 Git 面板推送。
46
+ </td>
47
+ <td width="50%" valign="top">
48
+ <a href="docs/assets/readme-git.jpg"><img src="docs/assets/readme-git.jpg" alt="顯示已暫存檔案、自動產生的提交訊息與提交圖表的 Git 面板"></a>
49
+ <h3>搭配 Git 使用</h3>
50
+ 在工作區中暫存並提交檔案、拉取及推送變更。智慧代理可協助起草提交訊息並解決合併衝突;提交圖表則會顯示每項任務的工作樹。
51
+ </td>
52
+ </tr>
53
+ </table>
54
+
55
+ - **[技能](docs/guide.md#skills)與[附件](docs/guide.md#task-attachments):** 執行 `/` 技能以潤飾文句、校對或檢查數學公式,在「設定」中定義自訂技能,並將參考檔案或圖片附加至任務與訊息中。
56
+ - **閱讀與工作區:** 透過 PDF 目錄與全文搜尋瀏覽論文原稿,支援淺色與深色主題,以及英文或中文介面。
57
+
58
+ <a id="quick-start"></a>
59
+
60
+ ## 快速開始
61
+
62
+ 如需 macOS 與 Linux 桌面版應用程式以及本機建置說明,請參閱 [Papilot Desktop](desktop/README.md)。桌面版 CI 會建置 Apple Silicon 與 Intel Mac 安裝程式,以及 Linux x64 AppImage 與 deb 套件。
63
+
64
+ Papilot 需要 **Node.js 22.22+**、**Git**,以及包含 `latexmk` 與 `synctex` 的完整 **TeX** 發行版([MacTeX](https://www.tug.org/mactex/) 或 [TeX Live](https://www.tug.org/texlive/))。修訂論文還需要至少設定一個[智慧代理](#agents)。
65
+
66
+ ```sh
67
+ npm install -g papilot
68
+ papilot demo
69
+ ```
70
+
71
+ 開啟 [http://127.0.0.1:7274](http://127.0.0.1:7274) 並在側邊欄選取 **論文原稿**,即可瀏覽內建的範例論文。
72
+
73
+ 若要處理您自己的論文原稿,請執行 `papilot` 並選擇 **新增論文…** 以開啟本機 LaTeX 資料夾或 ZIP 壓縮檔。Papilot 會尋找主要的 `.tex` 檔案、在需要時準備 Git 歷史紀錄,並嘗試編譯。若主檔案不明確或建置失敗,匯入對話框會協助您選擇檔案或修正問題。
74
+
75
+ 可在 **設定 → 執行環境** 下的 **智慧代理** 或 **LaTeX** 中檢查您的環境設定。執行 `papilot doctor` 可進行環境檢查,或執行 `papilot doctor --repo /path/to/paper` 一併檢查論文原稿([診斷說明](docs/guide.md#diagnostics))。
76
+
77
+ <a id="agents"></a>
78
+
79
+ ## 智慧代理
80
+
81
+ <!-- BEGIN AGENT ICONS -->
82
+ <p align="center">
83
+ <a href="docs/guide.md#agents">
84
+ <picture>
85
+ <source media="(prefers-color-scheme: dark) and (max-width: 600px)" srcset="docs/assets/readme-agents/compact-dark.svg">
86
+ <source media="(prefers-color-scheme: dark)" srcset="docs/assets/readme-agents/desktop-dark.svg">
87
+ <source media="(max-width: 600px)" srcset="docs/assets/readme-agents/compact.svg">
88
+ <img src="docs/assets/readme-agents/desktop.svg" alt="Codex, Claude, Cursor, Copilot, Grok, Antigravity, Kimi, GLM, DeepSeek, Qwen, OpenCode" width="816">
89
+ </picture>
90
+ </a>
91
+ </p>
92
+ <!-- END AGENT ICONS -->
93
+
94
+ 您可以為每項任務選擇智慧代理與模型。根據整合方式的不同,Papilot 會使用智慧代理的本機 CLI 登入狀態或您提供的服務商 API 憑證來執行智慧代理,且不會儲存您的金鑰。
95
+
96
+ 開啟 **設定 → 執行環境 → 智慧代理** 以查看狀態、可用模型與設定說明(例如 `papilot codex login`)。若在 Papilot 執行期間安裝或登入智慧代理,請點擊 **重新連線**;若變更了環境變數,請重新啟動 `papilot`。各智慧代理的系統需求與功能請參閱[智慧代理指南](docs/guide.md#agents)。
97
+
98
+ <a id="documentation-and-community"></a>
99
+
100
+ ## 說明文件與社群
101
+
102
+ - **說明文件:** 閱讀[使用者指南](docs/guide.md),了解工作區工作流程、環境設定、[應用程式內更新](docs/guide.md#updates)、[透過 Tailscale 遠端存取](docs/guide.md#remote-access-with-tailscale),以及[與協作者分享通行金鑰](docs/guide.md#collaborators)。
103
+ - **設計與歷史紀錄:** 瀏覽 [`examples/papilot-paper`](examples/papilot-paper) 以查閱正式設計論文與證明,並查看[更新日誌](CHANGELOG.md)了解版本發行說明。
104
+ - **社群與支援:** 在 [Discussions](https://github.com/PapilotAI/papilot/discussions) 中提問、在 [Issues](https://github.com/PapilotAI/papilot/issues) 中回報錯誤,或閱讀 [CONTRIBUTING.md](CONTRIBUTING.md) 了解如何參與貢獻。
105
+
106
+ ---
107
+
108
+ [MIT](LICENSE) © 2026 PapilotAI
109
+
110
+ 友情連結:[LINUX DO](https://linux.do/)。
package/bin/doctor.mjs CHANGED
@@ -38,7 +38,7 @@ function executable(command, env = process.env) {
38
38
  function agentExecutable(command) {
39
39
  if (command.includes('/') || command.includes('\\')) return executable(command);
40
40
  const home = process.env.HOME || os.homedir();
41
- const dirs = ['.local/bin', '.claude/local', '.kimi-code/bin', '.opencode/bin', '.bun/bin', '.npm-global/bin'].map(dir => path.join(home, dir)).concat('/opt/homebrew/bin', '/usr/local/bin');
41
+ const dirs = ['.local/bin', '.claude/local', '.kimi-code/bin', '.grok/bin', '.opencode/bin', '.bun/bin', '.npm-global/bin'].map(dir => path.join(home, dir)).concat('/opt/homebrew/bin', '/usr/local/bin');
42
42
  return executable(command) || executable(command, { PATH: dirs.join(path.delimiter) });
43
43
  }
44
44
  function command(file, args, options = {}) {
@@ -178,15 +178,17 @@ export async function doctor(args) {
178
178
  return process.env[variable] ? `${variable} does not resolve to a runnable executable in Papilot's environment.`
179
179
  : `${command} was not found on the PATH or in the standard agent folders available to Papilot. It may be installed for a different user or shell.`;
180
180
  }
181
- async function acpCheck(id, name, bin, help, install, update) {
181
+ async function acpCheck(id, name, bin, help, install, update, supported = /\bACP\b|Agent Client Protocol/i) {
182
182
  const file = agentExecutable(process.env[bin.env] || bin.name);
183
183
  if (!file) { check(`agent.${id}`, false, 'info', missingAgent(bin.name, bin.env), `${install}. If already installed, correct ${bin.env} or the server PATH, then restart Papilot.`); return false; }
184
184
  const result = await command(file, help);
185
- const ready = result.ok && /\bACP\b|Agent Client Protocol/i.test(result.stdout + '\n' + result.stderr);
185
+ const ready = result.ok && supported.test(result.stdout + '\n' + result.stderr);
186
186
  check(`agent.${id}`, ready, 'warn', `${file}: ${ready ? 'ACP command available; login and generation were not tested' : result.reason || 'ACP command unavailable'}.`, `${update} Set ${bin.env} if needed.`);
187
187
  return ready;
188
188
  }
189
189
  const kimiCheck = () => acpCheck('kimi', 'Kimi CLI', { env: 'PAPILOT_KIMI_BIN', name: 'kimi' }, ['acp', '--help'], 'Install Kimi Code CLI and run kimi login', 'Update Kimi Code CLI and run kimi login.');
190
+ const copilotCheck = () => acpCheck('copilot', 'GitHub Copilot CLI', { env: 'PAPILOT_COPILOT_BIN', name: 'copilot' }, ['--help'], 'Install GitHub Copilot CLI with npm install -g @github/copilot and run copilot login', 'Update GitHub Copilot CLI and run copilot login.');
191
+ const grokCheck = () => acpCheck('grok', 'Grok Build CLI', { env: 'PAPILOT_GROK_BIN', name: 'grok' }, ['--no-auto-update', 'agent', '--no-leader', 'stdio', '--help'], 'Install Grok Build CLI from https://x.ai/cli and run grok login or configure XAI_API_KEY', 'Update Grok Build CLI and run grok login or configure XAI_API_KEY.', /Usage:\s+grok agent stdio\b/i);
190
192
  const qwenCheck = () => acpCheck('qwen', 'Qwen Code', { env: 'PAPILOT_QWEN_BIN', name: 'qwen' }, ['--help'], 'Install Qwen Code and sign in by running qwen once', 'Update Qwen Code and sign in by running qwen once.');
191
193
  const deepseekCheck = () => acpCheck('deepseek', 'DeepSeek Harness (dsh)', { env: 'PAPILOT_DSH_BIN', name: 'dsh' }, ['acp', '--help'], 'Install DeepSeek Harness with npm install -g @deepseek-ai/dsh and set up a model in dsh', 'Update DeepSeek Harness and set up a model in dsh.');
192
194
  const opencodeCheck = () => acpCheck('opencode', 'OpenCode', { env: 'PAPILOT_OPENCODE_BIN', name: 'opencode' }, ['acp', '--help'], 'Install OpenCode and connect a provider with opencode auth login', 'Update OpenCode and connect a provider with opencode auth login.');
@@ -203,7 +205,7 @@ export async function doctor(args) {
203
205
  check('agent.glm', Boolean(configured && sdk), configured ? 'warn' : 'info', !configured ? 'ZHIPU_API_KEY or ZAI_API_KEY is not set, so Papilot does not offer GLM.' : sdk ? `GLM key configured for ${process.env.ZHIPU_API_KEY ? 'open.bigmodel.cn' : 'api.z.ai'} (not validated).` : 'GLM key configured; the Claude Agent SDK that runs GLM is installed on first use.', !configured ? 'Start Papilot with ZHIPU_API_KEY (open.bigmodel.cn) or ZAI_API_KEY (api.z.ai) set to your GLM Coding Plan or API key.' : 'Start papilot and choose GLM once to install the Claude Agent SDK.');
204
206
  return configured;
205
207
  }
206
- const agents = await Promise.all([codexCheck(), claudeCheck(), cursorCheck(), agyCheck(), kimiCheck(), glmCheck(), deepseekCheck(), qwenCheck(), opencodeCheck()]);
208
+ const agents = await Promise.all([codexCheck(), claudeCheck(), cursorCheck(), copilotCheck(), grokCheck(), agyCheck(), kimiCheck(), glmCheck(), deepseekCheck(), qwenCheck(), opencodeCheck()]);
207
209
  check('agents', agents.some(Boolean), 'warn', agents.some(Boolean) ? 'At least one agent passed its configuration check; live editing was not tested.' : 'No agent passed its configuration check. PDF reading can still be used with a working TeX installation.', 'Configure one agent before starting editing tasks.');
208
210
 
209
211
  if (repo) {
@@ -279,7 +281,7 @@ export async function doctor(args) {
279
281
  }
280
282
  }
281
283
  // Keep reports stable even though independent probes finish in any order.
282
- const order = ['node', 'dependencies', 'frontend', 'review-engine', 'data', 'git', 'latexmk', 'synctex', 'tex-engines', 'agent.codex', 'agent.claude', 'agent.cursor', 'agent.antigravity', 'agent.kimi', 'agent.glm', 'agent.deepseek', 'agent.qwen', 'agent.opencode', 'agents', 'project', 'project.git', 'project.head', 'project.main', 'project.engine', 'project.worktrees', 'remote', 'server', 'service', 'service.tools', 'service.data'];
284
+ const order = ['node', 'dependencies', 'frontend', 'review-engine', 'data', 'git', 'latexmk', 'synctex', 'tex-engines', 'agent.codex', 'agent.claude', 'agent.cursor', 'agent.copilot', 'agent.grok', 'agent.antigravity', 'agent.kimi', 'agent.glm', 'agent.deepseek', 'agent.qwen', 'agent.opencode', 'agents', 'project', 'project.git', 'project.head', 'project.main', 'project.engine', 'project.worktrees', 'remote', 'server', 'service', 'service.tools', 'service.data'];
283
285
  checks.sort((a, b) => order.indexOf(a.id) - order.indexOf(b.id));
284
286
  const report = { name: 'Papilot', version: pkg.version, ok: !checks.some(item => !item.ok && item.severity === 'error'), checks };
285
287
  if (json) console.log(JSON.stringify(report, null, 2));
@@ -2398,7 +2398,7 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
2398
2398
  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
2399
2399
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
2400
2400
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
2401
- SOFTWARE.`},{name:`Icon sources`,text:`Agent icons: @lobehub/icons-static-svg 1.101.0 (MIT), https://github.com/lobehub/lobe-icons. GLM uses the ChatGLM mark.
2401
+ SOFTWARE.`},{name:`Icon sources`,text:`Agent icons: @lobehub/icons-static-svg 1.101.0 (MIT), https://github.com/lobehub/lobe-icons. GLM uses the ChatGLM mark; Copilot uses the GithubCopilot mark; Grok uses the Grok mark.
2402
2402
  Git and LaTeX icons: simple-icons 16.36.0 (CC0-1.0), https://github.com/simple-icons/simple-icons.
2403
2403
  Unmodified SVG artwork; rendered locally with CSS masks. Brand marks belong to their respective owners.`}]},{name:`longest-streak`,version:`3.1.0`,license:`MIT`,url:`https://www.npmjs.com/package/longest-streak/v/3.1.0`,notices:[{name:`license`,text:`(The MIT License)
2404
2404