paperlint 2.1.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 (219) hide show
  1. package/CLAUDE.md +6 -1
  2. package/README.md +243 -235
  3. package/action.yml +4 -6
  4. package/dist/adapters/references/index.d.ts +13 -0
  5. package/dist/adapters/references/index.d.ts.map +1 -0
  6. package/dist/adapters/references/index.js +55 -0
  7. package/dist/adapters/references/index.js.map +1 -0
  8. package/dist/adapters/references/reach.io.d.ts +3 -0
  9. package/dist/adapters/references/reach.io.d.ts.map +1 -0
  10. package/dist/adapters/references/reach.io.js +14 -0
  11. package/dist/adapters/references/reach.io.js.map +1 -0
  12. package/dist/build-engine.d.ts.map +1 -1
  13. package/dist/build-engine.js +6 -2
  14. package/dist/build-engine.js.map +1 -1
  15. package/dist/build.d.ts +15 -0
  16. package/dist/build.d.ts.map +1 -1
  17. package/dist/build.js +60 -7
  18. package/dist/build.js.map +1 -1
  19. package/dist/cli.d.ts +94 -30
  20. package/dist/cli.d.ts.map +1 -1
  21. package/dist/cli.js +500 -288
  22. package/dist/cli.js.map +1 -1
  23. package/dist/doctor.d.ts.map +1 -1
  24. package/dist/doctor.js +40 -72
  25. package/dist/doctor.js.map +1 -1
  26. package/dist/engine.d.ts +9 -0
  27. package/dist/engine.d.ts.map +1 -1
  28. package/dist/engine.js +27 -0
  29. package/dist/engine.js.map +1 -1
  30. package/dist/facts-file.d.ts +2 -2
  31. package/dist/facts-file.js +2 -2
  32. package/dist/hooks-settings.d.ts +0 -21
  33. package/dist/hooks-settings.d.ts.map +1 -1
  34. package/dist/hooks-settings.js +17 -135
  35. package/dist/hooks-settings.js.map +1 -1
  36. package/dist/init.d.ts +39 -29
  37. package/dist/init.d.ts.map +1 -1
  38. package/dist/init.js +144 -173
  39. package/dist/init.js.map +1 -1
  40. package/dist/link-skills.d.ts +1 -1
  41. package/dist/link-skills.d.ts.map +1 -1
  42. package/dist/link-skills.js +11 -29
  43. package/dist/link-skills.js.map +1 -1
  44. package/dist/new-paper.d.ts +8 -1
  45. package/dist/new-paper.d.ts.map +1 -1
  46. package/dist/new-paper.js +49 -25
  47. package/dist/new-paper.js.map +1 -1
  48. package/dist/paper-files.d.ts +85 -0
  49. package/dist/paper-files.d.ts.map +1 -0
  50. package/dist/paper-files.js +96 -0
  51. package/dist/paper-files.js.map +1 -0
  52. package/dist/paper-settings.d.ts +13 -41
  53. package/dist/paper-settings.d.ts.map +1 -1
  54. package/dist/paper-settings.js +71 -71
  55. package/dist/paper-settings.js.map +1 -1
  56. package/dist/ports/check-references.d.ts +31 -0
  57. package/dist/ports/check-references.d.ts.map +1 -0
  58. package/dist/ports/check-references.js +7 -0
  59. package/dist/ports/check-references.js.map +1 -0
  60. package/dist/presets.d.ts +1 -1
  61. package/dist/presets.d.ts.map +1 -1
  62. package/dist/presets.js +4 -6
  63. package/dist/presets.js.map +1 -1
  64. package/dist/reference-rules.d.ts +47 -0
  65. package/dist/reference-rules.d.ts.map +1 -0
  66. package/dist/reference-rules.js +156 -0
  67. package/dist/reference-rules.js.map +1 -0
  68. package/dist/references.d.ts +36 -0
  69. package/dist/references.d.ts.map +1 -0
  70. package/dist/references.js +91 -0
  71. package/dist/references.js.map +1 -0
  72. package/dist/rules-config.d.ts +5 -3
  73. package/dist/rules-config.d.ts.map +1 -1
  74. package/dist/rules-config.js +15 -6
  75. package/dist/rules-config.js.map +1 -1
  76. package/dist/structure.js +3 -3
  77. package/dist/structure.js.map +1 -1
  78. package/dist/tex-requirements.js +2 -2
  79. package/dist/tex-requirements.js.map +1 -1
  80. package/dist/toolchain.d.ts +5 -1
  81. package/dist/toolchain.d.ts.map +1 -1
  82. package/dist/toolchain.js +22 -5
  83. package/dist/toolchain.js.map +1 -1
  84. package/dist/types.d.ts +26 -18
  85. package/dist/types.d.ts.map +1 -1
  86. package/dist/venue-rules.d.ts.map +1 -1
  87. package/dist/venue-rules.js +12 -10
  88. package/dist/venue-rules.js.map +1 -1
  89. package/docs/configuration.md +163 -104
  90. package/docs/e2e.md +1 -1
  91. package/docs/install.md +25 -40
  92. package/docs/optional-rules.md +5 -4
  93. package/docs/rules.md +65 -24
  94. package/docs/skills.md +80 -0
  95. package/eslint-rules/bib-reachable-entry.mjs +75 -0
  96. package/eslint-rules/latex-language.mjs +29 -1
  97. package/eslint-rules/paper-stages.harness.mjs +1 -117
  98. package/eslint-rules/paper-stages.mjs +0 -120
  99. package/eslint-rules/paper-stages.mutations.mjs +0 -76
  100. package/eslint-rules/paper-typography.mjs +306 -191
  101. package/eslint-rules/paper-typography.test.mjs +337 -0
  102. package/eslint-rules/papers.harness.mjs +8 -12
  103. package/eslint-rules/papers.mjs +17 -31
  104. package/eslint-rules/pdf-last-page-balance.mjs +4 -7
  105. package/eslint-rules/review-frontmatter.mjs +118 -0
  106. package/eslint-rules/review-frontmatter.schema.json +36 -0
  107. package/eslint-rules/review-frontmatter.test.mjs +118 -0
  108. package/eslint-rules/sibling-frontmatter.mjs +19 -0
  109. package/eslint-rules/sibling-frontmatter.schema.json +14 -0
  110. package/eslint.config.mjs +0 -15
  111. package/fixtures/real-markdown-paper/baseline.json +6 -7
  112. package/fixtures/toolchain-mirror/catalog.txt +1 -0
  113. package/fixtures/toolchain-mirror/install-tl +4 -1
  114. package/fixtures/toolchain-mirror/stub-fmtutil-sys +4 -0
  115. package/fixtures/toolchain-mirror/stub-tlmgr +15 -0
  116. package/hooks/hooks.harness.mjs +39 -98
  117. package/hooks/hooks.mutations.mjs +6 -6
  118. package/hooks/paper-edit-guard.hook.d.mts +2 -3
  119. package/hooks/paper-edit-guard.hook.mjs +31 -42
  120. package/hooks/paper-skills-nudge.hook.mjs +21 -19
  121. package/hooks/paper-status-gates.hook.mjs +21 -19
  122. package/hooks/paper-status-gates.sh +8 -13
  123. package/lib/paper-config.d.mts +15 -25
  124. package/lib/paper-config.harness.mjs +18 -35
  125. package/lib/paper-config.mjs +83 -105
  126. package/lib/paper-config.mutations.mjs +2 -2
  127. package/lib/skill-checks.mjs +1 -1
  128. package/lib/skill-trigger-cases.harness.mjs +9 -8
  129. package/lib/skill-trigger-cases.mjs +7 -15
  130. package/package.json +1 -1
  131. package/scripts/eslint-report-guard.mjs +1 -1
  132. package/scripts/harness-api.frozen.json +0 -3
  133. package/scripts/mutation-batteries.frozen.json +5 -14
  134. package/skills/analyze-sibling-paper/SKILL.md +16 -12
  135. package/skills/analyze-sibling-paper/SKILL.md.spec.ts +15 -11
  136. package/skills/cold-read-diff/SKILL.md +20 -1
  137. package/skills/cold-read-diff/SKILL.md.spec.ts +19 -0
  138. package/skills/grade-paper-writing/SKILL.md +20 -1
  139. package/skills/grade-paper-writing/SKILL.md.spec.ts +19 -0
  140. package/skills/paper-pipeline/scripts/consumer.d.mts +0 -1
  141. package/skills/paper-pipeline/scripts/consumer.harness.mjs +8 -12
  142. package/skills/paper-pipeline/scripts/consumer.mjs +19 -33
  143. package/skills/paper-pipeline/scripts/extract-ref-facts.harness.mjs +6 -4
  144. package/skills/paper-pipeline/scripts/run-mechanical.mjs +2 -11
  145. package/skills/plan-paper-timeline/SKILL.md +2 -2
  146. package/skills/plan-paper-timeline/SKILL.md.spec.ts +1 -1
  147. package/skills/plan-paper-timeline/plan-paper-timeline.effects.harness.mjs +1 -1
  148. package/skills/plan-paper-timeline/plan-paper-timeline.effects.mutations.mjs +2 -2
  149. package/skills/render-paper/check-render.sh +2 -3
  150. package/skills/render-paper/render-paper.harness.mjs +2 -2
  151. package/skills/verify-citations/SKILL.md +10 -1
  152. package/skills/verify-citations/SKILL.md.spec.ts +9 -0
  153. package/skills/verify-citations/scripts/bib-authors.mjs +48 -26
  154. package/src/adapters/references/index.ts +102 -0
  155. package/src/adapters/references/reach.io.ts +12 -0
  156. package/src/build-engine.ts +6 -1
  157. package/src/build.harness.mjs +54 -6
  158. package/src/build.ts +89 -11
  159. package/src/cli.harness.mjs +149 -294
  160. package/src/cli.mutations.mjs +35 -44
  161. package/src/cli.ts +637 -328
  162. package/src/doctor.harness.mjs +41 -84
  163. package/src/doctor.mutations.mjs +9 -9
  164. package/src/doctor.ts +44 -89
  165. package/src/engine.harness.mjs +50 -0
  166. package/src/engine.ts +35 -0
  167. package/src/facts-file.test.ts +0 -7
  168. package/src/facts-file.ts +2 -2
  169. package/src/hooks-settings.harness.mjs +7 -92
  170. package/src/hooks-settings.mutations.mjs +2 -17
  171. package/src/hooks-settings.ts +18 -162
  172. package/src/init.test.ts +206 -0
  173. package/src/init.ts +187 -231
  174. package/src/link-skills.harness.mjs +1 -38
  175. package/src/link-skills.mutations.mjs +9 -5
  176. package/src/link-skills.ts +10 -34
  177. package/src/lint-fix.test.ts +120 -0
  178. package/src/linted-set.test.ts +118 -0
  179. package/src/new-paper.harness.mjs +2 -0
  180. package/src/new-paper.mutations.mjs +0 -14
  181. package/src/new-paper.test.ts +173 -14
  182. package/src/new-paper.ts +82 -30
  183. package/src/paper-files.test.ts +395 -0
  184. package/src/paper-files.ts +200 -0
  185. package/src/paper-settings-commands.test.ts +121 -122
  186. package/src/paper-settings.test.ts +93 -64
  187. package/src/paper-settings.ts +99 -97
  188. package/src/parse-args.test.ts +48 -0
  189. package/src/ports/check-references.ts +28 -0
  190. package/src/presets.ts +5 -15
  191. package/src/reference-rules.ts +229 -0
  192. package/src/references.test.ts +209 -0
  193. package/src/references.ts +138 -0
  194. package/src/rules-config.harness.mjs +24 -8
  195. package/src/rules-config.ts +19 -7
  196. package/src/rules-off.test.ts +111 -0
  197. package/src/structure.harness.mjs +4 -2
  198. package/src/structure.ts +3 -3
  199. package/src/tex-requirements.ts +2 -2
  200. package/src/toolchain.harness.mjs +41 -6
  201. package/src/toolchain.ts +29 -5
  202. package/src/types.ts +36 -18
  203. package/src/venue-rules.test.ts +23 -11
  204. package/src/venue-rules.ts +12 -14
  205. package/templates/paper/paperlint.json +1 -1
  206. package/eslint-rules/doc-fields.harness.mjs +0 -336
  207. package/eslint-rules/doc-fields.mjs +0 -186
  208. package/eslint-rules/doc-fields.mutations.mjs +0 -96
  209. package/eslint-rules/paper-typography.harness.mjs +0 -291
  210. package/eslint-rules/paper-typography.mutations.mjs +0 -131
  211. package/eslint-rules/review-findings-cause.harness.mjs +0 -228
  212. package/eslint-rules/review-findings-cause.mjs +0 -135
  213. package/eslint-rules/review-findings-cause.mutations.mjs +0 -72
  214. package/fixtures/paper-stages/authors-ran/PIPELINE-STATUS.md +0 -16
  215. package/fixtures/paper-stages/marker-in-prose/PIPELINE-STATUS.md +0 -17
  216. package/fixtures/review-findings-cause/clean.md +0 -17
  217. package/fixtures/review-findings-cause/defect.md +0 -14
  218. package/fixtures/review-findings-cause/old-debt.md +0 -14
  219. package/fixtures/review-findings-cause/quiet-in-fence.md +0 -16
package/CLAUDE.md CHANGED
@@ -193,7 +193,7 @@ the CONFIG is not declaring something. Check that before adding a verb.
193
193
 
194
194
  `npm i -D paperlint` brings all the code — rules, skills, hooks, scripts. `paperlint init`
195
195
  then does what only a command can, because it depends on the project it lands in: it finds the
196
- papers directory and declares it in `package.json`, links each skill into `.claude/skills/`, writes
196
+ papers directory and declares it in a root `paperlint.json` when it is not the default `papers`, links each skill into `.claude/skills/`, writes
197
197
  the hook commands into `.claude/settings.json` (vigiles' `mergeRegistrations`, reading
198
198
  `plugin/hooks/hooks.json` as the one source), and offers a CI workflow pinned to the installed
199
199
  release's tag. `paperlint doctor` reads all of it back. Details: `docs/install.md`.
@@ -520,6 +520,11 @@ import none of the three are frozen in `scripts/harness-api.frozen.json`, which
520
520
  exits 1 when no file matches, and it transpiles without type-checking, so `npm run check` runs
521
521
  `tsc -p tsconfig.test.json` as its own gate.
522
522
 
523
+ **Local = the fast gates on what you touched; the full `npm run check` = CI.** Locally run vitest on
524
+ the touched test files, `npx tsc --noEmit`, `npx eslint <touched files>` and `npm run fmt:check`, then
525
+ push and read CI by job name. The repo is public, so CI is free, and it also runs the TeX e2e that
526
+ cannot run locally; a local full run takes 10-15 min, most of it the mutation batteries (#52).
527
+
523
528
  ⚠️ **Not `vigiles test .`** — the `.` is read as a FILE, the runner dies with
524
529
  `ERR_UNSUPPORTED_DIR_IMPORT`, and it still exits 0. See the measured table below.
525
530
 
package/README.md CHANGED
@@ -1,297 +1,305 @@
1
+ <!--
2
+ README style — keep it scannable, not a wall of text:
3
+ - One idea per paragraph; paragraphs ≤ 3 lines. Split anything longer.
4
+ - Every section starts with a heading (##); sub-topics get ###. No section longer than one screen.
5
+ - Lists over prose for anything with 3+ items; bullets ≤ 2 lines.
6
+ - Tables for comparisons (commands, venues, checks). Code blocks for every command and file.
7
+ - A blank line between every block. Bold only for the one phrase a skimmer must see.
8
+ - Mechanics and edge cases live in docs/, linked — not inline.
9
+ - A reader must be able to answer "what is it, which venues, how do I start" from the first screen.
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.
13
+ -->
14
+
1
15
  # paperlint
2
16
 
3
17
  [![npm version](https://img.shields.io/npm/v/paperlint)](https://www.npmjs.com/package/paperlint)
4
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)
5
19
 
6
- A linter for scientific papers written in LaTeX. It catches the mechanical mistakes that get a
7
- paper desk-rejected or sent back at camera-ready, before you submit.
8
-
9
- A LaTeX paper can build without an error and still be wrong. The ACM template silently switches to
10
- another font when one of its font packages is missing, and the pages break differently. The same
11
- source paginates differently on a machine with another version of the template. The submitted PDF
12
- gets overwritten a week later and nobody can say what was sent. You find out from a reviewer or a
13
- publisher, or never. paperlint checks for these on your machine and in CI:
14
-
15
- - **Checks against your venue.** Point the paper's `paperlint.json` at a venue preset
16
- (`"extends": "paperlint:aisec"`), build, lint: the page limit for your kind of paper, embedded
17
- fonts and the template's font families, the paper size and column count, and the font sizes, as
18
- the venue's call for papers sets them — plus the checks the venue implies, such as a balanced last
19
- page. Presets ship for the ACM `acmart` sigconf family and three venues — AgenticDev and AISec
20
- (ACM) and REALM (ACL); for any other venue, a preset is one JSON file in your repository
21
- ([`docs/rules.md`](docs/rules.md#writing-your-own-venue-preset)).
22
- - **Builds the same PDF everywhere.** `paperlint toolchain` installs TeX Live with exactly the
23
- packages your venue's template needs and checks that each one is really there, so the silent
24
- font switch cannot happen and your laptop and CI build with the same TeX Live.
25
- - **Keeps what you submitted.** Record "submitted on 22 July, as this PDF", and paperlint fails if
26
- that PDF changes or disappears, or its LaTeX source was not kept beside it.
27
- - **Knows the classic slips.** An ACM paper that overrides the title-page commands and loses part
28
- of page 1; "code will be released" left in a camera-ready; references without a DOI or URL; an
29
- unbalanced last page, for publishers that ask for balanced columns (an optional check).
30
- - **Works with coding agents.** Hooks and skills for Claude Code run the checks after every edit
31
- and stop an agent from rewriting the paper around them.
32
-
33
- It is for researchers and engineers who write papers in LaTeX inside git and submit them to
34
- conferences or journals.
35
-
36
- ## Install and set up
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:
22
+
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.
27
+
28
+ Smaller slips too: `§` for "Section", `.05` for `0.05` — fixed for you.
29
+
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.
32
+
33
+ ## Contents
34
+
35
+ - [The pipeline](#-the-pipeline)
36
+ - [Supported venues](#-supported-venues)
37
+ - [Getting started](#-getting-started)
38
+ - [A new paper](#a-new-paper)
39
+ - [A paper you already have](#a-paper-you-already-have)
40
+ - [Commands](#-commands)
41
+ - [Skills](#-skills)
42
+ - [Lint and build](#-lint-and-build)
43
+ - [Configuration](#-configuration)
44
+ - [Add a venue that isn't listed](#-add-a-venue-that-isnt-listed)
45
+ - [Run it in CI](#-run-it-in-ci)
46
+ - [FAQ](#-faq)
47
+ - [Docs](#-docs)
48
+
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
+ ```
37
66
 
38
- <!-- `vigiles:symbol src/init.ts#init` — `npm run check` fails if this function is renamed or removed. -->
67
+ ## 🎯 Supported venues
39
68
 
40
- ```sh
41
- npm i -D paperlint
42
- npx paperlint init
43
- ```
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.
44
71
 
45
- Node 22.13 or newer. Install first: `paperlint init` links the skills and hooks to the copy in
46
- your project's `node_modules`, so run without the install it has nothing to link to.
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)) |
47
78
 
48
- `paperlint init` finds your papers directory and records it in `package.json`, offers a CI workflow and a
49
- first paper, and sets up the optional Claude Code skills and hooks. It installs no software. It
50
- asks questions only when you run it in a terminal; an agent, CI or `--yes` gets the defaults, and
51
- each default it takes is printed. It ends by running `paperlint doctor`, which checks the setup.
52
- Exactly what it writes: [`docs/install.md`](docs/install.md#what-paperlint-init-writes).
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.
53
81
 
54
- ## What you get
82
+ ## 🚀 Getting started
55
83
 
56
- | command | what it does |
57
- | ----------------------------- | -------------------------------------------------------------------------------------------------- |
58
- | `npx paperlint init` | sets the project up (see above) |
59
- | `npx paperlint new my-paper` | creates a paper folder from a template; never overwrites a file |
60
- | `npx paperlint lint` | runs every check over your papers; `npx paperlint lint papers/my-paper` checks one |
61
- | `npx paperlint build <paper>` | compiles `paper.tex` to `paper.pdf` with pdflatex and bibtex; `--all` builds every paper |
62
- | `npx paperlint toolchain` | installs TeX Live with the LaTeX packages your venues need; `--check` only reports what is missing |
63
- | `npx paperlint doctor` | checks the setup and exits non-zero if something is miswired |
64
- | `npx paperlint --help` | every command and flag |
84
+ ### A new paper
65
85
 
66
- A venue is the conference or journal you submit to. TeX Live is the standard LaTeX distribution;
67
- `paperlint build` offers to install it the first time it needs it.
86
+ <!-- `vigiles:symbol src/init.ts#init` — `npm run check` fails if this function is renamed or removed. -->
68
87
 
69
- ## Your first paper in five minutes
88
+ 1. Install (Node 22.13 or newer):
70
89
 
71
- ### Starting a paper
90
+ ```sh
91
+ npm i -D paperlint
92
+ ```
72
93
 
73
- <!-- `vigiles:symbol src/new-paper.ts#newPaper` — `npm run check` fails if this function is renamed or removed. -->
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)).
74
97
 
75
- After `npx paperlint init`:
98
+ ```sh
99
+ npx paperlint init
100
+ ```
76
101
 
77
- ```sh
78
- npx paperlint new my-paper
79
- ```
102
+ 3. Create a paper. `--venue` names its venue preset from the table above, `--kind` which of its page
103
+ limits applies:
80
104
 
81
- ```
82
- ✓ created papers/my-paper
83
- + PIPELINE-STATUS.md (from the package template)
84
- + paper.tex (from the package template)
85
- + paperlint.json (from the package template)
105
+ <!-- `vigiles:symbol src/new-paper.ts#newPaper` — `npm run check` fails if this function is renamed or removed. -->
86
106
 
87
- config: package.json
88
- …/papers/my-paper/paper.tex
89
- 1:1 warning this paper names no venue preset yet, so its page limit, fonts and format are not checked — set "extends" in papers/my-paper/paperlint.json (e.g. "paperlint:agenticdev"; see docs/rules.md) pdf/measured
107
+ ```sh
108
+ npx paperlint new my-paper --venue agenticdev --kind short
109
+ ```
90
110
 
91
- ✖ 1 problem (0 errors, 1 warning)
92
- ```
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.
93
115
 
94
- The warning is the only thing left to do: the paper does not say where it is going yet.
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.
95
118
 
96
- You now have one folder per paper:
119
+ ```sh
120
+ npx paperlint build papers/my-paper
121
+ ```
97
122
 
98
- ```
99
- papers/
100
- my-paper/
101
- paper.tex the paper, in LaTeX
102
- PIPELINE-STATUS.md the paper's record: its research question and the stages it reached
103
- paperlint.json this paper's settings: its venue preset and kind — `new` writes it
104
- reviews/*.md review notes (optional)
105
- versions/ the exact PDF and source you sent at each stage, never edited
106
- ```
123
+ 5. Check it:
107
124
 
108
- `paperlint new` writes `paperlint.json` with `"extends": null` and a comment saying what goes
109
- there. To have the paper checked against its venue, name the venue preset and the kind of paper:
125
+ ```sh
126
+ npx paperlint lint
127
+ ```
110
128
 
111
- ```json
112
- { "extends": "paperlint:aisec", "kind": "research" }
113
- ```
129
+ On the stub from step 3 the first run already catches something (output shortened):
114
130
 
115
- Settings come in three levels, each named after the tool:
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
136
+ ```
116
137
 
117
- ```
118
- package.json "paperlint": { "papersDir": "papers" } the project
119
- papers/my-paper/
120
- paperlint.json { "extends": "paperlint:aisec", … } this paper
121
- paperlint:aisec a venue preset: shipped, or ./your-venue.jsonc the venue
122
- ```
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.
123
140
 
124
- More in [`docs/configuration.md`](docs/configuration.md#three-levels-of-settings).
125
- `paperlint.json` replaces `venue.json` (2.1.0); `npx paperlint init` moves it.
141
+ ### A paper you already have
126
142
 
127
- A **stage** is a point the paper has reached, such as `submitted` or `camera-ready` (the final
128
- version for the proceedings). The name may use `a-z`, `0-9`, `.`, `_` and `-`. On a folder that
129
- already exists, `paperlint new` adds only the missing files. To use your own templates, put files with
130
- the same names in `papers/.template/`; `{{name}}` in them becomes the paper's name.
143
+ paperlint finds a paper by its folder: `<papersDir>/<name>/`, with the main file named `paper.tex`.
131
144
 
132
- Write the paper, then check and build it:
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.
133
150
 
134
- ```sh
135
- npx paperlint lint # check every paper
136
- npx paperlint build papers/my-paper # writes papers/my-paper/paper.pdf
137
- ```
151
+ ## 🧰 Commands
138
152
 
139
- `paperlint build` runs pdflatex and bibtex until the references settle. There is no build script to
140
- write; a `build.sh` in the paper folder is ignored.
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 |
141
162
 
142
- When you submit, copy the PDF and `paper.tex` into `versions/` and record the stage in the front
143
- matter of `PIPELINE-STATUS.md`, with the file sizes in bytes:
163
+ ## 🧠 Skills
144
164
 
145
- ```yaml
146
- stages:
147
- - stage: submitted
148
- date: 2026-07-22
149
- venue: A Venue 2026
150
- pdf: versions/2026-07-22-submitted.pdf
151
- bytes: 305412
152
- source: versions/2026-07-22-submitted.tex
153
- sourceBytes: 57210
154
- ```
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.
155
168
 
156
- From then on `paperlint lint` fails if that PDF goes missing or changes size. A frozen PDF should never
157
- change, so a size that no longer matches means the file was replaced after you recorded it
158
- ([`docs/rules.md`](docs/rules.md#the-scorecards-bytes-and-sourcebytes)).
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`
159
175
 
160
- ### What a finding looks like
176
+ All 24, by stage: [`docs/skills.md`](docs/skills.md).
161
177
 
162
- On a paper folder made by hand, with only `paper.tex`:
178
+ ## 🔍 Lint and build
163
179
 
164
- ```
165
- config: package.json
166
- papers/my-paper
167
- error missing `PIPELINE-STATUS.md` — `paper/stages`, `paper/source` and `paper/author-list` read this file, so nothing `my-paper` declares about its stages, sources or authors is checked
168
- …/my-papers/papers/my-paper/paper.tex
169
- 1:1 warning 1 × `§` instead of «Section» (reviewer B). Paying the debt down is silent; growth is reported paper/typography
170
- 1:1 warning 1 × a decimal without a leading zero, `.05` instead of `0.05` (IEEE / ISO 80000-1 style). Paying the debt down is silent; growth is reported paper/typography
171
-
172
- ✖ 2 problems (0 errors, 2 warnings)
173
- ```
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) |
174
185
 
175
- Each finding gives the file, line and column, the level, what is wrong, and the check that found
176
- it. The first line is an error about the folder: without `PIPELINE-STATUS.md`, the three checks
177
- that read it have nothing to check; `npx paperlint new my-paper` adds the file and leaves `paper.tex`
178
- alone. The two warnings count typography slips against an allowance you can set per paper: going over
179
- it is reported, fixing some is not ("paying the debt down is silent").
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>`.
180
192
 
181
- `paperlint lint` exits `1` when any check reports an error (as here, even though the summary line counts
182
- only the warnings in files), or when it checked no files at all (usually a wrong path). Warnings
183
- never fail the run unless you pass `--max-warnings <n>`. `--json` prints the findings as JSON.
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).
184
195
 
185
- ## Run it in CI
196
+ ## 🧩 Configuration
186
197
 
187
- `paperlint init` offers to write this GitHub Actions workflow step for you. By hand:
198
+ Two levels, one file name, both optional:
188
199
 
189
- ```yaml
190
- - uses: zernie/paperlint@v2.0.0
191
- with:
192
- paths: papers
193
200
  ```
201
+ paperlint.json the project: papersDir, rules, defaults for every paper
202
+ papers/my-paper/paperlint.json one paper: its venue preset ("extends"), its kind, its own rules
203
+ ```
204
+
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.
194
209
 
195
- Use the tag of the version you installed (`npm ls paperlint`): every npm release has
196
- a git tag of the same version, so the step runs the same code as your package. It runs
197
- `paperlint lint`. `paths` is required, and the step fails if it checked zero files, so a typo in the path
198
- shows up red. Optional inputs: `config`, `max-warnings` (default `-1`, no limit), `texcount` (default
199
- `true`), `working-directory`.
200
-
201
- ## What the checks catch
202
-
203
- | check | level | catches |
204
- | ------------------------------ | ------- | ---------------------------------------------------------------------------------------------------------------- |
205
- | `paper/stages` | error | a stage's PDF is missing, or it is not the same file any more (its size changed) |
206
- | `paper/source` | error | a stage has no frozen source file next to its PDF |
207
- | `paper/author-list` | warning | a stage is declared, but `PIPELINE-STATUS.md` does not record that the author list was checked |
208
- | `paper/research-question` | warning | the research question is missing from `PIPELINE-STATUS.md`, or the paper does not contain that sentence |
209
- | `paper/typography` | warning | more `§`, `.05`-style decimals, mixed `Fig.`/`Figure`, or references without a DOI or URL than you allowed |
210
- | `tex/future-promise` | warning | a camera-ready still says your code "will be released" |
211
- | `tex/acm-frontmatter-override` | error | an ACM paper overrides the template's title-page commands, so parts of page 1 go missing |
212
- | `review/findings-cause` | error | a review note lists several findings and names no cause for any of them |
213
- | `doc/fields` | warning | a review note's front matter is missing a field you require (off unless configured) |
214
- | `pdf/limits` | error | more body or reference pages than the venue allows for your kind of paper, or a reference font size out of range |
215
- | `pdf/fonts` | error | a Type 3 or unembedded font, or the venue template's fonts are missing (a silent Computer Modern fallback) |
216
- | `pdf/geometry` | error | the paper size or column count differs from the venue's |
217
- | `pdf/body-size` | warning | the body font size is off the venue's |
218
- | `pdf/profile` | error | the paper's `extends` names no preset (a typo), or a kind of paper the venue does not have |
219
- | `pdf/fresh` | error | the build facts describe an earlier PDF than the one on disk |
220
- | `pdf/measured` | warning | the venue checks did not run: the paper names no venue preset yet, or was not built |
221
-
222
- The `pdf/` checks run only for a paper whose `paperlint.json` extends a venue preset, and they judge the PDF
223
- `paperlint build` made: build, then lint. Errors fail the run; warnings only print. What each check
224
- reads: [`docs/rules.md`](docs/rules.md).
225
- Checks that only some venues need are off until you turn them on:
226
- [`docs/optional-rules.md`](docs/optional-rules.md).
227
-
228
- ## Configuration
229
-
230
- `paperlint init` writes the one required setting into `package.json`:
231
-
232
- ```json
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).
212
+
213
+ ### ➕ Add a venue that isn't listed
214
+
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`:
217
+
218
+ ```jsonc
233
219
  {
234
- "paperlint": {
235
- "papersDir": "papers"
236
- }
220
+ // page size, columns and fonts of the ACM two-column format
221
+ "extends": "paperlint:acm-sigconf",
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
+ },
237
229
  }
238
230
  ```
239
231
 
240
- `papersDir` has no default, so the tool never checks a folder you did not choose: without it,
241
- `paperlint lint` stops and says so, unless you pass a path. An unknown key is an error. The optional
242
- settings, and how to use the checks inside your own ESLint setup, are in
243
- [`docs/configuration.md`](docs/configuration.md). TeX Live, its install location and the external
244
- programs the skills use are in [`docs/toolchain.md`](docs/toolchain.md).
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).
238
+
239
+ ## 🤖 Run it in CI
240
+
241
+ Two options:
245
242
 
246
- ## Claude Code (optional)
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
247
 
248
- `paperlint lint` needs only Node. If you use Claude Code, `paperlint init` also sets up two things:
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
+ ```
249
270
 
250
- **Skills** — one per stage of writing a paper, from checking the idea through drafting, review,
251
- submission and camera-ready. They are linked into `.claude/skills/`. Start with `/paper-pipeline`;
252
- it routes to the rest. Some call Java or Python 3, which you install yourself.
271
+ Lint only — each paper then gets one warning that it was not built:
253
272
 
254
- **Hooks** — written into `.claude/settings.json`. Commit that file so every clone gets them; a
255
- fresh clone needs `npm install` before they run.
273
+ ```yaml
274
+ - uses: zernie/paperlint@v3.0.0
275
+ with:
276
+ paths: papers # your papersDir
277
+ ```
256
278
 
257
- | hook | blocks? | what it does |
258
- | -------------------- | ------- | ---------------------------------------------------------------- |
259
- | `paper-edit-guard` | yes | stops a shell command from writing to a paper file |
260
- | `paper-skills-nudge` | no | after a paper edit, shows the agent the pre-submission checklist |
261
- | `paper-status-gates` | no | after a paper edit, lists the stages that have not run yet |
279
+ ## ❓ FAQ
262
280
 
263
- **Know this about `paper-edit-guard`:** if the `paperlint` key in `package.json`
264
- cannot be read (the file is missing, or has merge-conflict markers), it blocks **every** shell
265
- command in Claude Code, not only paper ones, until the key is readable again. Fix `package.json`
266
- with a normal file edit — those are not blocked.
281
+ **Does it install anything without asking?**
282
+ No. TeX Live comes only from `paperlint toolchain`, or when you say yes in `init` or `build`. On
283
+ Windows, install TeX Live yourself.
267
284
 
268
- ## What it does not do
285
+ **Several papers for different venues in one repo?**
286
+ Yes. Each paper names its own venue preset in its own `paperlint.json`.
269
287
 
270
- - **It does not install software behind your back.** `paperlint init` installs nothing; TeX Live comes
271
- only from `paperlint toolchain` or when you answer yes in `paperlint build`. On Windows, install TeX Live
272
- yourself.
273
- - **It does not guess what to check.** There is no default papers directory.
274
- - **It does not overwrite your files.** `paperlint new` and `paperlint init` only add what is missing.
275
- - **It does not run your build script.** `paperlint build` compiles the paper itself.
276
- - **It does not write or grade the paper.** `paperlint lint` checks records and a few mechanical
277
- mistakes; judging the writing is what the optional skills are for.
278
- - **New papers are LaTeX.** Markdown papers (`paper.md`) are still read but deprecated
279
- ([#57](https://github.com/zernie/paperlint/issues/57)).
280
- - **No Yarn Plug'n'Play.** npm and pnpm are supported
281
- ([`docs/install.md`](docs/install.md#package-managers)).
288
+ **Does it change my paper?**
289
+ Only `paperlint lint --fix`, and only three rules: `paper/section-word` (`§` → Section),
290
+ `paper/leading-zero` (`.05` → `0.05`) and `paper/figure-ref-style` (one figure-reference style).
282
291
 
283
- ## Contributing
292
+ ## 📚 Docs
284
293
 
285
- See [`CONTRIBUTING.md`](CONTRIBUTING.md): how the package is tested, the one command that runs
286
- every check, and how releases work: the pull-request title decides the version (`feat:` is a
287
- minor release, `fix:` a patch).
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
298
+ - [`docs/optional-rules.md`](docs/optional-rules.md) — checks only some venues need
299
+ - [`docs/toolchain.md`](docs/toolchain.md) — TeX Live, and Banal (HotCRP's page-geometry checker, GPL)
300
+ - [`CONTRIBUTING.md`](CONTRIBUTING.md) — how the package is tested and released, and adding a venue to it
288
301
 
289
302
  ## License
290
303
 
291
- MIT.
292
-
293
- **banal is not part of this package.** banal, the page-geometry script from
294
- [HotCRP](https://github.com/kohler/hotcrp) (Geoffrey M. Voelker, Eddie Kohler), is licensed
295
- GPL-2.0-or-later. paperlint does not contain, copy or modify it: `paperlint toolchain` downloads it from HotCRP
296
- at a pinned commit, checks its sha256, and paperlint runs it as a separate program (`perl banal …`),
297
- reading its JSON output. Details: [`docs/toolchain.md`](docs/toolchain.md#page-geometry-banal-without-poppler).
304
+ MIT. Banal, used for page geometry, is GPL and not part of this package:
305
+ [`docs/toolchain.md`](docs/toolchain.md#page-geometry-banal-without-poppler).
package/action.yml CHANGED
@@ -26,11 +26,9 @@ description: Install the toolchain the texcount/* rules need, run ESLint, and re
26
26
  inputs:
27
27
  config:
28
28
  description: >-
29
- Path to the `package.json` holding the `paperlint` settings. Optional: `paperlint lint` finds it by walking up from the working directory,
30
- the way eslint and tsc find theirs, so most callers never set this. Pass it only when the
31
- file is somewhere the walk cannot reach. ⚠️ Until 2026-09-18 this input took a path to an
32
- ESLint FLAT CONFIG and defaulted to `eslint.config.mjs`; a caller still passing one will
33
- fail loudly on the first run rather than lint against it.
29
+ Path to the project's root `paperlint.json`. Optional, and so is the file: `paperlint lint`
30
+ finds it by walking up from the working directory, the way eslint and tsc find theirs, so
31
+ most callers never set this. Pass it only when the file is somewhere the walk cannot reach.
34
32
  required: false
35
33
  default: ""
36
34
  paths:
@@ -135,4 +133,4 @@ runs:
135
133
  npx paperlint lint $PAPERLINT_PATHS ${PAPERLINT_CONFIG:+--config "$PAPERLINT_CONFIG"} \
136
134
  --max-warnings="$PAPERLINT_MAXWARN" --json > "$RUNNER_TEMP/paperlint-report.json" || RC=$?
137
135
  node "$GITHUB_ACTION_PATH/scripts/eslint-report-guard.mjs" \
138
- "$RUNNER_TEMP/paperlint-report.json" "$RC" "$PAPERLINT_PATHS" "${PAPERLINT_CONFIG:-package.json}"
136
+ "$RUNNER_TEMP/paperlint-report.json" "$RC" "$PAPERLINT_PATHS" "${PAPERLINT_CONFIG:-paperlint.json}"
@@ -0,0 +1,13 @@
1
+ /**
2
+ * The online reference checks, as the `CheckReferences` port: `verify-cites` (the cited work
3
+ * exists, the title matches — Crossref, OpenAlex, Semantic Scholar, arXiv) and `bib-authors` (the
4
+ * authors are the published version's — DBLP). Both ship in this package's verify-citations skill;
5
+ * this adapter only runs them and shapes their answers.
6
+ *
7
+ * "Not checked" is decided up front, by one request: when Crossref cannot be reached at all, the
8
+ * checkers would degrade every entry to `unresolvable` / `unchecked`, which reads like a result.
9
+ * Saying `not-checked` with the reason is the honest record.
10
+ */
11
+ import type { CheckReferences } from "../../ports/check-references.ts";
12
+ export declare const onlineReferences: CheckReferences;
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adapters/references/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EACV,eAAe,EAEhB,MAAM,iCAAiC,CAAC;AAwEzC,eAAO,MAAM,gBAAgB,EAAE,eAgB9B,CAAC"}