paperlint 3.0.0 → 3.1.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.
Files changed (73) hide show
  1. package/README.md +179 -180
  2. package/dist/build-engine.d.ts.map +1 -1
  3. package/dist/build-engine.js +6 -2
  4. package/dist/build-engine.js.map +1 -1
  5. package/dist/build.d.ts.map +1 -1
  6. package/dist/build.js +22 -3
  7. package/dist/build.js.map +1 -1
  8. package/dist/cli.d.ts +66 -5
  9. package/dist/cli.d.ts.map +1 -1
  10. package/dist/cli.js +230 -30
  11. package/dist/cli.js.map +1 -1
  12. package/dist/engine.d.ts +9 -0
  13. package/dist/engine.d.ts.map +1 -1
  14. package/dist/engine.js +27 -0
  15. package/dist/engine.js.map +1 -1
  16. package/dist/init.js +1 -1
  17. package/dist/init.js.map +1 -1
  18. package/dist/new-paper.d.ts +8 -1
  19. package/dist/new-paper.d.ts.map +1 -1
  20. package/dist/new-paper.js +50 -15
  21. package/dist/new-paper.js.map +1 -1
  22. package/dist/paper-files.d.ts +30 -8
  23. package/dist/paper-files.d.ts.map +1 -1
  24. package/dist/paper-files.js +56 -29
  25. package/dist/paper-files.js.map +1 -1
  26. package/dist/structure.js +1 -1
  27. package/dist/structure.js.map +1 -1
  28. package/dist/toolchain.d.ts +5 -1
  29. package/dist/toolchain.d.ts.map +1 -1
  30. package/dist/toolchain.js +22 -5
  31. package/dist/toolchain.js.map +1 -1
  32. package/dist/types.d.ts +6 -0
  33. package/dist/types.d.ts.map +1 -1
  34. package/dist/venue-rules.js +1 -1
  35. package/dist/venue-rules.js.map +1 -1
  36. package/docs/configuration.md +48 -4
  37. package/docs/rules.md +29 -25
  38. package/docs/skills.md +80 -0
  39. package/eslint-rules/paper-typography.mjs +47 -7
  40. package/eslint-rules/paper-typography.test.mjs +40 -0
  41. package/eslint-rules/review-frontmatter.schema.json +1 -1
  42. package/fixtures/toolchain-mirror/catalog.txt +1 -0
  43. package/fixtures/toolchain-mirror/install-tl +4 -1
  44. package/fixtures/toolchain-mirror/stub-fmtutil-sys +4 -0
  45. package/fixtures/toolchain-mirror/stub-tlmgr +15 -0
  46. package/package.json +1 -1
  47. package/scripts/mutation-batteries.frozen.json +1 -1
  48. package/src/build-engine.ts +6 -1
  49. package/src/build.harness.mjs +46 -2
  50. package/src/build.ts +27 -5
  51. package/src/cli.harness.mjs +2 -2
  52. package/src/cli.ts +301 -32
  53. package/src/engine.harness.mjs +50 -0
  54. package/src/engine.ts +35 -0
  55. package/src/init.ts +1 -1
  56. package/src/linted-set.test.ts +118 -0
  57. package/src/new-paper.harness.mjs +2 -0
  58. package/src/new-paper.mutations.mjs +0 -14
  59. package/src/new-paper.test.ts +172 -1
  60. package/src/new-paper.ts +84 -17
  61. package/src/paper-files.test.ts +110 -5
  62. package/src/paper-files.ts +93 -37
  63. package/src/paper-settings-commands.test.ts +41 -5
  64. package/src/parse-args.test.ts +48 -0
  65. package/src/rules-off.test.ts +111 -0
  66. package/src/structure.harness.mjs +2 -2
  67. package/src/structure.ts +1 -1
  68. package/src/toolchain.harness.mjs +41 -6
  69. package/src/toolchain.ts +29 -5
  70. package/src/types.ts +6 -0
  71. package/src/venue-rules.test.ts +3 -0
  72. package/src/venue-rules.ts +1 -1
  73. package/templates/paper/paperlint.json +1 -1
package/README.md CHANGED
@@ -8,6 +8,8 @@ README style — keep it scannable, not a wall of text:
8
8
  - Mechanics and edge cases live in docs/, linked — not inline.
9
9
  - A reader must be able to answer "what is it, which venues, how do I start" from the first screen.
10
10
  - Sparse emoji are fine where they help rhythm and scanning (e.g. one per section heading or feature bullet); never decorative, never several in a row.
11
+ - One name per thing, everywhere (lint, build, venue preset, kind, skill, papersDir), each explained once, before it is used.
12
+ - Editing this file: re-read all of it first, and change it so it still reads as one document — the opening, the diagram, the order and the names your change touches. Remove or merge what it makes redundant. Never bolt on a section or patch one paragraph in isolation.
11
13
  -->
12
14
 
13
15
  # paperlint
@@ -15,81 +17,72 @@ README style — keep it scannable, not a wall of text:
15
17
  [![npm version](https://img.shields.io/npm/v/paperlint)](https://www.npmjs.com/package/paperlint)
16
18
  ![Node version](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fraw.githubusercontent.com%2Fzernie%2Fpaperlint%2Fmain%2Fpackage.json&query=%24.engines.node&label=node)
17
19
 
18
- **A linter for scientific papers written in LaTeX.** It catches the mechanical mistakes that get a
19
- paper desk-rejected or sent back at camera-ready, before you submit.
20
+ **Write a research paper in LaTeX from idea to camera-ready, and catch what gets it sent back
21
+ before you submit.** It comes in two parts:
20
22
 
21
- A LaTeX paper can build without an error and still be wrong: a missing font package silently
22
- changes the font, another template version changes the pagination, the submitted PDF gets
23
- overwritten. paperlint checks for these on your machine and in CI:
23
+ - ✅ **A linter** — a command-line tool, no AI needed. Its headline catches:
24
+ - 📏 a paper over the page limit for its kind at your venue;
25
+ - 🔤 the wrong font — LaTeX silently fell back to Computer Modern because a package was missing;
26
+ - 🔗 a bad reference — a cited work that does not exist, or lists the preprint's authors.
24
27
 
25
- - 📏 **Checks against your venue.** Page limit, embedded fonts, paper size, columns and font sizes,
26
- as the call for papers sets them.
27
- - 🧱 **Builds the same PDF everywhere.** `paperlint toolchain` installs TeX Live with exactly the
28
- packages your venue's template needs.
29
- - 📌 **Keeps what you submitted.** Record the PDF you sent, and paperlint fails if it changes or
30
- disappears, or its LaTeX source was not kept.
31
- - 🔗 **Checks your references online.** At build time: each cited work exists, and its author list
32
- is the published version's.
33
- - ✏️ **Knows the classic slips.** `§` instead of "Section", `.05` instead of `0.05`.
34
- `paperlint lint --fix` fixes them.
28
+ Smaller slips too: `§` for "Section", `.05` for `0.05` — fixed for you.
35
29
 
36
- It is built on ESLint: the checks are ESLint rules over `.tex` and `.md` files, named like
37
- `paper/leading-zero`. You do not need to know ESLint to use it.
30
+ - 🧠 **Skills for [Claude Code](https://claude.com/claude-code)** — optional, 24 of them, covering the
31
+ whole pipeline: the idea, the venue, the study, the draft, the reviews, submission.
38
32
 
39
33
  ## Contents
40
34
 
35
+ - [The pipeline](#-the-pipeline)
41
36
  - [Supported venues](#-supported-venues)
42
- - [Skills](#-skills)
43
37
  - [Getting started](#-getting-started)
38
+ - [A new paper](#a-new-paper)
39
+ - [A paper you already have](#a-paper-you-already-have)
44
40
  - [Commands](#-commands)
41
+ - [Skills](#-skills)
42
+ - [Lint and build](#-lint-and-build)
45
43
  - [Configuration](#-configuration)
44
+ - [Add a venue that isn't listed](#-add-a-venue-that-isnt-listed)
46
45
  - [Run it in CI](#-run-it-in-ci)
47
46
  - [FAQ](#-faq)
48
47
  - [Docs](#-docs)
49
48
 
50
- ## 🎯 Supported venues
51
-
52
- A preset holds a venue's format and page limits. Its **kind** is the paper type the venue sets a
53
- limit for — `short`, `full`, `research` — named once per paper in its `paperlint.json`.
49
+ ## 🧭 The pipeline
50
+
51
+ ```text
52
+ stage what you get skills linter
53
+ 1 idea a go / no-go, with the reason yes
54
+ 2 venue venues ranked, deadlines planned yes
55
+ 3 study a study design, honest statistics yes
56
+ 4 draft a first draft, then a tighter one yes lint
57
+ 5 review the objections, before the reviewers yes lint
58
+ 6 submit a PDF within the limit, recorded yes build, lint
59
+ 7 camera-ready the final, de-anonymised PDF yes build, lint
60
+ 8 extend a plan for the next paper yes
61
+
62
+ skills: optional, with Claude Code
63
+ lint: every edit and every CI run, once the paper exists (paperlint new)
64
+ build: compiles and measures the PDF; lint then checks pages, fonts, references
65
+ ```
54
66
 
55
- | preset | venue | format | page limit |
56
- | ----------------------- | ------------------ | -------------------------------- | -------------------------------------------------------------- |
57
- | `paperlint:acm-sigconf` | any ACM conference | ACM two-column conference format | not checked: the family sets no kinds |
58
- | `paperlint:agenticdev` | AgenticDev @ ASE | ACM two-column conference format | `short` 5, `full` 10, `demo` 5 body pages, + 2 of references |
59
- | `paperlint:aisec` | AISec @ ACM CCS | ACM two-column conference format | 10 body pages + 2 (`research`, `benchmark`, `position`, `sok`) |
60
- | `paperlint:realm` | REALM @ EMNLP | ACL two-column format, A4 | `long` 8, `short` 4 — recorded, not checked (below) |
67
+ ## 🎯 Supported venues
61
68
 
62
- REALM's limit is recorded but not checked because ACL leaves the Limitations and Ethics sections
63
- out of the page count, and the PDF measurement counts them as body pages: a paper within the limit
64
- would fail.
69
+ A **venue preset** holds a venue's format and page limits. A paper's **kind** picks which limit
70
+ applies: at AgenticDev a `short` paper gets 5 pages and a `full` one 10. You choose it once per paper.
65
71
 
66
- Another venue: [a four-line preset file](#another-venue).
72
+ | preset | venue | format | kinds and page limits |
73
+ | ----------------------- | ------------------ | ------------------ | ------------------------------------------------------------------------------------------- |
74
+ | `paperlint:acm-sigconf` | any ACM conference | ACM two-column | no kinds: the format only, no page limit |
75
+ | `paperlint:agenticdev` | AgenticDev @ ASE | ACM two-column | `short` 5, `full` 10, `demo` 5 pages, + 2 pages of references |
76
+ | `paperlint:aisec` | AISec @ ACM CCS | ACM two-column | `research`, `benchmark`, `position`, `sok`: 10 pages + 2 pages of references |
77
+ | `paperlint:realm` | REALM @ EMNLP | ACL two-column, A4 | `long` 8, `short` 4 — recorded, not checked ([why](docs/rules.md#checks-against-the-venue)) |
67
78
 
68
- ## 🧠 Skills
69
-
70
- paperlint has two halves:
71
-
72
- 1. **The linter** — `lint` and `build` — is deterministic: the same paper gives the same verdict,
73
- so it belongs in CI.
74
- 2. **The skills** help with the work itself, where the answer is a judgment call. They are
75
- optional; `paperlint init` installs them for [Claude Code](https://claude.com/claude-code).
76
-
77
- - **Start here** — run the whole process step by step (`paper-pipeline`), or ask where the paper
78
- stands (`paper-status`).
79
- - **Judge the idea** — is it worth doing (`research-ideate`), who else works on it
80
- (`map-prior-work`), read a close competitor in depth (`analyze-sibling-paper`).
81
- - **Pick a venue** — find where to send it (`find-venue`), see what gets accepted there
82
- (`study-accepted-papers`), put the deadlines in your calendar (`plan-paper-timeline`).
83
- - **Do the study and write** — design the study and its artifact (`build-benchmark`), write the
84
- draft (`draft-paper`), fix the outline (`argument-arc`), cut it down (`tighten-paper`).
85
- - **Review before you submit** — a reader with no context (`cold-read-diff`), the prose
86
- (`grade-paper-writing`), a hostile reviewer (`paper-adversarial-review`), a simulated committee
87
- (`pc-panel-review`), the references (`verify-citations`), the final check (`harden-paper`).
88
- - **Submit and after** — render pages to images (`render-paper`), submit (`submit-paper`), upload
89
- the artifact (`osf-artifact-upload`), camera-ready (`camera-ready`), the next paper (`extend-paper`).
79
+ Not shipped yet: IEEE, USENIX, NeurIPS, Springer, and ACL venues other than REALM.
80
+ [Add yours](#-add-a-venue-that-isnt-listed) in one small file.
90
81
 
91
82
  ## 🚀 Getting started
92
83
 
84
+ ### A new paper
85
+
93
86
  <!-- `vigiles:symbol src/init.ts#init` — `npm run check` fails if this function is renamed or removed. -->
94
87
 
95
88
  1. Install (Node 22.13 or newer):
@@ -98,112 +91,107 @@ paperlint has two halves:
98
91
  npm i -D paperlint
99
92
  ```
100
93
 
101
- 2. Set up — it finds your papers directory, offers a CI workflow and a first paper, and (with
102
- Claude Code) links the skills:
94
+ 2. Set up. `init` asks three questions: where your papers live (default `papers/`), whether to
95
+ install TeX Live now, and whether to add a CI workflow. With Claude Code it also installs the
96
+ skills and three hooks ([what they do](docs/install.md)).
103
97
 
104
98
  ```sh
105
99
  npx paperlint init
106
100
  ```
107
101
 
108
- 3. TeX Live, for building — once. `init` offers it; `paperlint lint` alone needs no TeX:
109
-
110
- ```sh
111
- npx paperlint toolchain # ~270 MB, ~3 min, once
112
- ```
113
-
114
- 4. Create a paper:
102
+ 3. Create a paper. `--venue` names its venue preset from the table above, `--kind` which of its page
103
+ limits applies:
115
104
 
116
105
  <!-- `vigiles:symbol src/new-paper.ts#newPaper` — `npm run check` fails if this function is renamed or removed. -->
117
106
 
118
107
  ```sh
119
- npx paperlint new my-paper
108
+ npx paperlint new my-paper --venue agenticdev --kind short
120
109
  ```
121
110
 
122
- ```
123
- ✓ created papers/my-paper
124
- + PIPELINE-STATUS.md (from the package template)
125
- + paper.tex (from the package template)
126
- + paperlint.json (from the package template)
127
- ```
128
-
129
- 5. Pick the venue ([the table above](#-supported-venues)) in `papers/my-paper/paperlint.json`:
111
+ It writes `papers/my-paper/` (in the folder you gave `init`) with three files:
112
+ - `paper.tex` — your paper;
113
+ - `paperlint.json` — its venue preset and kind;
114
+ - `PIPELINE-STATUS.md` — which stage the paper is at; the skills read and update it.
130
115
 
131
- ```json
132
- { "extends": "paperlint:agenticdev", "kind": "short" }
133
- ```
134
-
135
- 6. Build the PDF:
116
+ 4. Build the PDF. **This needs TeX Live, a ~270 MB download (~3 min, once).** If you said no in
117
+ `init`, run `npx paperlint toolchain` first.
136
118
 
137
119
  ```sh
138
120
  npx paperlint build papers/my-paper
139
121
  ```
140
122
 
141
- 7. Check every paper:
123
+ 5. Check it:
142
124
 
143
125
  ```sh
144
126
  npx paperlint lint
145
127
  ```
146
128
 
147
- Sample output, on a paper with two slips and no `PIPELINE-STATUS.md`:
129
+ On the stub from step 3 the first run already catches something (output shortened):
148
130
 
149
- ```
150
- papers/hand
151
- error missing `PIPELINE-STATUS.md` — `paper/stages`, `paper/source` and `paper/research-question` read this file, so nothing `hand` declares about its stages, sources or research question is checked
152
- …/papers/hand/paper.tex
153
- 3:4 warning `§` instead of the word «Section» — `paperlint lint --fix` writes it paper/section-word
154
- 3:19 warning `.05` has no leading zero — write `0.05` (IEEE / ISO 80000-1); `paperlint lint --fix` inserts it paper/leading-zero
155
-
156
- ✖ 2 problems (0 errors, 2 warnings)
157
- 0 errors and 2 warnings potentially fixable with the `--fix` option.
131
+ ```text
132
+ papers/my-paper/paper.tex
133
+ 1:1 error 1 column(s), agenticdev requires 2 — the wrong document class or class option pdf/geometry
134
+ 1:1 error no font starts with `LinLibertine` (body text of agenticdev); the PDF has: CMR10, … pdf/fonts
135
+ 8:4 warning `§` instead of the word «Section» — `paperlint lint --fix` writes it paper/section-word
158
136
  ```
159
137
 
160
- Errors fail the run (exit 1); warnings only print, unless you pass `--max-warnings <n>`. To keep
161
- a deliberate exception, put the reason on the line above:
162
- `% eslint-disable-next-line paper/leading-zero -- quoted from the reviewer`.
138
+ `new` writes a format-neutral stub in plain `article`, and AgenticDev wants ACM's class. Make
139
+ the first line `\documentclass[sigconf]{acmart}`, build again, and the errors are gone.
163
140
 
164
- ### 📌 When you submit
141
+ ### A paper you already have
165
142
 
166
- Copy the PDF and `paper.tex` into `versions/`, and record the stage in the front matter of
167
- `PIPELINE-STATUS.md`. You write the sizes yourself (`wc -c < file`):
143
+ paperlint finds a paper by its folder: `<papersDir>/<name>/`, with the main file named `paper.tex`.
168
144
 
169
- ```yaml
170
- stages:
171
- - stage: submitted
172
- date: 2026-07-22
173
- pdf: versions/2026-07-22-submitted.pdf
174
- bytes: 305412
175
- source: versions/2026-07-22-submitted.tex
176
- sourceBytes: 57210
177
- ```
178
-
179
- From then on `paperlint lint` fails if that PDF goes missing or changes size
180
- ([`docs/rules.md`](docs/rules.md#the-scorecards-bytes-and-sourcebytes)).
145
+ 1. Put the paper there — for example `papers/my-paper/paper.tex`, the rest of its files beside it. If
146
+ your paper folders already live elsewhere, say `thesis/`, [set `papersDir`](#-configuration) instead.
147
+ 2. Run `npx paperlint new my-paper --venue <preset> --kind <kind>`. On an existing folder it only
148
+ adds the missing `paperlint.json` and `PIPELINE-STATUS.md`; it never touches `paper.tex`.
149
+ 3. Build and lint, as above.
181
150
 
182
151
  ## 🧰 Commands
183
152
 
184
- | command | what it does |
185
- | ----------------------------- | ------------------------------------------------------------------------------ |
186
- | `npx paperlint init` | sets the project up |
187
- | `npx paperlint new my-paper` | creates a paper folder from a template; never overwrites a file |
188
- | `npx paperlint lint` | runs every check over your papers; `--fix` fixes what can be fixed |
189
- | `npx paperlint build <paper>` | compiles `paper.tex` to `paper.pdf`, measures it, checks the references online |
190
- | `npx paperlint toolchain` | installs TeX Live with the packages your venues need (~270 MB, ~3 min, once) |
191
- | `npx paperlint doctor` | checks the setup and exits non-zero if something is miswired |
192
- | `npx paperlint --help` | every command and flag |
193
-
194
- ### 🔍 What the checks catch
195
-
196
- | check | catches |
197
- | --------------------- | ---------------------------------------------------------------------- |
198
- | `pdf/fonts` | the template's fonts are missing — LaTeX silently used Computer Modern |
199
- | `pdf/limits` | more pages than the venue allows for your kind of paper |
200
- | `paper/stages` | the PDF you recorded as submitted changed or disappeared |
201
- | `paper/source` | the LaTeX source of a submitted version was not kept |
202
- | `bib/reachable-entry` | a reference with no DOI, URL or arXiv id |
203
- | `paper/author-list` | a reference lists the preprint's authors, not the published version's |
204
-
205
- Every check: [`docs/rules.md`](docs/rules.md). Checks only some venues need are off until you
206
- turn them on: [`docs/optional-rules.md`](docs/optional-rules.md).
153
+ | command | what it does |
154
+ | ----------------------------------------------------------- | ------------------------------------------------------------------------------ |
155
+ | `npx paperlint init` | sets the project up |
156
+ | `npx paperlint new my-paper --venue <preset> --kind <kind>` | creates a paper folder for that venue, or completes an existing one |
157
+ | `npx paperlint build <paper>` | compiles `paper.tex` to `paper.pdf`, measures it, checks the references online |
158
+ | `npx paperlint lint` | runs every check over your papers; `--fix` fixes what can be fixed |
159
+ | `npx paperlint toolchain` | installs TeX Live with the packages your venues need (~270 MB, ~3 min, once) |
160
+ | `npx paperlint doctor` | checks the setup and exits non-zero if something is miswired |
161
+ | `npx paperlint --help` | every command and flag |
162
+
163
+ ## 🧠 Skills
164
+
165
+ You do not need to learn the skills' names: you ask Claude Code, and the matching skill starts.
166
+ `paper-pipeline` walks you through the stages; any skill also starts on its own when you ask for
167
+ what it does — "is this idea worth a paper?", "find me a venue for this". `init` installs them.
168
+
169
+ - **A go / no-go on your idea, with the reason.** `research-ideate`
170
+ - **A ranked list of venues that fit** — deadline, page limit, indexing. `find-venue`
171
+ - **A first draft from your results.** `draft-paper`
172
+ - **A hostile review before the real one.** `paper-adversarial-review`
173
+ - **A ready / not ready verdict before you submit**, worst problem first. `harden-paper`
174
+ - **Where your paper stands**, measured from the real build. `paper-status`
175
+
176
+ All 24, by stage: [`docs/skills.md`](docs/skills.md).
177
+
178
+ ## 🔍 Lint and build
179
+
180
+ | | `paperlint build` | `paperlint lint` |
181
+ | ------ | -------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- |
182
+ | needs | Node, TeX Live, the network | Node |
183
+ | does | compiles `paper.tex`, measures the PDF, checks each reference online (exists, right authors) | checks the source, and judges what build recorded: page limit, fonts, the reference results — offline |
184
+ | writes | `paper.pdf`, and in `_build/` the measurements and the reference results | nothing (`--fix`: the three fixable slips) |
185
+
186
+ - If `paper.pdf` or the bibliography changed since the last build, lint fails and tells you to rebuild.
187
+ - Lint also checks the pipeline's own records: `PIPELINE-STATUS.md`, reviews, notes on related
188
+ papers ([`docs/rules.md`](docs/rules.md)).
189
+ - The rules run on ESLint, so a deliberate exception is a comment on the line above:
190
+ `% eslint-disable-next-line paper/leading-zero -- quoted from the reviewer`.
191
+ - Errors fail the run; warnings only print, unless you pass `--max-warnings <n>`.
192
+
193
+ Every check: [`docs/rules.md`](docs/rules.md). How build compiles:
194
+ [`docs/configuration.md`](docs/configuration.md#how-paperlint-build-compiles-a-paper).
207
195
 
208
196
  ## 🧩 Configuration
209
197
 
@@ -211,81 +199,91 @@ Two levels, one file name, both optional:
211
199
 
212
200
  ```
213
201
  paperlint.json the project: papersDir, rules, defaults for every paper
214
- papers/my-paper/paperlint.json one paper: its venue, its kind, its own rules
202
+ papers/my-paper/paperlint.json one paper: its venue preset ("extends"), its kind, its own rules
215
203
  ```
216
204
 
217
- `papersDir` defaults to `papers`. If your papers live elsewhere, say so in a `paperlint.json`
218
- beside your `package.json`:
205
+ - `papersDir` is the folder that holds your paper folders; it defaults to `papers`.
206
+ - The paper's venue preset is its `"extends"` key — the one `new --venue` writes.
207
+ - A paper's `paperlint.json` overrides the project's, key by key.
208
+ - **An unknown key is an error**, so a typo cannot silently turn a setting off.
219
209
 
220
- ```json
221
- { "papersDir": "docs/papers" }
222
- ```
223
-
224
- - A paper's file merges over the root's: its `extends` and `kind` win, its `rules` apply last.
225
- - Only the paper files under `papersDir` are linted, never a `repro/` script beside a paper.
226
- - An unknown key is an error, so a typo cannot silently turn a setting off.
227
-
228
- Every key: [`docs/configuration.md`](docs/configuration.md).
210
+ Every key: [`docs/configuration.md`](docs/configuration.md). Already use ESLint for other files? See
211
+ [`docs/configuration.md`](docs/configuration.md#using-the-rules-from-an-existing-eslint-config).
229
212
 
230
- ### Another venue
213
+ ### ➕ Add a venue that isn't listed
231
214
 
232
- Write a preset in your repository, and extend it by path from the paper's `paperlint.json`
233
- (`"extends": "../../venues/my-venue.jsonc"`):
215
+ A venue preset is a small JSONC file: the preset it builds on, and the page limit of each kind of
216
+ paper. For an ACM workshop with a 4-page limit for short papers, `venues/my-workshop.jsonc`:
234
217
 
235
218
  ```jsonc
236
219
  {
220
+ // page size, columns and fonts of the ACM two-column format
237
221
  "extends": "paperlint:acm-sigconf",
238
- "format": { "kinds": { "short": { "body_pages_max": 4 } } },
222
+ "format": {
223
+ // one entry per kind of paper the call for papers names
224
+ "kinds": {
225
+ // the limit from the call for papers, in pages, references not counted
226
+ "short": { "body_pages_max": 4 },
227
+ },
228
+ },
239
229
  }
240
230
  ```
241
231
 
242
- The full shape: [`docs/rules.md`](docs/rules.md#writing-your-own-venue-preset).
232
+ ```sh
233
+ npx paperlint new my-paper --venue ./venues/my-workshop.jsonc --kind short
234
+ ```
235
+
236
+ Give the path from where you run the command; `new` rewrites it relative to the paper's own
237
+ `paperlint.json`. A venue in another format: [`docs/rules.md`](docs/rules.md#writing-your-own-venue-preset).
243
238
 
244
239
  ## 🤖 Run it in CI
245
240
 
246
- `paperlint init` offers to write this workflow for you, pinned to the version you installed. By
247
- hand:
241
+ Two options:
242
+
243
+ | job | time | checks |
244
+ | -------------------------- | ----------------------------- | ------------------------------------------ |
245
+ | build, then lint | ~3 min first run, then cached | everything |
246
+ | lint only (`init` adds it) | seconds | the source; not pages, fonts or references |
247
+
248
+ Lint judges pages, fonts and references from what build measured, so the full job builds first:
249
+
250
+ ```yaml
251
+ name: papers
252
+ on: [push, pull_request]
253
+ jobs:
254
+ papers:
255
+ runs-on: ubuntu-latest
256
+ steps:
257
+ - uses: actions/checkout@v4
258
+ - uses: actions/setup-node@v4
259
+ with:
260
+ node-version: 22
261
+ - run: npm ci
262
+ - uses: actions/cache@v4
263
+ with:
264
+ path: ~/.cache/paperlint/texlive
265
+ key: texlive-${{ runner.os }}-${{ hashFiles('package-lock.json') }}
266
+ - run: npx paperlint toolchain
267
+ - run: npx paperlint build --all
268
+ - run: npx paperlint lint
269
+ ```
270
+
271
+ Lint only — each paper then gets one warning that it was not built:
248
272
 
249
273
  ```yaml
250
274
  - uses: zernie/paperlint@v3.0.0
251
275
  with:
252
- paths: papers
276
+ paths: papers # your papersDir
253
277
  ```
254
278
 
255
- - Pin the tag of the version you installed: `npm ls paperlint` prints it.
256
- - The step runs `paperlint lint`. It does not build, so CI needs no TeX Live.
257
-
258
279
  ## ❓ FAQ
259
280
 
260
281
  **Does it install anything without asking?**
261
282
  No. TeX Live comes only from `paperlint toolchain`, or when you say yes in `init` or `build`. On
262
283
  Windows, install TeX Live yourself.
263
284
 
264
- **Will `new` or `init` overwrite my files?**
265
- No. They only add what is missing, and `init` keeps a `papersDir` you already declared.
266
-
267
- **My venue isn't listed — what now?**
268
- Write [a four-line preset](#another-venue) that extends the closest template family. For any ACM
269
- venue, `paperlint:acm-sigconf` already checks the format, without a page limit.
270
-
271
- **Do I need TeX Live just to lint?**
272
- No. `paperlint lint` needs only Node. `paperlint build` needs TeX Live.
273
-
274
- **What does a CI failure look like?**
275
- The step fails, and its log lists each finding with file, line, check and message. It also fails
276
- when it checked zero files, so a wrong `paths` shows up red.
277
-
278
285
  **Several papers for different venues in one repo?**
279
- Yes. Each paper names its own venue in its own `paperlint.json`.
280
-
281
- **Where does my configuration live?**
282
- In `paperlint.json` — at the project root (optional) and in each paper. Nothing goes into
283
- `package.json`.
284
-
285
- **Do I need Claude Code?**
286
- No. The linter needs only Node. With Claude Code, `init` also links the skills and wires three
287
- hooks into `.claude/settings.json`: one stops a shell command from writing to a paper file, two
288
- remind the agent what is left after a paper edit ([`docs/install.md`](docs/install.md)).
286
+ Yes. Each paper names its own venue preset in its own `paperlint.json`.
289
287
 
290
288
  **Does it change my paper?**
291
289
  Only `paperlint lint --fix`, and only three rules: `paper/section-word` (`§` → Section),
@@ -293,12 +291,13 @@ Only `paperlint lint --fix`, and only three rules: `paper/section-word` (`§`
293
291
 
294
292
  ## 📚 Docs
295
293
 
296
- - [`docs/install.md`](docs/install.md) — what `init` does, package managers, troubleshooting
297
- - [`docs/configuration.md`](docs/configuration.md) — every setting, and how `build` compiles
298
- - [`docs/rules.md`](docs/rules.md) — every check, what it reads and when it fails
294
+ - [`docs/skills.md`](docs/skills.md) — every skill, by stage
295
+ - [`docs/install.md`](docs/install.md) — what `init` does, the hooks, package managers, troubleshooting
296
+ - [`docs/configuration.md`](docs/configuration.md) — every setting, how `build` compiles, using your own ESLint
297
+ - [`docs/rules.md`](docs/rules.md) — every check, venue presets, recording a submitted PDF
299
298
  - [`docs/optional-rules.md`](docs/optional-rules.md) — checks only some venues need
300
299
  - [`docs/toolchain.md`](docs/toolchain.md) — TeX Live, and Banal (HotCRP's page-geometry checker, GPL)
301
- - [`CONTRIBUTING.md`](CONTRIBUTING.md) — how the package is tested and released
300
+ - [`CONTRIBUTING.md`](CONTRIBUTING.md) — how the package is tested and released, and adding a venue to it
302
301
 
303
302
  ## License
304
303
 
@@ -1 +1 @@
1
- {"version":3,"file":"build-engine.d.ts","sourceRoot":"","sources":["../src/build-engine.ts"],"names":[],"mappings":"AAaA,OAAO,EAKL,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,MAAM,EAEZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAML,KAAK,aAAa,EACnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,WAAW,aAAa;IAC5B,2EAA2E;IAC3E,QAAQ,CAAC,GAAG,EAAE,eAAe,CAAC;IAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACjC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IACpC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IAC5B,yFAAyF;IACzF,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,aAAa,CAAC;CACxC;AAED,MAAM,MAAM,aAAa,GACrB;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAA;CAAE,GACtD;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAElD,KAAK,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC,GAAG;IACzD,OAAO,EAAE,MAAM,aAAa,CAAC;CAC9B,CAAC;AAmCF;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,QAAQ,GAAG,WAAW,CAwBpD;AAKD,yFAAyF;AACzF,wBAAgB,OAAO,CAAC,CAAC,EAAE,cAAc,EAAE,KAAK,EAAE,WAAW,GAAG,MAAM,CASrE;AAED,mDAAmD;AACnD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAIjE;AAED,oGAAoG;AACpG,eAAO,MAAM,KAAK,GAAI,QAAQ,MAAM,GAAG,IAAI,KAAG,OAC6B,CAAC;AAkD5E;;;GAGG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,aAAa,CAAC,CAoBxB"}
1
+ {"version":3,"file":"build-engine.d.ts","sourceRoot":"","sources":["../src/build-engine.ts"],"names":[],"mappings":"AAaA,OAAO,EAML,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,MAAM,EAEZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAML,KAAK,aAAa,EACnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,WAAW,aAAa;IAC5B,2EAA2E;IAC3E,QAAQ,CAAC,GAAG,EAAE,eAAe,CAAC;IAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACjC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IACpC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IAC5B,yFAAyF;IACzF,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,aAAa,CAAC;CACxC;AAED,MAAM,MAAM,aAAa,GACrB;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAA;CAAE,GACtD;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAElD,KAAK,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC,GAAG;IACzD,OAAO,EAAE,MAAM,aAAa,CAAC;CAC9B,CAAC;AAmCF;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,QAAQ,GAAG,WAAW,CA4BpD;AAKD,yFAAyF;AACzF,wBAAgB,OAAO,CAAC,CAAC,EAAE,cAAc,EAAE,KAAK,EAAE,WAAW,GAAG,MAAM,CASrE;AAED,mDAAmD;AACnD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAIjE;AAED,oGAAoG;AACpG,eAAO,MAAM,KAAK,GAAI,QAAQ,MAAM,GAAG,IAAI,KAAG,OAC6B,CAAC;AAkD5E;;;GAGG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,aAAa,CAAC,CAoBxB"}
@@ -11,7 +11,7 @@ import { spawnSync } from "node:child_process";
11
11
  // eslint-disable-next-line boundaries/dependencies -- legacy I/O, moves behind a port in #76
12
12
  import { homedir } from "node:os";
13
13
  import { delimiter, join } from "node:path";
14
- import { resolveEngine, probeTree, supportedPlatform, whichOnPath, } from "./engine.js";
14
+ import { resolveEngine, missingDependencies, probeTree, supportedPlatform, whichOnPath, } from "./engine.js";
15
15
  import { UNSUPPORTED, cacheRoot, cachedTrees, ensureTexLive, usableTree, } from "./toolchain.js";
16
16
  import { declaredUnion, mergeRequirements, } from "./tex-requirements.js";
17
17
  /** The options a caller actually set — `undefined` must still get its default, so no plain spread. */
@@ -50,7 +50,11 @@ export function gatherFacts(o) {
50
50
  const probes = cachedTrees(cacheRoot(o.env, o.home)).map((tree) => ({
51
51
  label: `TeX Live ${tree.year} — paperlint cache (${tree.dir})`,
52
52
  bin: tree.bin,
53
- missing: probeTree(tree.bin, o.tex.packages, o.run),
53
+ // Only a cache tree is asked for its dependencies: its tlmgr writes where we own.
54
+ missing: [
55
+ ...probeTree(tree.bin, o.tex.packages, o.run),
56
+ ...missingDependencies(tree.bin, o.run),
57
+ ],
54
58
  }));
55
59
  const cache = usableTree(probes, (p) => p.missing.length === 0);
56
60
  const dir = whichOnPath("pdflatex", o.env["PATH"]);
@@ -1 +1 @@
1
- {"version":3,"file":"build-engine.js","sourceRoot":"","sources":["../src/build-engine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"build-engine.js","sourceRoot":"","sources":["../src/build-engine.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"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"}
package/dist/build.js CHANGED
@@ -224,7 +224,8 @@ function latexPass(ctx, final, opts) {
224
224
  if (r.error)
225
225
  return null;
226
226
  const exitCode = r.status ?? 1;
227
- const log = unwrapLog(readOr(join(ctx.paperDir, `${JOB}.log`), "latin1") ?? "");
227
+ const written = readOr(join(ctx.paperDir, `${JOB}.log`), "latin1");
228
+ const log = unwrapLog(written ?? "");
228
229
  return {
229
230
  step: "latex",
230
231
  final,
@@ -233,9 +234,24 @@ function latexPass(ctx, final, opts) {
233
234
  after: hashes(ctx.paperDir),
234
235
  markers: logMarkers(log),
235
236
  bib: bibInput(ctx.paperDir),
236
- errorLines: exitCode === 0 ? [] : errorExcerpt(log).map(fromLatin1),
237
+ errorLines: exitCode === 0
238
+ ? []
239
+ : written === null
240
+ ? printed(r)
241
+ : errorExcerpt(log).map(fromLatin1),
237
242
  };
238
243
  }
244
+ /**
245
+ * The last lines pdflatex printed, for the run that wrote no log — it died before opening one (a
246
+ * format it cannot load, a missing TeX Live file). Marked by NO_LOG, which the report keys on.
247
+ */
248
+ function printed(r) {
249
+ const lines = fromLatin1(`${String(r.stdout ?? "")}\n${String(r.stderr ?? "")}`)
250
+ .split("\n")
251
+ .filter((l) => l.trim());
252
+ return [NO_LOG, ...lines.slice(-8).map((l) => ` ${l}`)];
253
+ }
254
+ const NO_LOG = `pdflatex wrote no ${JOB}.log — the last lines it printed:`;
239
255
  /** One bibtex run, on the input the `.aux` names BEFORE it runs, or null when it could not start. */
240
256
  function bibtexPass(ctx, opts) {
241
257
  const before = hashes(ctx.paperDir);
@@ -257,6 +273,9 @@ function bibtexPass(ctx, opts) {
257
273
  export function compile(ctx) {
258
274
  const history = [];
259
275
  const opts = spawnOptions(ctx);
276
+ // Every log this loop reads is one its own pdflatex wrote. A pdflatex that dies before opening
277
+ // paper.log would otherwise have an earlier build's error quoted as this one's.
278
+ rmSync(join(ctx.paperDir, `${JOB}.log`), { force: true });
260
279
  const runs = { latex: 0, bibtex: 0 };
261
280
  for (;;) {
262
281
  const step = nextStep(summarize(history));
@@ -304,7 +323,7 @@ export const compileStep = {
304
323
  ...(end.lines.length
305
324
  ? end.lines
306
325
  : ["(no error line found in the log)"]),
307
- `full log: ${log}`,
326
+ ...(end.lines[0] === NO_LOG ? [] : [`full log: ${log}`]),
308
327
  ],
309
328
  };
310
329
  }