paperlint 8.0.0 → 9.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/CLAUDE.md +22 -0
- package/.github/CLAUDE.md.spec.ts +20 -0
- package/CLAUDE.md +59 -531
- package/CONTRIBUTING.md +7 -6
- package/README.md +4 -3
- package/dist/CLAUDE.md.spec.d.ts +3 -0
- package/dist/CLAUDE.md.spec.d.ts.map +1 -0
- package/dist/CLAUDE.md.spec.js +62 -0
- package/dist/CLAUDE.md.spec.js.map +1 -0
- package/dist/adapters/bibtex/index.d.ts +3 -0
- package/dist/adapters/bibtex/index.d.ts.map +1 -0
- package/dist/adapters/bibtex/index.js +103 -0
- package/dist/adapters/bibtex/index.js.map +1 -0
- package/dist/adapters/latex/filecontents.d.ts +33 -0
- package/dist/adapters/latex/filecontents.d.ts.map +1 -0
- package/dist/adapters/latex/filecontents.js +65 -0
- package/dist/adapters/latex/filecontents.js.map +1 -0
- package/dist/adapters/latex/includes.d.ts +3 -3
- package/dist/adapters/latex/includes.d.ts.map +1 -1
- package/dist/adapters/latex/includes.js +18 -10
- package/dist/adapters/latex/includes.js.map +1 -1
- package/dist/adapters/latex/index.d.ts.map +1 -1
- package/dist/adapters/latex/index.js +2 -0
- package/dist/adapters/latex/index.js.map +1 -1
- package/dist/adapters/latex/nodes.d.ts +12 -0
- package/dist/adapters/latex/nodes.d.ts.map +1 -1
- package/dist/adapters/latex/nodes.js +39 -0
- package/dist/adapters/latex/nodes.js.map +1 -1
- package/dist/adapters/latex/parse.d.ts +7 -1
- package/dist/adapters/latex/parse.d.ts.map +1 -1
- package/dist/adapters/latex/parse.js +55 -6
- package/dist/adapters/latex/parse.js.map +1 -1
- package/dist/adapters/memory/index.d.ts +3 -0
- package/dist/adapters/memory/index.d.ts.map +1 -1
- package/dist/adapters/memory/index.js +9 -0
- package/dist/adapters/memory/index.js.map +1 -1
- package/dist/adapters/references/index.d.ts.map +1 -1
- package/dist/adapters/references/index.js +27 -24
- package/dist/adapters/references/index.js.map +1 -1
- package/dist/adapters/sources-record/index.d.ts +9 -0
- package/dist/adapters/sources-record/index.d.ts.map +1 -0
- package/dist/adapters/sources-record/index.js +68 -0
- package/dist/adapters/sources-record/index.js.map +1 -0
- package/dist/adapters/tex-output/blg.d.ts +9 -0
- package/dist/adapters/tex-output/blg.d.ts.map +1 -0
- package/dist/adapters/tex-output/blg.js +20 -0
- package/dist/adapters/tex-output/blg.js.map +1 -0
- package/dist/adapters/tex-output/fls.d.ts +8 -0
- package/dist/adapters/tex-output/fls.d.ts.map +1 -0
- package/dist/adapters/tex-output/fls.js +16 -0
- package/dist/adapters/tex-output/fls.js.map +1 -0
- package/dist/adapters/tex-output/index.d.ts +7 -0
- package/dist/adapters/tex-output/index.d.ts.map +1 -0
- package/dist/adapters/tex-output/index.js +7 -0
- package/dist/adapters/tex-output/index.js.map +1 -0
- package/dist/bib-rules.d.ts +47 -0
- package/dist/bib-rules.d.ts.map +1 -0
- package/dist/bib-rules.js +127 -0
- package/dist/bib-rules.js.map +1 -0
- package/dist/build.d.ts +29 -1
- package/dist/build.d.ts.map +1 -1
- package/dist/build.js +41 -25
- package/dist/build.js.map +1 -1
- package/dist/claim-provenance.d.ts +2 -2
- package/dist/cli.d.ts +6 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +30 -26
- package/dist/cli.js.map +1 -1
- package/dist/domain/paper-source.d.ts +1 -10
- package/dist/domain/paper-source.d.ts.map +1 -1
- package/dist/domain/paper-source.js +34 -24
- package/dist/domain/paper-source.js.map +1 -1
- package/dist/domain/paper-sources.d.ts +72 -0
- package/dist/domain/paper-sources.d.ts.map +1 -0
- package/dist/domain/paper-sources.js +18 -0
- package/dist/domain/paper-sources.js.map +1 -0
- package/dist/domain/sources-record.d.ts +102 -0
- package/dist/domain/sources-record.d.ts.map +1 -0
- package/dist/domain/sources-record.js +38 -0
- package/dist/domain/sources-record.js.map +1 -0
- package/dist/domain/tex-run.d.ts +25 -0
- package/dist/domain/tex-run.d.ts.map +1 -0
- package/dist/domain/tex-run.js +79 -0
- package/dist/domain/tex-run.js.map +1 -0
- package/dist/eslint-rules/CLAUDE.md.spec.d.ts +3 -0
- package/dist/eslint-rules/CLAUDE.md.spec.d.ts.map +1 -0
- package/dist/eslint-rules/CLAUDE.md.spec.js +39 -0
- package/dist/eslint-rules/CLAUDE.md.spec.js.map +1 -0
- package/dist/eslint-rules/install-path-literals.d.ts +1 -1
- package/dist/eslint-rules/install-path-literals.js +4 -4
- package/dist/eslint-rules/install-path-literals.js.map +1 -1
- package/dist/eslint-rules/paper-context.d.ts.map +1 -1
- package/dist/eslint-rules/paper-context.js +4 -3
- package/dist/eslint-rules/paper-context.js.map +1 -1
- package/dist/eslint-rules/paper-typography.d.ts +0 -9
- package/dist/eslint-rules/paper-typography.d.ts.map +1 -1
- package/dist/eslint-rules/paper-typography.js +12 -5
- package/dist/eslint-rules/paper-typography.js.map +1 -1
- package/dist/eslint-rules/pdf-last-page-balance.js +1 -1
- package/dist/latex-log.d.ts +10 -0
- package/dist/latex-log.d.ts.map +1 -1
- package/dist/latex-log.js +10 -0
- package/dist/latex-log.js.map +1 -1
- package/dist/latex-loop.d.ts +2 -0
- package/dist/latex-loop.d.ts.map +1 -1
- package/dist/latex-loop.js.map +1 -1
- package/dist/lib/agent-cli-version.js +1 -1
- package/dist/lib/agent-cli-version.js.map +1 -1
- package/dist/package-dirs.d.ts.map +1 -1
- package/dist/package-dirs.js +3 -2
- package/dist/package-dirs.js.map +1 -1
- package/dist/paper-includes.d.ts +4 -7
- package/dist/paper-includes.d.ts.map +1 -1
- package/dist/paper-includes.js +29 -21
- package/dist/paper-includes.js.map +1 -1
- package/dist/paper-prose.d.ts +2 -2
- package/dist/paper-record.d.ts +25 -0
- package/dist/paper-record.d.ts.map +1 -0
- package/dist/paper-record.js +39 -0
- package/dist/paper-record.js.map +1 -0
- package/dist/paper-sources.d.ts +66 -0
- package/dist/paper-sources.d.ts.map +1 -0
- package/dist/paper-sources.js +92 -0
- package/dist/paper-sources.js.map +1 -0
- package/dist/ports/bib-reader.d.ts +18 -0
- package/dist/ports/bib-reader.d.ts.map +1 -0
- package/dist/ports/bib-reader.js +2 -0
- package/dist/ports/bib-reader.js.map +1 -0
- package/dist/ports/check-references.d.ts +9 -4
- package/dist/ports/check-references.d.ts.map +1 -1
- package/dist/ports/latex.d.ts +15 -0
- package/dist/ports/latex.d.ts.map +1 -1
- package/dist/ports/sources-codec.d.ts +11 -0
- package/dist/ports/sources-codec.d.ts.map +1 -0
- package/dist/ports/sources-codec.js +2 -0
- package/dist/ports/sources-codec.js.map +1 -0
- package/dist/ports/tex-output.d.ts +17 -0
- package/dist/ports/tex-output.d.ts.map +1 -0
- package/dist/ports/tex-output.js +2 -0
- package/dist/ports/tex-output.js.map +1 -0
- package/dist/recorded-bibliography.d.ts +89 -0
- package/dist/recorded-bibliography.d.ts.map +1 -0
- package/dist/recorded-bibliography.js +136 -0
- package/dist/recorded-bibliography.js.map +1 -0
- package/dist/reference-rules.d.ts +5 -5
- package/dist/reference-rules.d.ts.map +1 -1
- package/dist/reference-rules.js +150 -77
- package/dist/reference-rules.js.map +1 -1
- package/dist/references.d.ts +71 -16
- package/dist/references.d.ts.map +1 -1
- package/dist/references.js +110 -26
- package/dist/references.js.map +1 -1
- package/dist/register-bands.d.ts +3 -3
- package/dist/register-bands.d.ts.map +1 -1
- package/dist/register-bands.js.map +1 -1
- package/dist/register.d.ts +2 -2
- package/dist/sources-record.d.ts +38 -0
- package/dist/sources-record.d.ts.map +1 -0
- package/dist/sources-record.js +123 -0
- package/dist/sources-record.js.map +1 -0
- package/dist/sources-rules.d.ts +44 -0
- package/dist/sources-rules.d.ts.map +1 -0
- package/dist/sources-rules.js +76 -0
- package/dist/sources-rules.js.map +1 -0
- package/dist/tex-paper.d.ts +10 -15
- package/dist/tex-paper.d.ts.map +1 -1
- package/dist/tex-paper.js +24 -40
- package/dist/tex-paper.js.map +1 -1
- package/dist/tex-requirements.js +1 -1
- package/dist/tex-venue-rules.d.ts +3 -3
- package/dist/tex-venue-rules.d.ts.map +1 -1
- package/dist/tex-venue-rules.js.map +1 -1
- package/dist/toolchain.js +1 -1
- package/docs/configuration.md +12 -4
- package/docs/design/paper-sources.md +197 -0
- package/docs/e2e.md +1 -1
- package/docs/incidents.md +5 -5
- package/docs/package-shape-options.md +1 -1
- package/docs/references.md +34 -8
- package/docs/rules/bib/reachable-entry.md +64 -0
- package/docs/rules/paper/sources-fresh.md +81 -0
- package/docs/rules.md +62 -57
- package/eslint-rules/CLAUDE.md +44 -0
- package/eslint-rules/CLAUDE.md.spec.ts +43 -0
- package/eslint-rules/install-path-literals.harness.mjs +1 -1
- package/eslint-rules/install-path-literals.ts +4 -4
- package/eslint-rules/paper-context.ts +4 -3
- package/eslint-rules/paper-typography.test.mjs +12 -72
- package/eslint-rules/paper-typography.ts +13 -6
- package/eslint-rules/pdf-last-page-balance.ts +1 -1
- package/eslint.config.mjs +28 -3
- package/fixtures/build-e2e/aidc/paper.tex +1 -1
- package/fixtures/build-e2e/anon-ack/paper.tex +1 -1
- package/fixtures/build-e2e/anon-author/paper.tex +1 -1
- package/fixtures/build-e2e/anon-bib/paper.tex +1 -1
- package/fixtures/build-e2e/anon-href/paper.tex +1 -1
- package/fixtures/build-e2e/anon-macro/paper.tex +1 -1
- package/fixtures/build-e2e/anon-pdfauthor/paper.tex +1 -1
- package/fixtures/paper-sources/p1/paper.tex +30 -0
- package/fixtures/paper-sources/p1/refs.bib +6 -0
- package/fixtures/paper-sources/p1/sections/dead.tex +6 -0
- package/fixtures/paper-sources/p1/sections/intro.tex +7 -0
- package/fixtures/paper-sources/p1/sections/parked.tex +6 -0
- package/fixtures/paper-sources/p1/tex-truth.json +37 -0
- package/fixtures/paper-sources/p1/versions/2026-01-01-review.tex +4 -0
- package/fixtures/paper-sources/v1-stale/paper.tex +14 -0
- package/fixtures/paper-sources/v1-stale/refs.bib +6 -0
- package/fixtures/paper-sources/v1-stale/tex-truth.json +32 -0
- package/fixtures/paper-sources/v10-ifthenelse/anon.bib +1 -0
- package/fixtures/paper-sources/v10-ifthenelse/paper.tex +9 -0
- package/fixtures/paper-sources/v10-ifthenelse/real.bib +1 -0
- package/fixtures/paper-sources/v10-ifthenelse/tex-truth.json +28 -0
- package/fixtures/paper-sources/v11-two-blocks/paper.tex +12 -0
- package/fixtures/paper-sources/v11-two-blocks/tex-truth.json +30 -0
- package/fixtures/paper-sources/v13-percent-text/paper.tex +6 -0
- package/fixtures/paper-sources/v13-percent-text/refs.bib +3 -0
- package/fixtures/paper-sources/v13-percent-text/tex-truth.json +30 -0
- package/fixtures/paper-sources/v15-after-end/paper.tex +6 -0
- package/fixtures/paper-sources/v15-after-end/refs.bib +1 -0
- package/fixtures/paper-sources/v15-after-end/tex-truth.json +17 -0
- package/fixtures/paper-sources/v16-included-block/bibblock.tex +3 -0
- package/fixtures/paper-sources/v16-included-block/paper.tex +7 -0
- package/fixtures/paper-sources/v16-included-block/refs.bib +1 -0
- package/fixtures/paper-sources/v16-included-block/tex-truth.json +35 -0
- package/fixtures/paper-sources/v17-include-order/bibsetup.tex +1 -0
- package/fixtures/paper-sources/v17-include-order/first.bib +1 -0
- package/fixtures/paper-sources/v17-include-order/later.bib +1 -0
- package/fixtures/paper-sources/v17-include-order/paper.tex +7 -0
- package/fixtures/paper-sources/v17-include-order/tex-truth.json +40 -0
- package/fixtures/paper-sources/v2-overwrite/paper.tex +14 -0
- package/fixtures/paper-sources/v2-overwrite/refs.bib +6 -0
- package/fixtures/paper-sources/v2-overwrite/tex-truth.json +30 -0
- package/fixtures/paper-sources/v22-parked-thebibliography/paper.tex +7 -0
- package/fixtures/paper-sources/v22-parked-thebibliography/tex-truth.json +17 -0
- package/fixtures/paper-sources/v23-parked-include/old.bib +1 -0
- package/fixtures/paper-sources/v23-parked-include/paper.tex +7 -0
- package/fixtures/paper-sources/v23-parked-include/parked.tex +1 -0
- package/fixtures/paper-sources/v23-parked-include/refs.bib +1 -0
- package/fixtures/paper-sources/v23-parked-include/tex-truth.json +28 -0
- package/fixtures/paper-sources/v24-quoted-fields/paper.tex +6 -0
- package/fixtures/paper-sources/v24-quoted-fields/refs.bib +5 -0
- package/fixtures/paper-sources/v24-quoted-fields/tex-truth.json +32 -0
- package/fixtures/paper-sources/v25-string-differs/paper.tex +10 -0
- package/fixtures/paper-sources/v25-string-differs/refs.bib +2 -0
- package/fixtures/paper-sources/v25-string-differs/tex-truth.json +32 -0
- package/fixtures/paper-sources/v26-comment-in-names/one.bib +1 -0
- package/fixtures/paper-sources/v26-comment-in-names/paper.tex +7 -0
- package/fixtures/paper-sources/v26-comment-in-names/tex-truth.json +32 -0
- package/fixtures/paper-sources/v26-comment-in-names/two.bib +1 -0
- package/fixtures/paper-sources/v27-shared-string/abbreviations.bib +2 -0
- package/fixtures/paper-sources/v27-shared-string/paper.tex +6 -0
- package/fixtures/paper-sources/v27-shared-string/references.bib +6 -0
- package/fixtures/paper-sources/v27-shared-string/tex-truth.json +31 -0
- package/fixtures/paper-sources/v28-shared-string-block/abbreviations.bib +2 -0
- package/fixtures/paper-sources/v28-shared-string-block/paper.tex +14 -0
- package/fixtures/paper-sources/v28-shared-string-block/tex-truth.json +33 -0
- package/fixtures/paper-sources/v29-generated-input/paper.tex +9 -0
- package/fixtures/paper-sources/v29-generated-input/tex-truth.json +24 -0
- package/fixtures/paper-sources/v3-declared/paper.bib +6 -0
- package/fixtures/paper-sources/v3-declared/paper.tex +6 -0
- package/fixtures/paper-sources/v3-declared/tex-truth.json +28 -0
- package/fixtures/paper-sources/v30-name-next-line/paper.tex +14 -0
- package/fixtures/paper-sources/v30-name-next-line/tex-truth.json +30 -0
- package/fixtures/paper-sources/v4-commented/paper.tex +14 -0
- package/fixtures/paper-sources/v4-commented/refs.bib +6 -0
- package/fixtures/paper-sources/v4-commented/tex-truth.json +28 -0
- package/fixtures/paper-sources/v5-percent-entry/paper.tex +20 -0
- package/fixtures/paper-sources/v5-percent-entry/tex-truth.json +37 -0
- package/fixtures/paper-sources/v6-unclosed/paper.tex +6 -0
- package/fixtures/paper-sources/v6-unclosed/refs.bib +5 -0
- package/fixtures/paper-sources/v6-unclosed/tex-truth.json +37 -0
- package/fixtures/paper-sources/v8-jobname/paper.tex +9 -0
- package/fixtures/paper-sources/v8-jobname/tex-truth.json +30 -0
- package/fixtures/paper-sources/v9-two-bibliographies/one.bib +1 -0
- package/fixtures/paper-sources/v9-two-bibliographies/paper.tex +7 -0
- package/fixtures/paper-sources/v9-two-bibliographies/tex-truth.json +35 -0
- package/fixtures/paper-sources/v9-two-bibliographies/two.bib +1 -0
- package/fixtures/paper-typography/clean-paper/paper.tex +1 -1
- package/fixtures/paper-typography/messy-paper/paper.tex +1 -1
- package/hooks/CLAUDE.md +34 -0
- package/hooks/CLAUDE.md.spec.ts +30 -0
- package/lib/agent-cli-version.ts +1 -1
- package/package.json +3 -11
- package/plugin/CLAUDE.md +22 -0
- package/plugin/CLAUDE.md.spec.ts +22 -0
- package/scripts/check.test.ts +23 -1
- package/scripts/check.ts +7 -3
- package/scripts/coverage-config.test.ts +21 -11
- package/scripts/layer-legacy-frozen.test.ts +41 -2
- package/scripts/layer-legacy-frozen.ts +31 -2
- package/skills/CLAUDE.md +19 -0
- package/skills/CLAUDE.md.spec.ts +18 -0
- package/skills/grade-paper-writing/SKILL.md +4 -3
- package/skills/grade-paper-writing/SKILL.md.spec.ts +3 -2
- package/skills/grade-paper-writing/prose-lint.mjs +11 -2
- package/skills/grade-paper-writing/prose-lint.test.ts +52 -4
- package/skills/paper-pipeline/scripts/extract-ref-facts.harness.mjs +83 -33
- package/skills/paper-pipeline/scripts/extract-ref-facts.mjs +67 -115
- package/skills/paper-pipeline/scripts/extract-ref-facts.test.mjs +128 -121
- package/skills/plan-paper-timeline/plan-paper-timeline.effects.harness.mjs +21 -102
- package/skills/verify-citations/SKILL.md +7 -4
- package/skills/verify-citations/SKILL.md.spec.ts +6 -3
- package/skills/verify-citations/scripts/bib-authors.check.test.mjs +17 -19
- package/skills/verify-citations/scripts/bib-authors.cli.test.ts +129 -46
- package/skills/verify-citations/scripts/bib-authors.d.mts +22 -2
- package/skills/verify-citations/scripts/bib-authors.mjs +57 -111
- package/skills/verify-citations/scripts/verify-cites.cli.test.ts +16 -0
- package/skills/verify-citations/scripts/verify-cites.d.mts +19 -3
- package/skills/verify-citations/scripts/verify-cites.mjs +42 -108
- package/skills/verify-citations/scripts/verify-cites.test.mjs +23 -36
- package/src/CLAUDE.md +23 -1
- package/src/CLAUDE.md.spec.ts +72 -0
- package/src/adapters/bibtex/index.test.ts +163 -0
- package/src/adapters/bibtex/index.ts +155 -0
- package/src/adapters/latex/filecontents.ts +114 -0
- package/src/adapters/latex/includes.ts +18 -10
- package/src/adapters/latex/index.test.ts +73 -0
- package/src/adapters/latex/index.ts +2 -0
- package/src/adapters/latex/nodes.ts +64 -0
- package/src/adapters/latex/parse.test.ts +38 -0
- package/src/adapters/latex/parse.ts +67 -6
- package/src/adapters/memory/index.ts +17 -0
- package/src/adapters/references/index.test.ts +75 -21
- package/src/adapters/references/index.ts +37 -32
- package/src/adapters/sources-record/index.test.ts +87 -0
- package/src/adapters/sources-record/index.ts +82 -0
- package/src/adapters/tex-output/blg.ts +27 -0
- package/src/adapters/tex-output/fls.ts +24 -0
- package/src/adapters/tex-output/index.test.ts +171 -0
- package/src/adapters/tex-output/index.ts +12 -0
- package/src/bib-rules.test.ts +356 -0
- package/src/bib-rules.ts +228 -0
- package/src/bibliography-at.test.ts +286 -0
- package/src/build.test.ts +210 -0
- package/src/build.ts +101 -36
- package/src/claim-provenance.test.ts +33 -7
- package/src/claim-provenance.ts +2 -2
- package/src/cli.harness.mjs +20 -10
- package/src/cli.test.ts +14 -10
- package/src/cli.ts +37 -28
- package/src/domain/paper-source.test.ts +58 -20
- package/src/domain/paper-source.ts +38 -42
- package/src/domain/paper-sources.ts +94 -0
- package/src/domain/sources-record.test.ts +71 -0
- package/src/domain/sources-record.ts +136 -0
- package/src/domain/tex-run.test.ts +228 -0
- package/src/domain/tex-run.ts +139 -0
- package/src/heading-case.test.ts +24 -10
- package/src/latex-log.ts +20 -0
- package/src/latex-loop.harness.ts +1 -0
- package/src/latex-loop.ts +2 -0
- package/src/linted-set.test.ts +9 -1
- package/src/new-paper.harness.mjs +3 -2
- package/src/new-paper.test.ts +9 -5
- package/src/package-dirs.ts +3 -2
- package/src/paper-includes.test.ts +157 -38
- package/src/paper-includes.ts +39 -35
- package/src/paper-prose.test.ts +34 -5
- package/src/paper-prose.ts +2 -2
- package/src/paper-record.test.ts +173 -0
- package/src/paper-record.ts +66 -0
- package/src/paper-settings-commands.test.ts +5 -2
- package/src/paper-sources.ts +151 -0
- package/src/ports/bib-reader.ts +27 -0
- package/src/ports/check-references.ts +7 -3
- package/src/ports/latex.ts +19 -0
- package/src/ports/sources-codec.ts +11 -0
- package/src/ports/tex-output.ts +17 -0
- package/src/recorded-bibliography.ts +297 -0
- package/src/reference-rules.ts +217 -104
- package/src/references.test.ts +520 -177
- package/src/references.ts +185 -37
- package/src/register-bands.test.ts +5 -1
- package/src/register-bands.ts +3 -5
- package/src/register.test.ts +6 -1
- package/src/register.ts +2 -2
- package/src/rule-cases.test.ts +68 -12
- package/src/rule-docs.test.ts +0 -1
- package/src/sources-record.test.ts +308 -0
- package/src/sources-record.ts +231 -0
- package/src/sources-rules.test.ts +152 -0
- package/src/sources-rules.ts +117 -0
- package/src/tex-paper.test.ts +148 -78
- package/src/tex-paper.ts +31 -61
- package/src/tex-requirements.ts +1 -1
- package/src/tex-venue-rules.test.ts +36 -8
- package/src/tex-venue-rules.ts +3 -5
- package/src/toolchain.ts +1 -1
- package/dist/eslint-rules/bib-reachable-entry.d.ts +0 -22
- package/dist/eslint-rules/bib-reachable-entry.d.ts.map +0 -1
- package/dist/eslint-rules/bib-reachable-entry.js +0 -75
- package/dist/eslint-rules/bib-reachable-entry.js.map +0 -1
- package/eslint-rules/bib-reachable-entry.ts +0 -76
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// Compiled to eslint-rules/CLAUDE.md by `npx vigiles compile`. Edit THIS file, never the markdown.
|
|
2
|
+
//
|
|
3
|
+
// The requirements below are held by tests and scripts, not by an ESLint rule `enforce()` could
|
|
4
|
+
// name, so they are prose with verified file references rather than `enforce()` rules.
|
|
5
|
+
import { file, guidance, instructionFile, prose } from "vigiles/spec";
|
|
6
|
+
|
|
7
|
+
export default instructionFile({
|
|
8
|
+
sections: {
|
|
9
|
+
"`eslint-rules/`": prose`The rules this package ships. Loaded when working under \`eslint-rules/\`; the rules for every change
|
|
10
|
+
are in the root \`CLAUDE.md\`. Each requirement below names what holds it; the reasoning lives in
|
|
11
|
+
that file's header.`,
|
|
12
|
+
|
|
13
|
+
"What a new rule ships with, and what holds it": prose`| requirement | held by |
|
|
14
|
+
| --- | --- |
|
|
15
|
+
| **Both halves** (root \`CLAUDE.md\`), for every registered rule | ${file("src/rule-cases.test.ts")} fails on a registered rule with no cases |
|
|
16
|
+
| **One rule, one requirement**: two checks with different reasons to switch them off are two rules | review |
|
|
17
|
+
| **A venue requirement is validated on real accepted papers** of that venue, built to PDF, with the ground truth established independently | review; the papers are in ${file("fixtures/accepted-papers/README.md")} |
|
|
18
|
+
| **Its page**, \`docs/rules/<group>/<rule>.md\`, and \`meta.docs.url\` pointing at it | ${file("src/rule-docs.test.ts")}; its \`AWAITING_PAGE\` list only shrinks |
|
|
19
|
+
| **Loud on an empty input set**: a rule that matched no files must not report like one that passed | ${file("scripts/rules-see-files.mjs")}, per rule and not per glob, in \`npm run check\` |
|
|
20
|
+
|
|
21
|
+
The page's sections: What it catches · Why · Examples (failing / passing) · Options / preset fields ·
|
|
22
|
+
What it does not check · How to fix. Its row in ${file("docs/rules.md")} is one line linking there.`,
|
|
23
|
+
|
|
24
|
+
"A rule that judges prose": prose`A rule, or a skill criterion, that judges a paper's prose is held to five principles. Without them
|
|
25
|
+
the checks push every paper toward a blog post.
|
|
26
|
+
|
|
27
|
+
1. **Two-sided**: a floor as well as a ceiling, or the distance to accepted papers of the target
|
|
28
|
+
venue. A set of ceilings alone converges on clipped, unsignposted prose.
|
|
29
|
+
2. **Rules count, skills judge.** Countable on the parse tree → a lint rule; needs reading (register,
|
|
30
|
+
genre, whether a claim changed strength) → a skill criterion.
|
|
31
|
+
3. **The model reader is the venue's reviewer**, including one who skims the abstract, the
|
|
32
|
+
introduction and the conclusion.
|
|
33
|
+
4. **Thresholds are calibrated, not borrowed**: set with the same counter on the accepted papers,
|
|
34
|
+
never taken from a figure measured by a different counter.
|
|
35
|
+
5. **A rewrite is accepted on what reviewers see**: the combined count of every surface form of a
|
|
36
|
+
tic, plus a check that no claim was softened or strengthened.`,
|
|
37
|
+
},
|
|
38
|
+
rules: {
|
|
39
|
+
"lint-rule-over-script": guidance(
|
|
40
|
+
"A check over a syntax tree is a lint rule, not a script. It fires in the editor on save, gets the AST for free, and has a suppression syntax people already know. A script is for corpus-wide questions — index connectivity, ratios across many files. When the work has to run a program, a script may do the work and write facts to a JSON file, and a rule judges that file: the verdict still lands in the engine.",
|
|
41
|
+
),
|
|
42
|
+
},
|
|
43
|
+
});
|
|
@@ -19,7 +19,7 @@ import markdown from "@eslint/markdown";
|
|
|
19
19
|
import { recordCheck } from "vigiles";
|
|
20
20
|
import port, { PORT } from "./install-path-literals.ts";
|
|
21
21
|
|
|
22
|
-
// Resolved from THIS file, never from the caller's cwd
|
|
22
|
+
// Resolved from THIS file, never from the caller's cwd (root CLAUDE.md), and the mistake this very
|
|
23
23
|
// class of bug is about.
|
|
24
24
|
const HERE = dirname(fileURLToPath(import.meta.url));
|
|
25
25
|
const ROOT = join(HERE, "..");
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* The install-location rule's mechanical half (root CLAUDE.md): nothing outside the port may name a file by WHERE IT IS
|
|
3
3
|
* INSTALLED.
|
|
4
4
|
*
|
|
5
5
|
* The class this exists for has broken this repository five times, silently every time, and
|
|
@@ -47,7 +47,7 @@ const PORT = "skills/paper-pipeline/scripts/consumer.mjs";
|
|
|
47
47
|
const MESSAGES: Readonly<Record<string, string>> = {
|
|
48
48
|
installPath:
|
|
49
49
|
"This names a file by where it is INSTALLED ('{{prefix}}'), so it resolves in one " +
|
|
50
|
-
"delivery channel and does not exist in another.
|
|
50
|
+
"delivery channel and does not exist in another. Every answer to *where* comes " +
|
|
51
51
|
`from the port, ${PORT}. In a skill, use the substitution the harness performs ` +
|
|
52
52
|
"(CLAUDE_SKILL_DIR / CLAUDE_PLUGIN_ROOT); in a module, ask the port.",
|
|
53
53
|
};
|
|
@@ -58,7 +58,7 @@ const mdInstallPath = {
|
|
|
58
58
|
type: "problem" as const,
|
|
59
59
|
docs: {
|
|
60
60
|
description:
|
|
61
|
-
"a skill must not name its scripts by an install-specific path —
|
|
61
|
+
"a skill must not name its scripts by an install-specific path — the port owns where",
|
|
62
62
|
},
|
|
63
63
|
schema: [],
|
|
64
64
|
messages: MESSAGES,
|
|
@@ -81,7 +81,7 @@ const jsInstallPath = {
|
|
|
81
81
|
type: "problem" as const,
|
|
82
82
|
docs: {
|
|
83
83
|
description:
|
|
84
|
-
"a shipped module must not carry an install-specific path literal —
|
|
84
|
+
"a shipped module must not carry an install-specific path literal — the port owns where",
|
|
85
85
|
},
|
|
86
86
|
schema: [],
|
|
87
87
|
messages: MESSAGES,
|
|
@@ -4,9 +4,10 @@
|
|
|
4
4
|
* ESLint lints one file at a time. A paper whose body is in `sections/*.tex` is several files, and
|
|
5
5
|
* two questions are about the paper, not the file: which reference form (`Fig.` or `Figure`) the
|
|
6
6
|
* paper uses most, and whether the build `paper.tex` declares is a review build. The CLI knows the
|
|
7
|
-
* files
|
|
8
|
-
*
|
|
9
|
-
* for `paper.tex` and for every
|
|
7
|
+
* files — the `.tex` files TeX read after `\begin{document}` in the last build, from the record the
|
|
8
|
+
* build wrote (`paperBodies` in src/paper-includes.ts) — and puts them under
|
|
9
|
+
* `settings.paperlint.paper` for `paper.tex` and for every one of them. A rule reads the other files
|
|
10
|
+
* from disk. A paper with no record, or a stale one, is `paper.tex` alone.
|
|
10
11
|
*
|
|
11
12
|
* No setting — a file linted outside `paperlint lint` — means a paper of one file: every rule
|
|
12
13
|
* decides on the file it was handed, as it did before.
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* paper/section-word · paper/leading-zero · paper/figure-ref-style
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
2
|
+
* paper/section-word · paper/leading-zero · paper/figure-ref-style — each FIRES on a bad input,
|
|
3
|
+
* stays SILENT on a good one, reports every occurrence at its own place, and fixes to an exact
|
|
4
|
+
* output. Plus the escape hatch: a disable directive in a `%` comment silences exactly one finding,
|
|
5
|
+
* and a directive that silences nothing is itself reported. (`bib/reachable-entry`, the fourth check
|
|
6
|
+
* of the old `paper/typography`, is tested beside it in src/bib-rules.test.ts.)
|
|
7
7
|
*
|
|
8
8
|
* The leading-zero cases are the ones paperlint#44 measured: a regex over the raw source found 22
|
|
9
9
|
* decimals on a real corpus and none was a defect, so the SILENT list is as load-bearing as the
|
|
@@ -19,7 +19,6 @@ import typography, {
|
|
|
19
19
|
crefDefinitionRanges,
|
|
20
20
|
texVisibleRuns,
|
|
21
21
|
} from "./paper-typography.ts";
|
|
22
|
-
import bib from "./bib-reachable-entry.ts";
|
|
23
22
|
|
|
24
23
|
const HERE = dirname(fileURLToPath(import.meta.url));
|
|
25
24
|
const FIX = join(HERE, "..", "fixtures", "paper-typography");
|
|
@@ -28,7 +27,6 @@ const RULES = {
|
|
|
28
27
|
"paper/section-word": "warn",
|
|
29
28
|
"paper/leading-zero": "warn",
|
|
30
29
|
"paper/figure-ref-style": "warn",
|
|
31
|
-
"bib/reachable-entry": "warn",
|
|
32
30
|
};
|
|
33
31
|
|
|
34
32
|
const eslint = (fix = false) =>
|
|
@@ -42,7 +40,6 @@ const eslint = (fix = false) =>
|
|
|
42
40
|
plugins: {
|
|
43
41
|
tex: { languages: { latex: texLanguage } },
|
|
44
42
|
paper: typography,
|
|
45
|
-
bib,
|
|
46
43
|
},
|
|
47
44
|
language: "tex/latex",
|
|
48
45
|
linterOptions: { reportUnusedDisableDirectives: "error" },
|
|
@@ -74,8 +71,6 @@ describe("the fixtures: messy fires on each rule, clean is silent", () => {
|
|
|
74
71
|
expect(count("paper/section-word")).toBe(3);
|
|
75
72
|
expect(count("paper/leading-zero")).toBe(2);
|
|
76
73
|
expect(count("paper/figure-ref-style")).toBe(1);
|
|
77
|
-
expect(count("bib/reachable-entry")).toBe(2);
|
|
78
|
-
expect(ids(res, "bib/reachable-entry").map((m) => m.line)).toEqual([3, 8]);
|
|
79
74
|
});
|
|
80
75
|
|
|
81
76
|
it("clean-paper — nothing", async () => {
|
|
@@ -110,6 +105,13 @@ describe("paper/section-word", () => {
|
|
|
110
105
|
expect(ids(await lint(src), "paper/section-word")).toEqual([]);
|
|
111
106
|
});
|
|
112
107
|
|
|
108
|
+
it("🔴 silent on a bibliography whose file name stands on the line after \\begin{filecontents*}", async () => {
|
|
109
|
+
const src =
|
|
110
|
+
"\\documentclass{acmart}\n\\begin{filecontents*}\n{refs.bib}\n@misc{k, note = {see §5}, url = {https://x.org}}\n\\end{filecontents*}\n" +
|
|
111
|
+
"\\begin{document}\nSection~\\ref{a}.\n\\end{document}\n";
|
|
112
|
+
expect(ids(await lint(src), "paper/section-word")).toEqual([]);
|
|
113
|
+
});
|
|
114
|
+
|
|
113
115
|
it("🔴 a cleveref name definition is not prose: silent, and --fix leaves it as written", async () => {
|
|
114
116
|
const src =
|
|
115
117
|
"\\documentclass{article}\n\\usepackage{cleveref}\n\\crefname{section}{§}{§§}\n\\Crefname{section}{§}{§§}\n" +
|
|
@@ -296,69 +298,7 @@ describe("paper/figure-ref-style", () => {
|
|
|
296
298
|
});
|
|
297
299
|
});
|
|
298
300
|
|
|
299
|
-
describe("bib/reachable-entry", () => {
|
|
300
|
-
const bibDoc = (entries) =>
|
|
301
|
-
`\\documentclass{acmart}\n\\begin{filecontents*}{refs.bib}\n${entries}\n\\end{filecontents*}\n\\begin{document}\nx\n\\end{document}\n`;
|
|
302
|
-
|
|
303
|
-
it("a doi, a url or an arXiv id each make an entry reachable", async () => {
|
|
304
|
-
const res = await lint(
|
|
305
|
-
bibDoc(
|
|
306
|
-
"@article{a, doi = {10.1/x}}\n@misc{b, url = {https://x.org}}\n@misc{c, note = {arXiv:2310.05736}}\n@string{v = {x}}",
|
|
307
|
-
),
|
|
308
|
-
);
|
|
309
|
-
expect(ids(res, "bib/reachable-entry")).toEqual([]);
|
|
310
|
-
});
|
|
311
|
-
|
|
312
|
-
it("reports on the entry itself, naming its key", async () => {
|
|
313
|
-
const res = await lint(
|
|
314
|
-
bibDoc("@misc{ok, url = {https://x.org}}\n@article{lost, title = {x}}"),
|
|
315
|
-
);
|
|
316
|
-
const [m] = ids(res, "bib/reachable-entry");
|
|
317
|
-
expect(m.line).toBe(4);
|
|
318
|
-
expect(m.column).toBe(1);
|
|
319
|
-
expect(m.message).toMatch(/`lost`/);
|
|
320
|
-
});
|
|
321
|
-
|
|
322
|
-
it("an entry with no key is reported as `?`, not skipped", async () => {
|
|
323
|
-
const [m] = ids(
|
|
324
|
-
await lint(bibDoc("@article{\n title = {x}}")),
|
|
325
|
-
"bib/reachable-entry",
|
|
326
|
-
);
|
|
327
|
-
expect(m.message).toMatch(/`\?`/);
|
|
328
|
-
});
|
|
329
|
-
|
|
330
|
-
it("a source code with only `text`, or with neither text nor raw", () => {
|
|
331
|
-
const run = (sourceCode) => {
|
|
332
|
-
const out = [];
|
|
333
|
-
bib.rules["reachable-entry"]
|
|
334
|
-
.create({
|
|
335
|
-
sourceCode: {
|
|
336
|
-
getLocFromIndex: (i) => ({ line: 1, column: i }),
|
|
337
|
-
...sourceCode,
|
|
338
|
-
},
|
|
339
|
-
report: (r) => out.push(r.data.key),
|
|
340
|
-
})
|
|
341
|
-
["root:exit"]();
|
|
342
|
-
return out;
|
|
343
|
-
};
|
|
344
|
-
expect(run({ text: bibDoc("@article{t, title = {x}}") })).toEqual(["t"]);
|
|
345
|
-
expect(run({})).toEqual([]);
|
|
346
|
-
});
|
|
347
|
-
});
|
|
348
|
-
|
|
349
301
|
describe("the escape hatch — a disable directive in a `%` comment", () => {
|
|
350
|
-
it("🔴 inside the filecontents bibliography, it silences exactly the next entry", async () => {
|
|
351
|
-
const res = await lint(
|
|
352
|
-
`\\documentclass{acmart}\n\\begin{filecontents*}{refs.bib}\n` +
|
|
353
|
-
"% eslint-disable-next-line bib/reachable-entry -- an invited talk, no recording exists\n" +
|
|
354
|
-
"@misc{talk, title = {x}}\n@misc{lost, title = {y}}\n" +
|
|
355
|
-
"\\end{filecontents*}\n\\begin{document}\nx\n\\end{document}\n",
|
|
356
|
-
);
|
|
357
|
-
const found = ids(res, "bib/reachable-entry");
|
|
358
|
-
expect(found).toHaveLength(1);
|
|
359
|
-
expect(found[0].message).toMatch(/`lost`/);
|
|
360
|
-
});
|
|
361
|
-
|
|
362
302
|
it("in the body: next-line, same-line, and a disable/enable region", async () => {
|
|
363
303
|
const src = doc(
|
|
364
304
|
[
|
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
* paper/figure-ref-style `Fig.~\ref` beside `Figure~\ref` in one document → the majority form
|
|
8
8
|
*
|
|
9
9
|
* The fourth check of the old `paper/typography`, an unreachable bibliography entry, is
|
|
10
|
-
* `bib/reachable-entry` (bib-
|
|
11
|
-
*
|
|
10
|
+
* `bib/reachable-entry` (src/bib-rules.ts): it is about the bibliography, not the prose, and it has
|
|
11
|
+
* no fix.
|
|
12
12
|
*
|
|
13
13
|
* ── PROVENANCE: every one is a real review finding, not an invented style ───────────────
|
|
14
14
|
* From HotCRP #20 (2026-08-23). Reviewer B listed two as literal to-dos:
|
|
@@ -75,7 +75,7 @@ import type {
|
|
|
75
75
|
} from "./rule-context.ts";
|
|
76
76
|
|
|
77
77
|
/** Where a `.bib` embedded in a `filecontents` environment sits in the file. */
|
|
78
|
-
|
|
78
|
+
interface BibRange {
|
|
79
79
|
readonly start: number;
|
|
80
80
|
readonly end: number;
|
|
81
81
|
readonly bodyStart: number;
|
|
@@ -91,10 +91,17 @@ interface Run {
|
|
|
91
91
|
offs: (number | null)[];
|
|
92
92
|
}
|
|
93
93
|
|
|
94
|
-
/**
|
|
95
|
-
|
|
94
|
+
/**
|
|
95
|
+
* The inline bibliography — a `filecontents` block writing a `.bib`, its name on the `\begin` line or
|
|
96
|
+
* after white space on a later one, as TeX takes it — with its offsets: the span the markup rules
|
|
97
|
+
* skip. Which bibliography TeX reads is the build's record (`_build/sources.json`,
|
|
98
|
+
* docs/design/paper-sources.md §1);
|
|
99
|
+
* this range only says which bytes are not prose, and moves onto the one projection of live text
|
|
100
|
+
* with the rest of `skippedRanges` (Q3, docs/design/paper-sources.md §10).
|
|
101
|
+
*/
|
|
102
|
+
function bibRange(text: string): BibRange | null {
|
|
96
103
|
const m =
|
|
97
|
-
/\\begin\{filecontents\*?\}(?:\[[^\]]*\])?\{[^}]*\.bib\}
|
|
104
|
+
/\\begin\{filecontents\*?\}\s*(?:\[[^\]]*\]\s*)?\{[^}]*\.bib\}[^\n]*\n([\s\S]*?)\\end\{filecontents\*?\}/d.exec(
|
|
98
105
|
text,
|
|
99
106
|
);
|
|
100
107
|
if (!m) return null;
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* { "rules": { "pdf/last-page-balance": ["error", { "tolerancePt": 120 }] } }
|
|
12
12
|
*
|
|
13
13
|
* (That is a line comment's worth of JSON in a block comment only because it has no asterisk
|
|
14
|
-
* followed by a slash; see rule
|
|
14
|
+
* followed by a slash; see the block-comment rule in the root CLAUDE.md before editing it.)
|
|
15
15
|
*
|
|
16
16
|
* ── WHAT IT READS: THE FACTS THE BUILD WROTE, NOT THE PDF ───────────────────────
|
|
17
17
|
* `paperlint build` measures the PDF with pdf.js and writes `<paper>/_build/paper.facts.json`. This rule
|
package/eslint.config.mjs
CHANGED
|
@@ -250,6 +250,9 @@ const ROOT = { file: { categories: "root" } };
|
|
|
250
250
|
*/
|
|
251
251
|
export const layerBoundaries = (root) => ({
|
|
252
252
|
files: ["src/**/*.ts"],
|
|
253
|
+
// The source of src/CLAUDE.md sits beside it because `vigiles compile` requires that; it is an
|
|
254
|
+
// instruction file, not a layer of the package.
|
|
255
|
+
ignores: ["src/CLAUDE.md.spec.ts"],
|
|
253
256
|
plugins: { boundaries },
|
|
254
257
|
settings: {
|
|
255
258
|
"boundaries/root-path": root,
|
|
@@ -681,7 +684,7 @@ export default [
|
|
|
681
684
|
languageOptions: { ecmaVersion: 2024, sourceType: "module" },
|
|
682
685
|
plugins: { local: localRules, port: portRules },
|
|
683
686
|
rules: {
|
|
684
|
-
//
|
|
687
|
+
// The install-location rule's mechanical half (root CLAUDE.md), code side. `warn` and not `error`, unlike its neighbour
|
|
685
688
|
// above: this one does NOT open on a clean corpus. Two shipped modules print a command
|
|
686
689
|
// for a human that names an install-specific path, and neither is fixable by the
|
|
687
690
|
// answer the skills get — a printed command has to be resolved through the port at
|
|
@@ -741,7 +744,7 @@ export default [
|
|
|
741
744
|
rules: { "n/no-missing-import": "error" },
|
|
742
745
|
},
|
|
743
746
|
/**
|
|
744
|
-
*
|
|
747
|
+
* The install-location rule's mechanical half (root CLAUDE.md), prose side — and this is where the debt actually is: 76
|
|
745
748
|
* findings across 29 skills on a healthy checkout, every one of them a command that
|
|
746
749
|
* resolves in one delivery channel and is absent in another.
|
|
747
750
|
*
|
|
@@ -789,7 +792,7 @@ export default [
|
|
|
789
792
|
// ⚠️ `npx eslint .` therefore reports six warnings on a healthy checkout: the four defect
|
|
790
793
|
// fixtures are DEFECTIVE ON PURPOSE, and that is what makes the fire half of every harness
|
|
791
794
|
// real. Do not silence them by adding an ignore — a rule that lints only clean inputs is
|
|
792
|
-
// one whose firing path nothing exercises, which is
|
|
795
|
+
// one whose firing path nothing exercises, which is the green zero of scripts/rules-see-files.mjs wearing a different hat. The
|
|
793
796
|
// pass/fail signal lives in `npm test`, not in the warning count of `npm run lint`.
|
|
794
797
|
},
|
|
795
798
|
{
|
|
@@ -798,6 +801,28 @@ export default [
|
|
|
798
801
|
"no-restricted-imports": ["error", { paths: ONE_COLLECTION_LIBRARY }],
|
|
799
802
|
},
|
|
800
803
|
},
|
|
804
|
+
// 🔴 ONE PLACE READS BIBLIOGRAPHIES. `@retorquere/bibtex-parser` is known to its adapter only;
|
|
805
|
+
// every other file — the app, the domain, another adapter, a skill's script — reads a `.bib` through
|
|
806
|
+
// the `BibReader` port, and a path a person gave through `bibliographyAt` (src/paper-sources.ts).
|
|
807
|
+
// Three readers of `.bib` text grew here before there was one. Its own rule id, so no other
|
|
808
|
+
// `no-restricted-imports` block can replace it (test/eslint-bib-parser.test.ts).
|
|
809
|
+
{
|
|
810
|
+
files: ["**/*.{ts,mts,mjs,js,cjs}"],
|
|
811
|
+
ignores: ["src/adapters/bibtex/**"],
|
|
812
|
+
plugins: { n },
|
|
813
|
+
rules: {
|
|
814
|
+
"n/no-restricted-import": [
|
|
815
|
+
"error",
|
|
816
|
+
[
|
|
817
|
+
{
|
|
818
|
+
name: ["@retorquere/bibtex-parser", "@retorquere/bibtex-parser/**"],
|
|
819
|
+
message:
|
|
820
|
+
"The bibtex parser is src/adapters/bibtex/'s: read a .bib through the BibReader port (src/ports/bib-reader.ts), or a path through bibliographyAt (src/paper-sources.ts).",
|
|
821
|
+
},
|
|
822
|
+
],
|
|
823
|
+
],
|
|
824
|
+
},
|
|
825
|
+
},
|
|
801
826
|
// 🔴 THE LINTER DOES NOT READ A SKILL. Skills are consumers of the package, not its storage: the
|
|
802
827
|
// venue presets once lived in a skill and were located through a skill's script, so renaming the
|
|
803
828
|
// skill broke `paperlint lint` (#133). The package's own code — src/, eslint-rules/, lib/ — may
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
% rule is judged against what a real build of the class measures. It conforms: the LLM Usage
|
|
4
4
|
% Statement closes it, and not one rule has anything to say.
|
|
5
5
|
\documentclass[conference,compsoc]{IEEEtran}
|
|
6
|
-
\begin{filecontents*}{refs.bib}
|
|
6
|
+
\begin{filecontents*}[overwrite]{refs.bib}
|
|
7
7
|
@article{knuth84,
|
|
8
8
|
title = {Literate Programming},
|
|
9
9
|
author = {Knuth, Donald E.},
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
% B: the name in an acknowledgments paragraph.
|
|
2
2
|
% The declared identity is invented: "Ada Example", handle "adaexample" (paperlint.json).
|
|
3
3
|
\documentclass[conference,compsoc]{IEEEtran}
|
|
4
|
-
\begin{filecontents*}{refs.bib}
|
|
4
|
+
\begin{filecontents*}[overwrite]{refs.bib}
|
|
5
5
|
@article{knuth84,
|
|
6
6
|
title = {Literate Programming},
|
|
7
7
|
author = {Knuth, Donald E.},
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
% A: the name in the author block.
|
|
2
2
|
% The declared identity is invented: "Ada Example", handle "adaexample" (paperlint.json).
|
|
3
3
|
\documentclass[conference,compsoc]{IEEEtran}
|
|
4
|
-
\begin{filecontents*}{refs.bib}
|
|
4
|
+
\begin{filecontents*}[overwrite]{refs.bib}
|
|
5
5
|
@article{knuth84,
|
|
6
6
|
title = {Literate Programming},
|
|
7
7
|
author = {Knuth, Donald E.},
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
% C: a self-citation: the name only in a .bib author field, printed by IEEEtran.bst as "A. Example".
|
|
2
2
|
% The declared identity is invented: "Ada Example", handle "adaexample" (paperlint.json).
|
|
3
3
|
\documentclass[conference,compsoc]{IEEEtran}
|
|
4
|
-
\begin{filecontents*}{refs.bib}
|
|
4
|
+
\begin{filecontents*}[overwrite]{refs.bib}
|
|
5
5
|
@article{knuth84,
|
|
6
6
|
title = {Literate Programming},
|
|
7
7
|
author = {Knuth, Donald E.},
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
% The declared identity is invented: "Ada Example", handle "adaexample" (paperlint.json).
|
|
3
3
|
\documentclass[conference,compsoc]{IEEEtran}
|
|
4
4
|
\usepackage{hyperref}
|
|
5
|
-
\begin{filecontents*}{refs.bib}
|
|
5
|
+
\begin{filecontents*}[overwrite]{refs.bib}
|
|
6
6
|
@article{knuth84,
|
|
7
7
|
title = {Literate Programming},
|
|
8
8
|
author = {Knuth, Donald E.},
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
% The declared identity is invented: "Ada Example", handle "adaexample" (paperlint.json).
|
|
3
3
|
\documentclass[conference,compsoc]{IEEEtran}
|
|
4
4
|
\newcommand{\me}{Ada Example}
|
|
5
|
-
\begin{filecontents*}{refs.bib}
|
|
5
|
+
\begin{filecontents*}[overwrite]{refs.bib}
|
|
6
6
|
@article{knuth84,
|
|
7
7
|
title = {Literate Programming},
|
|
8
8
|
author = {Knuth, Donald E.},
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
\documentclass[conference,compsoc]{IEEEtran}
|
|
4
4
|
\usepackage{hyperref}
|
|
5
5
|
\hypersetup{pdfauthor={Ada Example}}
|
|
6
|
-
\begin{filecontents*}{refs.bib}
|
|
6
|
+
\begin{filecontents*}[overwrite]{refs.bib}
|
|
7
7
|
@article{knuth84,
|
|
8
8
|
title = {Literate Programming},
|
|
9
9
|
author = {Knuth, Donald E.},
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
\documentclass{article}
|
|
2
|
+
\begin{filecontents*}{refs.bib}
|
|
3
|
+
@misc{inline2024,
|
|
4
|
+
title = {The Inline Entry},
|
|
5
|
+
author = {Doe, Jane},
|
|
6
|
+
year = {2024},
|
|
7
|
+
url = {https://example.org/inline}
|
|
8
|
+
}
|
|
9
|
+
\end{filecontents*}
|
|
10
|
+
\begin{document}
|
|
11
|
+
\section{Introduction}
|
|
12
|
+
We cite the inline entry~\cite{inline2024} and the stale one~\cite{stale2020}.
|
|
13
|
+
% We cite~\cite{commented2020}. The harness will be released at camera-ready.
|
|
14
|
+
\input{sections/intro}
|
|
15
|
+
% \input{sections/dead}
|
|
16
|
+
\iffalse
|
|
17
|
+
\input{sections/parked}
|
|
18
|
+
\begin{figure}[t]
|
|
19
|
+
\caption{Parked caption this sentence keeps going with ordinary words so that it reaches the length a long caption has in a real paper and then it keeps going a little longer still until the count is right this sentence keeps going with ordinary words so that it reaches the length a long caption has in a real.}
|
|
20
|
+
\end{figure}
|
|
21
|
+
The harness will be released at camera-ready.
|
|
22
|
+
\fi
|
|
23
|
+
\begin{figure}[t]
|
|
24
|
+
\centering
|
|
25
|
+
\fbox{x}
|
|
26
|
+
\caption[Short]{Optional-arg caption this sentence keeps going with ordinary words so that it reaches the length a long caption has in a real paper and then it keeps going a little longer still until the count is right this sentence keeps going with ordinary words so that it reaches the length a long caption has in a real.}
|
|
27
|
+
\end{figure}
|
|
28
|
+
\bibliographystyle{plain}
|
|
29
|
+
\bibliography{refs}
|
|
30
|
+
\end{document}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
\section{Dead section}
|
|
2
|
+
\begin{figure}[t]
|
|
3
|
+
\centering
|
|
4
|
+
\fbox{z}
|
|
5
|
+
\caption{Dead caption this sentence keeps going with ordinary words so that it reaches the length a long caption has in a real paper and then it keeps going a little longer still until the count is right this sentence keeps going with ordinary words so that it reaches the length a long caption has in a real.}
|
|
6
|
+
\end{figure}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
\section{Results}
|
|
2
|
+
We release the harness with this paper. It cuts the cost by 42\% on the benchmark.
|
|
3
|
+
\begin{figure}[t]
|
|
4
|
+
\centering
|
|
5
|
+
\fbox{y}
|
|
6
|
+
\caption{Included caption this sentence keeps going with ordinary words so that it reaches the length a long caption has in a real paper and then it keeps going a little longer still until the count is right this sentence keeps going with ordinary words so that it reaches the length a long caption has in a real.}
|
|
7
|
+
\end{figure}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
\section{Parked section}
|
|
2
|
+
\begin{figure}[t]
|
|
3
|
+
\centering
|
|
4
|
+
\fbox{z}
|
|
5
|
+
\caption{Parked caption this sentence keeps going with ordinary words so that it reaches the length a long caption has in a real paper and then it keeps going a little longer still until the count is right this sentence keeps going with ordinary words so that it reaches the length a long caption has in a real.}
|
|
6
|
+
\end{figure}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": 1,
|
|
3
|
+
"inputs": [
|
|
4
|
+
{
|
|
5
|
+
"path": "paper.tex",
|
|
6
|
+
"role": "body"
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
"path": "refs.bib",
|
|
10
|
+
"role": "preamble"
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"path": "sections/intro.tex",
|
|
14
|
+
"role": "body"
|
|
15
|
+
}
|
|
16
|
+
],
|
|
17
|
+
"written": [],
|
|
18
|
+
"bibdata": [
|
|
19
|
+
"refs"
|
|
20
|
+
],
|
|
21
|
+
"bibtex": {
|
|
22
|
+
"ran": true,
|
|
23
|
+
"databases": [
|
|
24
|
+
"refs.bib"
|
|
25
|
+
],
|
|
26
|
+
"keys": [
|
|
27
|
+
"stale2020"
|
|
28
|
+
],
|
|
29
|
+
"exit": 0,
|
|
30
|
+
"errors": []
|
|
31
|
+
},
|
|
32
|
+
"sha256": {
|
|
33
|
+
"paper.tex": "52ab53ff01ae6dee061f4f674764dc5f5e38f8f6710a3b1c418b1bf07cb46196",
|
|
34
|
+
"refs.bib": "7a720777755f3dd727c2428f66f06d5f818f367e41fe4c47543aa9f55adfebb4",
|
|
35
|
+
"sections/intro.tex": "bf7cdcd18d243940cc13a9a9281b7a61446a693f3a49fbd551a69f8a87a98f89"
|
|
36
|
+
}
|
|
37
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
\documentclass{article}
|
|
2
|
+
\begin{filecontents*}{refs.bib}
|
|
3
|
+
@misc{inline2024,
|
|
4
|
+
title = {The Inline Entry},
|
|
5
|
+
author = {Doe, Jane},
|
|
6
|
+
year = {2024},
|
|
7
|
+
url = {https://example.org/inline}
|
|
8
|
+
}
|
|
9
|
+
\end{filecontents*}
|
|
10
|
+
\begin{document}
|
|
11
|
+
Text that cites~\cite{inline2024} and~\cite{stale2020}.
|
|
12
|
+
\bibliographystyle{plain}
|
|
13
|
+
\bibliography{refs}
|
|
14
|
+
\end{document}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": 1,
|
|
3
|
+
"inputs": [
|
|
4
|
+
{
|
|
5
|
+
"path": "paper.tex",
|
|
6
|
+
"role": "body"
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
"path": "refs.bib",
|
|
10
|
+
"role": "preamble"
|
|
11
|
+
}
|
|
12
|
+
],
|
|
13
|
+
"written": [],
|
|
14
|
+
"bibdata": [
|
|
15
|
+
"refs"
|
|
16
|
+
],
|
|
17
|
+
"bibtex": {
|
|
18
|
+
"ran": true,
|
|
19
|
+
"databases": [
|
|
20
|
+
"refs.bib"
|
|
21
|
+
],
|
|
22
|
+
"keys": [
|
|
23
|
+
"stale2020"
|
|
24
|
+
],
|
|
25
|
+
"exit": 0,
|
|
26
|
+
"errors": []
|
|
27
|
+
},
|
|
28
|
+
"sha256": {
|
|
29
|
+
"paper.tex": "54f0abc51bdc3df728907c7d4bcc90af43b0e3678d6e2ab1fa4c817a2c20f29d",
|
|
30
|
+
"refs.bib": "7a720777755f3dd727c2428f66f06d5f818f367e41fe4c47543aa9f55adfebb4"
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@misc{anonkey, title={Anon}, author={A, B}, year={2020}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@misc{realkey, title={Real}, author={A, B}, year={2020}}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": 1,
|
|
3
|
+
"inputs": [
|
|
4
|
+
{
|
|
5
|
+
"path": "paper.tex",
|
|
6
|
+
"role": "body"
|
|
7
|
+
}
|
|
8
|
+
],
|
|
9
|
+
"written": [],
|
|
10
|
+
"bibdata": [
|
|
11
|
+
"anon"
|
|
12
|
+
],
|
|
13
|
+
"bibtex": {
|
|
14
|
+
"ran": true,
|
|
15
|
+
"databases": [
|
|
16
|
+
"anon.bib"
|
|
17
|
+
],
|
|
18
|
+
"keys": [
|
|
19
|
+
"anonkey"
|
|
20
|
+
],
|
|
21
|
+
"exit": 0,
|
|
22
|
+
"errors": []
|
|
23
|
+
},
|
|
24
|
+
"sha256": {
|
|
25
|
+
"paper.tex": "33fd7452738f9968e48e6f454b21338a79c6d236597bf2be0e8e128db1452aad",
|
|
26
|
+
"anon.bib": "e56856cc2aa71a1277cdee0b941843de7e64216a47690d62850ca657835232d4"
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
\documentclass{article}
|
|
2
|
+
\begin{filecontents*}{refs.bib}
|
|
3
|
+
@misc{first, title={First}, author={A, B}, year={2020}}
|
|
4
|
+
\end{filecontents*}
|
|
5
|
+
\begin{filecontents*}[overwrite]{refs.bib}
|
|
6
|
+
@misc{second, title={Second}, author={A, B}, year={2020}}
|
|
7
|
+
\end{filecontents*}
|
|
8
|
+
\begin{document}
|
|
9
|
+
\nocite{*}
|
|
10
|
+
\bibliographystyle{plain}
|
|
11
|
+
\bibliography{refs}
|
|
12
|
+
\end{document}
|