paperlint 7.2.0 → 9.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +9 -25
- package/CONTRIBUTING.md +5 -4
- package/README.md +4 -3
- 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 -30
- package/dist/build.js.map +1 -1
- package/dist/claim-provenance.d.ts +2 -2
- package/dist/cli.d.ts +9 -5
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +43 -68
- 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/latex-language.d.ts.map +1 -1
- package/dist/eslint-rules/latex-language.js +10 -13
- package/dist/eslint-rules/latex-language.js.map +1 -1
- package/dist/eslint-rules/paper-context.d.ts.map +1 -1
- package/dist/eslint-rules/paper-context.js +6 -5
- 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 +34 -96
- package/dist/eslint-rules/paper-typography.js.map +1 -1
- package/dist/eslint-rules/papers.d.ts +1 -3
- package/dist/eslint-rules/papers.d.ts.map +1 -1
- package/dist/eslint-rules/papers.js +2 -4
- package/dist/eslint-rules/papers.js.map +1 -1
- package/dist/eslint-rules/tex-build.d.ts.map +1 -1
- package/dist/eslint-rules/tex-build.js +8 -25
- package/dist/eslint-rules/tex-build.js.map +1 -1
- package/dist/init.d.ts +1 -4
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +3 -9
- package/dist/init.js.map +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/markdown.d.ts +5 -81
- package/dist/lib/markdown.d.ts.map +1 -1
- package/dist/lib/markdown.js +5 -116
- package/dist/lib/markdown.js.map +1 -1
- package/dist/lib/paper-config.d.ts.map +1 -1
- package/dist/lib/paper-config.js +0 -2
- package/dist/lib/paper-config.js.map +1 -1
- package/dist/lib/skill-eval-fixture.d.ts +6 -4
- package/dist/lib/skill-eval-fixture.d.ts.map +1 -1
- package/dist/lib/skill-eval-fixture.js +25 -18
- package/dist/lib/skill-eval-fixture.js.map +1 -1
- package/dist/new-paper.d.ts +5 -11
- package/dist/new-paper.d.ts.map +1 -1
- package/dist/new-paper.js +12 -23
- package/dist/new-paper.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-files.d.ts +4 -4
- 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 +17 -0
- package/dist/paper-prose.d.ts.map +1 -0
- package/dist/paper-prose.js +46 -0
- package/dist/paper-prose.js.map +1 -0
- 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/structure.d.ts.map +1 -1
- package/dist/structure.js +4 -3
- package/dist/structure.js.map +1 -1
- 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-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/types.d.ts +0 -2
- package/dist/types.d.ts.map +1 -1
- package/docs/configuration.md +18 -12
- package/docs/design/paper-sources.md +197 -0
- package/docs/e2e.md +4 -6
- package/docs/package-shape-options.md +1 -1
- package/docs/prior-art/paper-folder-scaffolding.md +24 -29
- 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/tex/claim-provenance.md +0 -1
- package/docs/rules.md +62 -61
- package/eslint-rules/latex-language.harness.mjs +3 -3
- package/eslint-rules/latex-language.ts +10 -13
- package/eslint-rules/paper-context.ts +6 -5
- package/eslint-rules/paper-typography.test.mjs +29 -157
- package/eslint-rules/paper-typography.ts +35 -104
- package/eslint-rules/papers.harness.mjs +1 -1
- package/eslint-rules/papers.ts +2 -4
- package/eslint-rules/tex-build.harness.mjs +2 -2
- package/eslint-rules/tex-build.ts +8 -25
- package/eslint.config.mjs +22 -1
- 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/hooks.harness.ts +15 -15
- package/hooks/paper-edit-guard.hook.mjs +5 -8
- package/hooks/paper-edit-guard.test.ts +12 -3
- package/hooks/paper-skills-nudge.hook.mjs +2 -3
- package/hooks/paper-skills-nudge.test.ts +13 -3
- package/hooks/paper-status-gates.hook.mjs +2 -2
- package/hooks/paper-status-gates.test.ts +14 -2
- package/lib/markdown.test.mjs +5 -60
- package/lib/markdown.ts +9 -136
- package/lib/paper-config.ts +0 -2
- package/lib/skill-checks.test.mjs +4 -1
- package/lib/skill-eval-fixture.ts +25 -18
- package/package.json +2 -12
- package/presets/realm.jsonc +1 -1
- package/scripts/check.test.ts +23 -1
- package/scripts/check.ts +7 -3
- package/scripts/coverage-config.test.ts +19 -10
- package/scripts/harness-api.frozen.json +0 -5
- package/scripts/layer-legacy-frozen.test.ts +41 -2
- package/scripts/layer-legacy-frozen.ts +31 -2
- package/skills/cold-read-diff/SKILL.md +3 -3
- package/skills/cold-read-diff/SKILL.md.spec.ts +2 -2
- package/skills/grade-paper-writing/SKILL.md +15 -22
- package/skills/grade-paper-writing/SKILL.md.spec.ts +14 -21
- package/skills/grade-paper-writing/__snapshots__/prose-lint.test.ts.snap +40 -26
- package/skills/grade-paper-writing/prose-lint.mjs +117 -278
- package/skills/grade-paper-writing/prose-lint.test.ts +230 -79
- package/skills/paper-adversarial-review/SKILL.md +2 -2
- package/skills/paper-adversarial-review/SKILL.md.spec.ts +1 -1
- package/skills/paper-pipeline/SKILL.md +9 -12
- package/skills/paper-pipeline/SKILL.md.spec.ts +8 -11
- package/skills/paper-pipeline/description-language.eval.mjs +25 -15
- package/skills/paper-pipeline/framing-vs-vocabulary.eval.mjs +25 -15
- package/skills/paper-pipeline/grade-paper-writing-ablation.eval.mjs +25 -15
- package/skills/paper-pipeline/pipeline-firing.eval.mjs +27 -16
- package/skills/paper-pipeline/pipeline-language.eval.mjs +25 -15
- package/skills/paper-pipeline/references/acceptance-gate.md +16 -20
- package/skills/paper-pipeline/references/artifact-checklist.md +4 -5
- package/skills/paper-pipeline/references/pipeline-status-template.md +1 -1
- package/skills/paper-pipeline/scripts/README.md +0 -4
- package/skills/paper-pipeline/scripts/extract-ref-facts.harness.mjs +91 -105
- package/skills/paper-pipeline/scripts/extract-ref-facts.mjs +85 -241
- package/skills/paper-pipeline/scripts/extract-ref-facts.test.mjs +166 -153
- package/skills/paper-pipeline/scripts/generated-code.harness.mjs +3 -3
- package/skills/paper-status/SKILL.md +2 -2
- package/skills/paper-status/SKILL.md.spec.ts +1 -1
- package/skills/render-paper/SKILL.md +2 -2
- package/skills/render-paper/SKILL.md.spec.ts +1 -1
- package/skills/render-paper/extract-pdf-facts.mjs +2 -2
- package/skills/tighten-paper/SKILL.md +29 -42
- package/skills/tighten-paper/SKILL.md.spec.ts +28 -41
- 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 -32
- package/skills/verify-citations/scripts/bib-authors.cli.test.ts +138 -43
- package/skills/verify-citations/scripts/bib-authors.d.mts +22 -2
- package/skills/verify-citations/scripts/bib-authors.mjs +54 -193
- package/skills/verify-citations/scripts/bib-authors.test.mjs +1 -44
- 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/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.harness.mjs +2 -2
- package/src/build.test.ts +211 -1
- package/src/build.ts +101 -41
- package/src/claim-provenance.test.ts +33 -7
- package/src/claim-provenance.ts +2 -2
- package/src/cli.harness.mjs +46 -56
- package/src/cli.test.ts +44 -48
- package/src/cli.ts +51 -82
- 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/folder-venue-rule.test.ts +1 -1
- package/src/heading-case.test.ts +24 -10
- package/src/init.test.ts +6 -7
- package/src/init.ts +3 -22
- package/src/latex-log.ts +20 -0
- package/src/latex-loop.harness.ts +1 -0
- package/src/latex-loop.ts +2 -0
- package/src/lint-fix.test.ts +10 -4
- package/src/linted-set.test.ts +9 -1
- package/src/new-paper.harness.mjs +12 -30
- package/src/new-paper.test.ts +15 -11
- package/src/new-paper.ts +11 -30
- package/src/package-dirs.ts +3 -2
- package/src/paper-files.test.ts +5 -4
- package/src/paper-files.ts +4 -4
- package/src/paper-includes.test.ts +157 -38
- package/src/paper-includes.ts +39 -35
- package/src/paper-prose.test.ts +78 -0
- package/src/paper-prose.ts +67 -0
- 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/parse-args.test.ts +0 -1
- 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/structure.harness.ts +5 -11
- package/src/structure.ts +4 -3
- package/src/tex-paper.test.ts +148 -78
- package/src/tex-paper.ts +31 -61
- package/src/tex-venue-rules.test.ts +36 -8
- package/src/tex-venue-rules.ts +3 -5
- package/src/types.ts +0 -2
- 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
- package/fixtures/real-markdown-paper/baseline.json +0 -22
- package/fixtures/real-markdown-paper/baseline.ts +0 -70
- package/skills/paper-pipeline/PIPELINE-MAP.md +0 -381
- package/skills/paper-pipeline/pipeline-firing.baseline.json +0 -270
- package/skills/paper-pipeline/references/sweep-2026-08-09-ideal-pipeline.md +0 -585
- package/skills/paper-pipeline/scripts/artifact-coverage.harness.mjs +0 -492
- package/skills/paper-pipeline/scripts/artifact-coverage.mjs +0 -397
- package/skills/paper-pipeline/scripts/artifact-coverage.test.ts +0 -86
- package/skills/paper-pipeline/scripts/check-provenance.mjs +0 -184
- package/skills/paper-pipeline/scripts/population-map.harness.mjs +0 -135
- package/skills/paper-pipeline/scripts/population-map.mjs +0 -188
- package/skills/paper-pipeline/scripts/population-map.test.mjs +0 -154
- package/skills/paper-pipeline/scripts/provenance.harness.mjs +0 -266
- package/skills/paper-pipeline/scripts/round-diff.harness.ts +0 -907
- package/skills/paper-pipeline/scripts/round-diff.mjs +0 -583
- package/skills/paper-pipeline/scripts/round-diff.test.mjs +0 -159
- package/skills/tighten-paper/__snapshots__/structure.test.ts.snap +0 -133
- package/skills/tighten-paper/structure.mjs +0 -364
- package/skills/tighten-paper/structure.test.ts +0 -117
- package/templates/paper/paper.md +0 -4
|
@@ -10,19 +10,21 @@
|
|
|
10
10
|
* and the zero was an artifact of the empty directory, not a fact about the skill.
|
|
11
11
|
*
|
|
12
12
|
* Extracted from `paper-pipeline/pipeline-firing.eval.mjs`, which had it right
|
|
13
|
-
* from the start
|
|
13
|
+
* from the start; the `paper-pipeline/*.eval.mjs` experiments carry the same
|
|
14
|
+
* block, byte for byte.
|
|
14
15
|
*
|
|
15
16
|
* ⚠️ AND THE PRICE, so this file is not a one-sided story (measured 2026-08-12).
|
|
16
17
|
* With a fixture present the model OPENS THE PAPER and looks around, so the number
|
|
17
18
|
* stops being "did the DESCRIPTION fire" and becomes "did the model go investigate
|
|
18
19
|
* and then fire". A different quantity, and a costlier one: ~590k → ~780k tokens
|
|
19
|
-
* per skill (+190k) and 67s → 84s, while
|
|
20
|
-
* ≈ 384 tokens. The growth is reading, not input size (`cache`
|
|
20
|
+
* per skill (+190k) and 67s → 84s, while the fixture measured then was 1,537
|
|
21
|
+
* characters ≈ 384 tokens. The growth is reading, not input size (`cache`
|
|
22
|
+
* 470k → 652k).
|
|
21
23
|
* Cite the trigger numbers with that caveat attached — it is written out in
|
|
22
24
|
* `vigiles/repro/skill-trigger-2026-08-11/README.md` under "How to read".
|
|
23
25
|
*/
|
|
24
26
|
export declare const FIXTURE: {
|
|
25
|
-
"paper/paper.
|
|
27
|
+
"paper/paper.tex": string;
|
|
26
28
|
"paper/repro/README.md": string;
|
|
27
29
|
"paper/PIPELINE-STATUS.md": string;
|
|
28
30
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-eval-fixture.d.ts","sourceRoot":"","sources":["../../lib/skill-eval-fixture.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"skill-eval-fixture.d.ts","sourceRoot":"","sources":["../../lib/skill-eval-fixture.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,OAAO;;;;CA4CnB,CAAC"}
|
|
@@ -10,53 +10,60 @@
|
|
|
10
10
|
* and the zero was an artifact of the empty directory, not a fact about the skill.
|
|
11
11
|
*
|
|
12
12
|
* Extracted from `paper-pipeline/pipeline-firing.eval.mjs`, which had it right
|
|
13
|
-
* from the start
|
|
13
|
+
* from the start; the `paper-pipeline/*.eval.mjs` experiments carry the same
|
|
14
|
+
* block, byte for byte.
|
|
14
15
|
*
|
|
15
16
|
* ⚠️ AND THE PRICE, so this file is not a one-sided story (measured 2026-08-12).
|
|
16
17
|
* With a fixture present the model OPENS THE PAPER and looks around, so the number
|
|
17
18
|
* stops being "did the DESCRIPTION fire" and becomes "did the model go investigate
|
|
18
19
|
* and then fire". A different quantity, and a costlier one: ~590k → ~780k tokens
|
|
19
|
-
* per skill (+190k) and 67s → 84s, while
|
|
20
|
-
* ≈ 384 tokens. The growth is reading, not input size (`cache`
|
|
20
|
+
* per skill (+190k) and 67s → 84s, while the fixture measured then was 1,537
|
|
21
|
+
* characters ≈ 384 tokens. The growth is reading, not input size (`cache`
|
|
22
|
+
* 470k → 652k).
|
|
21
23
|
* Cite the trigger numbers with that caveat attached — it is written out in
|
|
22
24
|
* `vigiles/repro/skill-trigger-2026-08-11/README.md` under "How to read".
|
|
23
25
|
*/
|
|
24
26
|
export const FIXTURE = {
|
|
25
|
-
"paper/paper.
|
|
26
|
-
"
|
|
27
|
+
"paper/paper.tex": [
|
|
28
|
+
"\\documentclass{article}",
|
|
29
|
+
"\\title{Prose Isn't Policy: Measuring Whether Agent-Config Rules Are Enforceable}",
|
|
30
|
+
"\\begin{document}",
|
|
31
|
+
"\\maketitle",
|
|
27
32
|
"",
|
|
28
|
-
"
|
|
33
|
+
"\\begin{abstract}",
|
|
29
34
|
"Agent configuration files state rules in prose and assume the model obeys them. We compile a",
|
|
30
|
-
"corpus of real rules and measure what fraction can be mechanically enforced. We find that 84
|
|
35
|
+
"corpus of real rules and measure what fraction can be mechanically enforced. We find that 84\\%",
|
|
31
36
|
"of rules in our corpus are enforceable, and that LLM-authored checkers for the remainder leak",
|
|
32
|
-
"silently in 84
|
|
37
|
+
"silently in 84--96\\% of adversarial cases~\\cite{greshake2023}.",
|
|
38
|
+
"\\end{abstract}",
|
|
33
39
|
"",
|
|
34
|
-
"
|
|
40
|
+
"\\section{Introduction}",
|
|
35
41
|
"Every agent harness ships a natural-language rulebook. Nothing checks it. This is the same",
|
|
36
|
-
"mistake as a code comment that claims an invariant no test enforces
|
|
42
|
+
"mistake as a code comment that claims an invariant no test enforces~\\cite{thompson1984}.",
|
|
37
43
|
"",
|
|
38
|
-
"
|
|
44
|
+
"\\section{Method}",
|
|
39
45
|
"We gather rules from public repositories, classify each by enforceability, and build a",
|
|
40
46
|
"two-stage adversarial gate that validates a synthesized rule against a blind gold set.",
|
|
41
47
|
"",
|
|
42
|
-
"
|
|
43
|
-
"See Table
|
|
48
|
+
"\\section{Results}",
|
|
49
|
+
"See Table~1. The headline number is 84\\%.",
|
|
44
50
|
"",
|
|
45
|
-
"
|
|
51
|
+
"\\section{Discussion}",
|
|
46
52
|
"The result generalizes beyond our corpus in the sense that the mechanism is not corpus-specific,",
|
|
47
53
|
"though of course the specific percentages are, and it is important to note in this context that",
|
|
48
54
|
"the framing itself may be what carries, rather than the measurement.",
|
|
49
55
|
"",
|
|
50
|
-
"
|
|
56
|
+
"\\section{Threats to Validity}",
|
|
51
57
|
"Our corpus is drawn from public repositories and may not represent private configurations.",
|
|
52
58
|
"",
|
|
53
|
-
"
|
|
59
|
+
"\\section{Related Work}",
|
|
54
60
|
"TODO",
|
|
55
61
|
"",
|
|
56
|
-
"
|
|
62
|
+
"\\section{Conclusion}",
|
|
57
63
|
"Prose is not policy.",
|
|
64
|
+
"\\end{document}",
|
|
58
65
|
].join("\n"),
|
|
59
|
-
"paper/repro/README.md": "# Reproduction artifact\n\n`python3 paper_numbers.py` recomputes every bolded figure in paper.
|
|
66
|
+
"paper/repro/README.md": "# Reproduction artifact\n\n`python3 paper_numbers.py` recomputes every bolded figure in paper.tex.\n",
|
|
60
67
|
"paper/PIPELINE-STATUS.md": "# Pipeline status\n\n| gate | state |\n|---|---|\n| numbers | pass |\n| structure | not run |\n| citations | not run |\n",
|
|
61
68
|
};
|
|
62
69
|
//# sourceMappingURL=skill-eval-fixture.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-eval-fixture.js","sourceRoot":"","sources":["../../lib/skill-eval-fixture.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"skill-eval-fixture.js","sourceRoot":"","sources":["../../lib/skill-eval-fixture.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,iBAAiB,EAAE;QACjB,0BAA0B;QAC1B,mFAAmF;QACnF,mBAAmB;QACnB,aAAa;QACb,EAAE;QACF,mBAAmB;QACnB,8FAA8F;QAC9F,iGAAiG;QACjG,+FAA+F;QAC/F,kEAAkE;QAClE,iBAAiB;QACjB,EAAE;QACF,yBAAyB;QACzB,4FAA4F;QAC5F,2FAA2F;QAC3F,EAAE;QACF,mBAAmB;QACnB,wFAAwF;QACxF,wFAAwF;QACxF,EAAE;QACF,oBAAoB;QACpB,4CAA4C;QAC5C,EAAE;QACF,uBAAuB;QACvB,kGAAkG;QAClG,iGAAiG;QACjG,sEAAsE;QACtE,EAAE;QACF,gCAAgC;QAChC,4FAA4F;QAC5F,EAAE;QACF,yBAAyB;QACzB,MAAM;QACN,EAAE;QACF,uBAAuB;QACvB,sBAAsB;QACtB,iBAAiB;KAClB,CAAC,IAAI,CAAC,IAAI,CAAC;IACZ,uBAAuB,EACrB,sGAAsG;IACxG,0BAA0B,EACxB,0HAA0H;CAC7H,CAAC"}
|
package/dist/new-paper.d.ts
CHANGED
|
@@ -1,7 +1,4 @@
|
|
|
1
1
|
import { type NamedVenue } from "./domain/venue-name.ts";
|
|
2
|
-
export type PaperFormat = "tex" | "md";
|
|
3
|
-
export declare const FORMATS: readonly PaperFormat[];
|
|
4
|
-
export declare const DEFAULT_FORMAT: PaperFormat;
|
|
5
2
|
/** The package's default templates. Read from disk, so they ship in the tarball (`files`). */
|
|
6
3
|
export declare const PACKAGE_TEMPLATES: string;
|
|
7
4
|
/**
|
|
@@ -11,10 +8,10 @@ export declare const PACKAGE_TEMPLATES: string;
|
|
|
11
8
|
*/
|
|
12
9
|
export declare const OVERRIDE_DIR = ".template";
|
|
13
10
|
export declare const STATUS_FILE = "PIPELINE-STATUS.md";
|
|
14
|
-
|
|
11
|
+
/** A paper's source: LaTeX, one file at the paper's root. */
|
|
12
|
+
export declare const SOURCE_FILE = "paper.tex";
|
|
15
13
|
/** The flag that lets `paperlint new` create a folder whose name names a venue. */
|
|
16
14
|
export declare const ALLOW_VENUE_NAME = "--allow-venue-name";
|
|
17
|
-
export declare const isFormat: (v: unknown) => v is PaperFormat;
|
|
18
15
|
/**
|
|
19
16
|
* Why a name is refused, or null. `[a-z0-9._-]+` is the charset; a LEADING dot is refused on top
|
|
20
17
|
* of it, because discovery skips dot-directories — a paper named `.x` would be created and then
|
|
@@ -45,11 +42,8 @@ export type NewPaperResult = {
|
|
|
45
42
|
readonly ok: false;
|
|
46
43
|
readonly reason: string;
|
|
47
44
|
};
|
|
48
|
-
/**
|
|
49
|
-
|
|
50
|
-
* already has a source in EITHER format, in which case that one stands — and `paperlint.json`.
|
|
51
|
-
*/
|
|
52
|
-
export declare function wantedFiles(dir: string, format: PaperFormat): string[];
|
|
45
|
+
/** The files a paper folder must end up with: the scorecard, the source and `paperlint.json`. */
|
|
46
|
+
export declare const WANTED_FILES: readonly string[];
|
|
53
47
|
/** The venue `paperlint new --venue` chose: what goes into the new paper's `paperlint.json`. */
|
|
54
48
|
export interface VenueSetting {
|
|
55
49
|
/** `paperlint:<name>`, or a path relative to the paper's `paperlint.json`. */
|
|
@@ -68,7 +62,7 @@ export interface NewPaperOptions {
|
|
|
68
62
|
/** Every venue paperlint knows (`shippedVenueNames`): a name naming one is refused. */
|
|
69
63
|
readonly venues: readonly NamedVenue[];
|
|
70
64
|
}
|
|
71
|
-
export declare function newPaper(papersRoot: string, name: string,
|
|
65
|
+
export declare function newPaper(papersRoot: string, name: string, opts: NewPaperOptions): NewPaperResult;
|
|
72
66
|
/** The report lines, shared by `paperlint new` and the first-paper offer in `paperlint init`. */
|
|
73
67
|
export declare function reportNewPaper(result: NewPaperResult, here: (p: string) => string): string[];
|
|
74
68
|
//# sourceMappingURL=new-paper.d.ts.map
|
package/dist/new-paper.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"new-paper.d.ts","sourceRoot":"","sources":["../src/new-paper.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"new-paper.d.ts","sourceRoot":"","sources":["../src/new-paper.ts"],"names":[],"mappings":"AA4BA,OAAO,EAGL,KAAK,UAAU,EAChB,MAAM,wBAAwB,CAAC;AAEhC,8FAA8F;AAC9F,eAAO,MAAM,iBAAiB,QAE7B,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,YAAY,cAAc,CAAC;AAExC,eAAO,MAAM,WAAW,uBAAuB,CAAC;AAChD,6DAA6D;AAC7D,eAAO,MAAM,WAAW,cAAc,CAAC;AAEvC,mFAAmF;AACnF,eAAO,MAAM,gBAAgB,uBAAuB,CAAC;AAErD;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,SAAS,UAAU,EAAE,GAC5B,MAAM,GAAG,IAAI,CAaf;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,sEAAsE;IACtE,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAAC;IACpC,uDAAuD;IACvD,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;CACvC;AAED,MAAM,MAAM,cAAc,GACtB;IACE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAClB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,gDAAgD;IAChD,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;CACxC,GACD;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpD,iGAAiG;AACjG,eAAO,MAAM,YAAY,EAAE,SAAS,MAAM,EAIzC,CAAC;AAEF,gGAAgG;AAChG,MAAM,WAAW,YAAY;IAC3B,8EAA8E;IAC9E,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC,GAAG,IAAI,CAAC;CAC3D;AAuED,mGAAmG;AACnG,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,KAAK,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IACrC,uFAAuF;IACvF,QAAQ,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,CAAC;CACxC;AAGD,wBAAgB,QAAQ,CACtB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,eAAe,GACpB,cAAc,CAiChB;AAED,iGAAiG;AACjG,wBAAgB,cAAc,CAC5B,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,GAC1B,MAAM,EAAE,CAYV"}
|
package/dist/new-paper.js
CHANGED
|
@@ -8,8 +8,7 @@
|
|
|
8
8
|
* Every rule below is taken from a tool that already solved it (docs/prior-art/paper-folder-scaffolding.md):
|
|
9
9
|
* - the template is a FILE with a lookup order — the project's `<papers>/.template/<file>` first,
|
|
10
10
|
* the package's `templates/paper/<file>` second (Hugo's archetypes);
|
|
11
|
-
* - it NEVER overwrites: on an existing folder it adds only the missing required files
|
|
12
|
-
* also the migration for an old folder that has only `paper.md` (`cargo init`);
|
|
11
|
+
* - it NEVER overwrites: on an existing folder it adds only the missing required files (`cargo init`);
|
|
13
12
|
* - the name is validated, because it becomes a path and, through the hooks, a shell argument.
|
|
14
13
|
*
|
|
15
14
|
* The only substitution is `{{name}}` → the folder name. Nothing else in a template is touched.
|
|
@@ -22,8 +21,6 @@ import { fileURLToPath } from "node:url";
|
|
|
22
21
|
import { CONFIG_FILE } from "#lib/paper-config";
|
|
23
22
|
import { isRecord } from "./domain/record.js";
|
|
24
23
|
import { venuesNamedBy, withoutVenues, } from "./domain/venue-name.js";
|
|
25
|
-
export const FORMATS = ["tex", "md"];
|
|
26
|
-
export const DEFAULT_FORMAT = "tex";
|
|
27
24
|
/** The package's default templates. Read from disk, so they ship in the tarball (`files`). */
|
|
28
25
|
export const PACKAGE_TEMPLATES = fileURLToPath(new URL("../templates/paper/", import.meta.url));
|
|
29
26
|
/**
|
|
@@ -33,13 +30,10 @@ export const PACKAGE_TEMPLATES = fileURLToPath(new URL("../templates/paper/", im
|
|
|
33
30
|
*/
|
|
34
31
|
export const OVERRIDE_DIR = ".template";
|
|
35
32
|
export const STATUS_FILE = "PIPELINE-STATUS.md";
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
md: "paper.md",
|
|
39
|
-
};
|
|
33
|
+
/** A paper's source: LaTeX, one file at the paper's root. */
|
|
34
|
+
export const SOURCE_FILE = "paper.tex";
|
|
40
35
|
/** The flag that lets `paperlint new` create a folder whose name names a venue. */
|
|
41
36
|
export const ALLOW_VENUE_NAME = "--allow-venue-name";
|
|
42
|
-
export const isFormat = (v) => FORMATS.some((f) => f === v);
|
|
43
37
|
/**
|
|
44
38
|
* Why a name is refused, or null. `[a-z0-9._-]+` is the charset; a LEADING dot is refused on top
|
|
45
39
|
* of it, because discovery skips dot-directories — a paper named `.x` would be created and then
|
|
@@ -67,17 +61,12 @@ export function nameProblem(name, venues) {
|
|
|
67
61
|
` if the venue really belongs in the name, rerun \`paperlint new\` with ${ALLOW_VENUE_NAME}`,
|
|
68
62
|
].join("\n");
|
|
69
63
|
}
|
|
70
|
-
/**
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
}
|
|
77
|
-
function scorecardAndSource(dir, format) {
|
|
78
|
-
const hasSource = Object.values(SOURCE_FILE).some((f) => existsSync(join(dir, f)));
|
|
79
|
-
return hasSource ? [STATUS_FILE] : [STATUS_FILE, SOURCE_FILE[format]];
|
|
80
|
-
}
|
|
64
|
+
/** The files a paper folder must end up with: the scorecard, the source and `paperlint.json`. */
|
|
65
|
+
export const WANTED_FILES = [
|
|
66
|
+
STATUS_FILE,
|
|
67
|
+
SOURCE_FILE,
|
|
68
|
+
CONFIG_FILE,
|
|
69
|
+
];
|
|
81
70
|
/**
|
|
82
71
|
* The template's `paperlint.json` with the chosen venue written in. The template's `$comment`
|
|
83
72
|
* explains how to choose one, so it goes once one is chosen. A template that is not plain JSON (a
|
|
@@ -114,7 +103,7 @@ function fromTemplate(file, { papersRoot, packageTemplates, name, venue, }) {
|
|
|
114
103
|
return { ok: false, reason: `no template for ${file}: ${src} is missing` };
|
|
115
104
|
const text = readFileSync(src, "utf8").split("{{name}}").join(name);
|
|
116
105
|
const setClass = venue?.setClass ?? null;
|
|
117
|
-
if (file === SOURCE_FILE
|
|
106
|
+
if (file === SOURCE_FILE && setClass !== null)
|
|
118
107
|
return { ok: true, value: { file, text: setClass(text), from } };
|
|
119
108
|
if (file !== CONFIG_FILE || venue === null)
|
|
120
109
|
return { ok: true, value: { file, text, from } };
|
|
@@ -124,7 +113,7 @@ function fromTemplate(file, { papersRoot, packageTemplates, name, venue, }) {
|
|
|
124
113
|
: edited;
|
|
125
114
|
}
|
|
126
115
|
// Documented in README.md#getting-started — update it when this changes.
|
|
127
|
-
export function newPaper(papersRoot, name,
|
|
116
|
+
export function newPaper(papersRoot, name, opts) {
|
|
128
117
|
const { packageTemplates = PACKAGE_TEMPLATES, venue = null } = opts;
|
|
129
118
|
const problem = nameProblem(name, opts.venues);
|
|
130
119
|
if (problem)
|
|
@@ -135,7 +124,7 @@ export function newPaper(papersRoot, name, format, opts) {
|
|
|
135
124
|
return { ok: false, reason: `${dir} exists and is not a directory` };
|
|
136
125
|
const files = [];
|
|
137
126
|
const toWrite = [];
|
|
138
|
-
for (const file of
|
|
127
|
+
for (const file of WANTED_FILES) {
|
|
139
128
|
if (existsSync(join(dir, file))) {
|
|
140
129
|
files.push({ file, status: "kept" });
|
|
141
130
|
continue;
|
package/dist/new-paper.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"new-paper.js","sourceRoot":"","sources":["../src/new-paper.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"new-paper.js","sourceRoot":"","sources":["../src/new-paper.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package-dirs.d.ts","sourceRoot":"","sources":["../src/package-dirs.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"package-dirs.d.ts","sourceRoot":"","sources":["../src/package-dirs.ts"],"names":[],"mappings":"AAcA,iEAAiE;AACjE,eAAO,MAAM,UAAU,QAAO,MACyB,CAAC;AAExD,sFAAsF;AACtF,eAAO,MAAM,YAAY,QAAO,MAC2B,CAAC;AAE5D,iFAAiF;AACjF,eAAO,MAAM,aAAa,GAAI,UAAU,MAAM,KAAG,SAAS,MAAM,EAG/D,CAAC"}
|
package/dist/package-dirs.js
CHANGED
|
@@ -6,8 +6,9 @@
|
|
|
6
6
|
* presets/ the venue presets (`paperlint:<name>`) and their JSON Schema
|
|
7
7
|
* presets/tex/ the LaTeX inputs `paperlint build` puts on TEXINPUTS
|
|
8
8
|
*
|
|
9
|
-
* `texSearchPath` is where an `\input` is looked for, in order. The build hands it to TeX
|
|
10
|
-
*
|
|
9
|
+
* `texSearchPath` is where an `\input` is looked for, in order. The build hands it to TeX; lint does
|
|
10
|
+
* not search for an include at all — it reads the files TeX read, from the build's record
|
|
11
|
+
* (docs/design/paper-sources.md §1).
|
|
11
12
|
*/
|
|
12
13
|
import { fileURLToPath } from "node:url";
|
|
13
14
|
/** The shipped venue presets and `venue-profile.schema.json`. */
|
package/dist/package-dirs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package-dirs.js","sourceRoot":"","sources":["../src/package-dirs.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"package-dirs.js","sourceRoot":"","sources":["../src/package-dirs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,iEAAiE;AACjE,MAAM,CAAC,MAAM,UAAU,GAAG,GAAW,EAAE,CACrC,aAAa,CAAC,IAAI,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAExD,sFAAsF;AACtF,MAAM,CAAC,MAAM,YAAY,GAAG,GAAW,EAAE,CACvC,aAAa,CAAC,IAAI,GAAG,CAAC,gBAAgB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE5D,iFAAiF;AACjF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,QAAgB,EAAqB,EAAE,CAAC;IACpE,QAAQ;IACR,YAAY,EAAE;CACf,CAAC"}
|
package/dist/paper-files.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* THE FILES PAPERLINT OWNS — read off its own config, and made the only thing ESLint may reach.
|
|
3
3
|
*
|
|
4
|
-
* paperlint's blocks name the files they lint (`PIPELINE-STATUS.md`, `paper.
|
|
5
|
-
*
|
|
4
|
+
* paperlint's blocks name the files they lint (`PIPELINE-STATUS.md`, `paper.tex`, `reviews/*.md`,
|
|
5
|
+
* …). That list is the whole scope of `paperlint lint`, and this module turns it
|
|
6
6
|
* into two things ESLint understands:
|
|
7
7
|
*
|
|
8
8
|
* 1. **A global ignore of everything else** (`scopeToOwned`). Handing ESLint a directory is not
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
* 2. **Each rule scoped to the files it was written for** (`ruleOwners` + `narrowToOwners`).
|
|
18
18
|
* One plugin NAME is bound to different plugin objects in different blocks: `paper` holds
|
|
19
19
|
* `stages`/`source`/`author-list` beside `PIPELINE-STATUS.md` and `typography` beside
|
|
20
|
-
* `paper.
|
|
20
|
+
* `paper.tex`. So a consumer block that named `paper/source`
|
|
21
21
|
* for every file under the papers directory reached `paper.tex`, where `paper` has no `source`
|
|
22
22
|
* — and ESLint threw `Could not find "source" in plugin "paper"` from inside `lintFiles`,
|
|
23
23
|
* after paperlint's own validation had (correctly) accepted the id. A block is therefore split
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
* - a global-ignore pattern that matches a DIRECTORY hides everything inside it, so directories
|
|
37
37
|
* must be un-ignored (`!` + a pattern ending in a slash) before owned files can be;
|
|
38
38
|
* - that un-ignores `node_modules/` and `.git/` too — ESLint's own defaults — so they are
|
|
39
|
-
* re-ignored after, or a `paper.
|
|
39
|
+
* re-ignored after, or a `paper.tex` inside a dependency would be linted;
|
|
40
40
|
* - later global-ignore patterns win, across blocks, in config order;
|
|
41
41
|
* - `files: [["a", "b"]]` matches a file only when BOTH patterns match.
|
|
42
42
|
*/
|
package/dist/paper-includes.d.ts
CHANGED
|
@@ -1,20 +1,17 @@
|
|
|
1
1
|
import type { AbsolutePath } from "./domain/paths.ts";
|
|
2
|
+
import { type RecordReadDeps } from "./paper-record.ts";
|
|
2
3
|
import type { ConfigBlock } from "./rules-config.ts";
|
|
3
|
-
import { type PaperDeps, type Unread } from "./tex-paper.ts";
|
|
4
4
|
/** The files the fragment block (`buildConfig`) claims: the only body files ESLint is handed. */
|
|
5
5
|
export declare const FRAGMENT_FILES: readonly string[];
|
|
6
|
-
/** One paper's main file and body files
|
|
6
|
+
/** One paper's main file and the body files of its last build. */
|
|
7
7
|
export interface PaperBody {
|
|
8
8
|
readonly dir: string;
|
|
9
9
|
readonly main: AbsolutePath;
|
|
10
|
-
/** The body files ESLint lints, each as a fragment: the `.tex` ones. */
|
|
10
|
+
/** The body files ESLint lints, each as a fragment: the `.tex` ones TeX did not write. None without a fresh record. */
|
|
11
11
|
readonly files: readonly AbsolutePath[];
|
|
12
|
-
readonly missing: readonly Unread[];
|
|
13
12
|
}
|
|
14
13
|
/** The body of each paper directory in `dirs` that has a `paper.tex`. */
|
|
15
|
-
export declare function paperBodies(dirs: readonly string[], deps:
|
|
14
|
+
export declare function paperBodies(dirs: readonly string[], deps: RecordReadDeps): readonly PaperBody[];
|
|
16
15
|
/** The config blocks that hand ESLint each paper's body files, and the paper to every one of them. */
|
|
17
16
|
export declare const includeBlocks: (bodies: readonly PaperBody[]) => readonly ConfigBlock[];
|
|
18
|
-
/** One line per include that resolved nowhere: which text lint did not read, and why. */
|
|
19
|
-
export declare const unreadLines: (bodies: readonly PaperBody[], shown: (path: string) => string) => readonly string[];
|
|
20
17
|
//# sourceMappingURL=paper-includes.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paper-includes.d.ts","sourceRoot":"","sources":["../src/paper-includes.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"paper-includes.d.ts","sourceRoot":"","sources":["../src/paper-includes.ts"],"names":[],"mappings":"AAuCA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,iGAAiG;AACjG,eAAO,MAAM,cAAc,EAAE,SAAS,MAAM,EAAiB,CAAC;AAK9D,kEAAkE;AAClE,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,uHAAuH;IACvH,QAAQ,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,CAAC;CACzC;AAED,yEAAyE;AACzE,wBAAgB,WAAW,CACzB,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,IAAI,EAAE,cAAc,GACnB,SAAS,SAAS,EAAE,CActB;AAED,sGAAsG;AACtG,eAAO,MAAM,aAAa,GACxB,QAAQ,SAAS,SAAS,EAAE,KAC3B,SAAS,WAAW,EAcnB,CAAC"}
|
package/dist/paper-includes.js
CHANGED
|
@@ -2,10 +2,12 @@
|
|
|
2
2
|
* THE FILES OF A PAPER'S BODY, handed to ESLint — so the rules over ESLint's LaTeX text read a paper
|
|
3
3
|
* whose body is in `sections/*.tex`, and report each finding at its own file and line (#144).
|
|
4
4
|
*
|
|
5
|
-
* The set is what TeX
|
|
6
|
-
* src/
|
|
7
|
-
*
|
|
8
|
-
*
|
|
5
|
+
* The set is what TeX read, as the last build recorded it (`_build/sources.json`, `paperRecord` in
|
|
6
|
+
* src/paper-record.ts): `paper.tex` and the `.tex` files of the paper directory TeX read after
|
|
7
|
+
* `\\begin{document}`. Nothing here reads TeX source or looks for an include on disk. Not a glob over
|
|
8
|
+
* every `.tex`: a frozen version under `versions/`, a macro file the preamble includes and a scratch
|
|
9
|
+
* file nothing includes are not the paper. A paper with no record, or one it has changed since, is
|
|
10
|
+
* `paper.tex` alone — `paper/sources-fresh` (src/sources-rules.ts) says the rest went unlinted.
|
|
9
11
|
*
|
|
10
12
|
* Two blocks per paper, both relative to the paper's directory (`basePath`):
|
|
11
13
|
*
|
|
@@ -16,19 +18,26 @@
|
|
|
16
18
|
* for the rules whose verdict is the paper's (eslint-rules/paper-context.ts).
|
|
17
19
|
*
|
|
18
20
|
* ── ONLY `.tex` FILES ARE HANDED TO ESLint (#153) ────────────────────────────────
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
21
|
+
* TeX may read a body file of another extension: `\\input{paper.bbl}` in a paper that ships bibtex's
|
|
22
|
+
* output instead of a `.bib`, a plot exported as `.pgf`. Handed to ESLint, such a file got no
|
|
23
|
+
* language — the fragment block claims `.tex` only — and the JavaScript parser stopped at its first
|
|
24
|
+
* `%`. It is not given the LaTeX language either: the fragment rules judge and `--fix` the prose an
|
|
25
|
+
* author writes in that file, and a file of another extension is in practice a tool's output, whose
|
|
26
|
+
* words are someone else's (the titles of cited works) and whose fix the next run of the tool
|
|
27
|
+
* overwrites. TeX still reads it, and so does `readPaper`: the rules over the whole paper see it
|
|
28
|
+
* spliced into `paper.tex`, where TeX typesets it.
|
|
29
|
+
*
|
|
30
|
+
* ── NOR IS A `.tex` TeX WROTE ────────────────────────────────────────────────────
|
|
31
|
+
* A `filecontents` block may write a `.tex` the body `\\input`s (the record lists it as an input and
|
|
32
|
+
* as written, src/domain/tex-run.ts). Its words are the block's, which the author edits in the file
|
|
33
|
+
* holding the block; a fix made in the written copy is overwritten by an `[overwrite]` block on the next
|
|
34
|
+
* build, and splits the copy from the block without one. So it is read the way TeX reads it — spliced by
|
|
35
|
+
* `readPaper`, for the rules over the whole paper — and is not handed to ESLint as a file of its own.
|
|
27
36
|
*/
|
|
28
37
|
import { extname, join, relative } from "node:path";
|
|
29
38
|
import { PAPERLINT_SETTINGS } from "#eslint-rules/paper-context";
|
|
30
39
|
import { callerPath } from "./caller-path.js";
|
|
31
|
-
import {
|
|
40
|
+
import { paperRecord, recordedFiles, } from "./paper-record.js";
|
|
32
41
|
/** The files the fragment block (`buildConfig`) claims: the only body files ESLint is handed. */
|
|
33
42
|
export const FRAGMENT_FILES = ["**/*.tex"];
|
|
34
43
|
/** Whether a body file is one the fragment block claims — the extension its glob names. */
|
|
@@ -37,12 +46,14 @@ const isFragment = (file) => extname(file) === ".tex";
|
|
|
37
46
|
export function paperBodies(dirs, deps) {
|
|
38
47
|
return dirs.flatMap((dir) => {
|
|
39
48
|
const main = callerPath(join(dir, "paper.tex"));
|
|
40
|
-
|
|
41
|
-
if (bytes === null)
|
|
49
|
+
if (!deps.files.isFile(main))
|
|
42
50
|
return [];
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
|
|
51
|
+
const record = paperRecord(dir, deps);
|
|
52
|
+
if (record.kind !== "fresh")
|
|
53
|
+
return [{ dir, main, files: [] }];
|
|
54
|
+
const written = new Set(record.record.written.map((w) => callerPath(join(dir, w))));
|
|
55
|
+
const files = recordedFiles(dir, record.record, "body").filter((f) => f !== main && isFragment(f) && !written.has(f));
|
|
56
|
+
return [{ dir, main, files }];
|
|
46
57
|
});
|
|
47
58
|
}
|
|
48
59
|
/** The config blocks that hand ESLint each paper's body files, and the paper to every one of them. */
|
|
@@ -60,7 +71,4 @@ export const includeBlocks = (bodies) => bodies.flatMap((b) => {
|
|
|
60
71
|
},
|
|
61
72
|
];
|
|
62
73
|
});
|
|
63
|
-
/** One line per include that resolved nowhere: which text lint did not read, and why. */
|
|
64
|
-
export const unreadLines = (bodies, shown) => bodies.flatMap((b) => b.missing.map((m) => `${shown(b.main)}: lint did not read \`${m.target}\` (included by ${m.file}): ` +
|
|
65
|
-
"no such file in the paper's directory or paperlint's inputs"));
|
|
66
74
|
//# sourceMappingURL=paper-includes.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paper-includes.js","sourceRoot":"","sources":["../src/paper-includes.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"paper-includes.js","sourceRoot":"","sources":["../src/paper-includes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type ProseDeps } from "./tex-paper.ts";
|
|
2
|
+
/**
|
|
3
|
+
* A paper's body prose, one passage per paragraph, its section titles in document order, and the
|
|
4
|
+
* text of each file it is made of — `paper.tex` and every file it includes, once, named as the
|
|
5
|
+
* include names it — for what the body leaves out, such as captions.
|
|
6
|
+
*/
|
|
7
|
+
export interface PaperProse {
|
|
8
|
+
readonly body: string;
|
|
9
|
+
readonly headings: readonly string[];
|
|
10
|
+
readonly files: readonly {
|
|
11
|
+
readonly file: string;
|
|
12
|
+
readonly text: string;
|
|
13
|
+
}[];
|
|
14
|
+
}
|
|
15
|
+
/** The prose and the headings of the paper whose main file is `filename` with the text `src`. */
|
|
16
|
+
export declare function paperProse(filename: string, src: string, deps: ProseDeps): PaperProse;
|
|
17
|
+
//# sourceMappingURL=paper-prose.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paper-prose.d.ts","sourceRoot":"","sources":["../src/paper-prose.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAa,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAW3D;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,SAAS;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC7E;AAED,iGAAiG;AACjG,wBAAgB,UAAU,CACxB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,SAAS,GACd,UAAU,CAoBZ"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THE PROSE OF A paper.tex AS PLAIN TEXT — what `grade-paper-writing/prose-lint.mjs` measures.
|
|
3
|
+
*
|
|
4
|
+
* prose-lint counts sentences and words, and every metric it prints is a fraction of the word
|
|
5
|
+
* count. Read as raw text, a `.tex` puts the preamble, the `%` comments and an inline `filecontents`
|
|
6
|
+
* bibliography into that count (8127 "words" against about 4636 real ones on one paper), so every
|
|
7
|
+
* rate comes out roughly halved. This reads the paper the way the `tex/register` rule does: the
|
|
8
|
+
* includes spliced in (`readPaper`), then the body's prose as passages (`bodyProse` — the abstract
|
|
9
|
+
* to the back matter, without headings, captions, floats or code), each passage's sentences
|
|
10
|
+
* (`bodySentences`). A blank line separates two passages, so no sentence runs across them.
|
|
11
|
+
*
|
|
12
|
+
* A citation stands as `[1]` and a cross-reference as `1`, where they are set — not left out:
|
|
13
|
+
* prose-lint judges a sentence that ENDS on one (a wasted stress position) and counts references
|
|
14
|
+
* to other parts of the paper (`(Section 1)`), and both are invisible in a sentence the marks
|
|
15
|
+
* were cut out of. Math is left out; prose-lint counts no formula.
|
|
16
|
+
*/
|
|
17
|
+
import { bodySentences } from "./domain/register.js";
|
|
18
|
+
import { CITATION, MATH, REFERENCE } from "./domain/sentences.js";
|
|
19
|
+
import { runText } from "./domain/tex-document.js";
|
|
20
|
+
import { readPaper } from "./tex-paper.js";
|
|
21
|
+
/** A sentence's text with each mark as a reader would see it set, and math left out. */
|
|
22
|
+
const rendered = (raw) => raw
|
|
23
|
+
.replaceAll(CITATION, "[1]")
|
|
24
|
+
.replaceAll(REFERENCE, "1")
|
|
25
|
+
.replaceAll(MATH, "")
|
|
26
|
+
.replace(/\s+/gu, " ")
|
|
27
|
+
.trim();
|
|
28
|
+
/** The prose and the headings of the paper whose main file is `filename` with the text `src`. */
|
|
29
|
+
export function paperProse(filename, src, deps) {
|
|
30
|
+
const { text, segments } = readPaper(filename, src, deps);
|
|
31
|
+
const passages = deps.latex
|
|
32
|
+
.bodyProse(text)
|
|
33
|
+
.map((p) => bodySentences([p])
|
|
34
|
+
.map((s) => rendered(s.raw))
|
|
35
|
+
.join(" "))
|
|
36
|
+
.filter((p) => p !== "");
|
|
37
|
+
return {
|
|
38
|
+
body: passages.join("\n\n"),
|
|
39
|
+
headings: deps.latex
|
|
40
|
+
.headings(text)
|
|
41
|
+
.filter((h) => h.command.kind === "heading" && h.argument === "title")
|
|
42
|
+
.map((h) => runText(h.title).replace(/\s+/g, " ").trim()),
|
|
43
|
+
files: [...new Map(segments.map((s) => [s.file, s.source])).entries()].map(([file, text]) => ({ file, text })),
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=paper-prose.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paper-prose.js","sourceRoot":"","sources":["../src/paper-prose.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAE,SAAS,EAAkB,MAAM,gBAAgB,CAAC;AAE3D,wFAAwF;AACxF,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAU,EAAE,CACvC,GAAG;KACA,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC;KAC3B,UAAU,CAAC,SAAS,EAAE,GAAG,CAAC;KAC1B,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC;KACpB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;KACrB,IAAI,EAAE,CAAC;AAaZ,iGAAiG;AACjG,MAAM,UAAU,UAAU,CACxB,QAAgB,EAChB,GAAW,EACX,IAAe;IAEf,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK;SACxB,SAAS,CAAC,IAAI,CAAC;SACf,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACT,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;SACf,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;SAC3B,IAAI,CAAC,GAAG,CAAC,CACb;SACA,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IAC3B,OAAO;QACL,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;QAC3B,QAAQ,EAAE,IAAI,CAAC,KAAK;aACjB,QAAQ,CAAC,IAAI,CAAC;aACd,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC;aACrE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3D,KAAK,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CACxE,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CACnC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { AbsolutePath } from "./domain/paths.ts";
|
|
2
|
+
import { type Change, type InputRole, type SourcesRecord } from "./domain/sources-record.ts";
|
|
3
|
+
import type { Files } from "./ports/files.ts";
|
|
4
|
+
import type { SourcesCodec } from "./ports/sources-codec.ts";
|
|
5
|
+
export type PaperRecord =
|
|
6
|
+
/** No record, or one that cannot be read (`unreadable` says why; null for no file). */
|
|
7
|
+
{
|
|
8
|
+
readonly kind: "none";
|
|
9
|
+
readonly unreadable: string | null;
|
|
10
|
+
} | {
|
|
11
|
+
readonly kind: "stale";
|
|
12
|
+
readonly changed: readonly Change[];
|
|
13
|
+
} | {
|
|
14
|
+
readonly kind: "fresh";
|
|
15
|
+
readonly record: SourcesRecord;
|
|
16
|
+
};
|
|
17
|
+
/** What reading a record needs: the disk, and the schema its text is parsed with. */
|
|
18
|
+
export interface RecordReadDeps {
|
|
19
|
+
readonly files: Files;
|
|
20
|
+
readonly codec: SourcesCodec;
|
|
21
|
+
}
|
|
22
|
+
export declare function paperRecord(dir: string, deps: RecordReadDeps): PaperRecord;
|
|
23
|
+
/** The files of `role` the record lists, as absolute paths, in the order TeX first read them. */
|
|
24
|
+
export declare const recordedFiles: (dir: string, record: SourcesRecord, role: InputRole) => readonly AbsolutePath[];
|
|
25
|
+
//# sourceMappingURL=paper-record.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paper-record.d.ts","sourceRoot":"","sources":["../src/paper-record.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,EAEL,KAAK,MAAM,EACX,KAAK,SAAS,EACd,KAAK,aAAa,EACnB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAG7D,MAAM,MAAM,WAAW;AACrB,uFAAuF;AACrF;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAC7D;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GAC/D;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAA;CAAE,CAAC;AAU/D,qFAAqF;AACrF,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;CAC9B;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,GAAG,WAAW,CAS1E;AAED,iGAAiG;AACjG,eAAO,MAAM,aAAa,GACxB,KAAK,MAAM,EACX,QAAQ,aAAa,EACrB,MAAM,SAAS,KACd,SAAS,YAAY,EAGyB,CAAC"}
|