paperlint 3.1.2 → 3.2.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/.github/workflows/ci.yml +12 -7
- package/CLAUDE.md +3 -3
- package/CONTRIBUTING.md +34 -5
- package/dist/adapters/banal/index.d.ts.map +1 -1
- package/dist/adapters/banal/index.js +9 -5
- package/dist/adapters/banal/index.js.map +1 -1
- package/dist/adapters/banal/invocation.d.ts +1 -1
- package/dist/adapters/node/files.io.d.ts.map +1 -1
- package/dist/adapters/node/files.io.js +2 -1
- package/dist/adapters/node/files.io.js.map +1 -1
- package/dist/adapters/node/process.io.d.ts +0 -5
- package/dist/adapters/node/process.io.d.ts.map +1 -1
- package/dist/adapters/node/process.io.js +4 -3
- package/dist/adapters/node/process.io.js.map +1 -1
- package/dist/adapters/pdfjs/fill.d.ts.map +1 -1
- package/dist/adapters/pdfjs/fill.js +13 -7
- package/dist/adapters/pdfjs/fill.js.map +1 -1
- package/dist/adapters/references/index.d.ts.map +1 -1
- package/dist/adapters/references/index.js +4 -5
- package/dist/adapters/references/index.js.map +1 -1
- package/dist/adapters/references/pool.d.ts.map +1 -1
- package/dist/adapters/references/pool.js +4 -5
- package/dist/adapters/references/pool.js.map +1 -1
- package/dist/adapters/references/reach.io.d.ts.map +1 -1
- package/dist/adapters/references/reach.io.js +2 -1
- package/dist/adapters/references/reach.io.js.map +1 -1
- package/dist/build-engine.js +2 -2
- package/dist/build-engine.js.map +1 -1
- package/dist/build.d.ts.map +1 -1
- package/dist/build.js +14 -11
- package/dist/build.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +31 -34
- package/dist/cli.js.map +1 -1
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +3 -2
- package/dist/doctor.js.map +1 -1
- package/dist/domain/lookup-cache.d.ts.map +1 -1
- package/dist/domain/lookup-cache.js +10 -8
- package/dist/domain/lookup-cache.js.map +1 -1
- package/dist/domain/text.d.ts +12 -0
- package/dist/domain/text.d.ts.map +1 -1
- package/dist/domain/text.js +17 -0
- package/dist/domain/text.js.map +1 -1
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +4 -3
- package/dist/engine.js.map +1 -1
- package/dist/eslint-rules/bib-reachable-entry.d.ts +22 -0
- package/dist/eslint-rules/bib-reachable-entry.d.ts.map +1 -0
- package/dist/eslint-rules/bib-reachable-entry.js +75 -0
- package/dist/eslint-rules/bib-reachable-entry.js.map +1 -0
- package/dist/eslint-rules/install-path-literals.d.ts +80 -0
- package/dist/eslint-rules/install-path-literals.d.ts.map +1 -0
- package/dist/eslint-rules/install-path-literals.js +105 -0
- package/dist/eslint-rules/install-path-literals.js.map +1 -0
- package/dist/eslint-rules/latex-language.d.ts +136 -0
- package/dist/eslint-rules/latex-language.d.ts.map +1 -0
- package/dist/eslint-rules/latex-language.js +639 -0
- package/dist/eslint-rules/latex-language.js.map +1 -0
- package/dist/eslint-rules/paper-research-question.d.ts +31 -0
- package/dist/eslint-rules/paper-research-question.d.ts.map +1 -0
- package/dist/eslint-rules/paper-research-question.js +188 -0
- package/dist/eslint-rules/paper-research-question.js.map +1 -0
- package/dist/eslint-rules/paper-stages.d.ts +83 -0
- package/dist/eslint-rules/paper-stages.d.ts.map +1 -0
- package/dist/eslint-rules/paper-stages.js +358 -0
- package/dist/eslint-rules/paper-stages.js.map +1 -0
- package/dist/eslint-rules/paper-typography.d.ts +74 -0
- package/dist/eslint-rules/paper-typography.d.ts.map +1 -0
- package/dist/eslint-rules/paper-typography.js +404 -0
- package/dist/eslint-rules/paper-typography.js.map +1 -0
- package/dist/eslint-rules/papers.d.ts +42 -0
- package/dist/eslint-rules/papers.d.ts.map +1 -0
- package/dist/eslint-rules/papers.js +145 -0
- package/dist/eslint-rules/papers.js.map +1 -0
- package/dist/eslint-rules/pdf-last-page-balance.d.ts +72 -0
- package/dist/eslint-rules/pdf-last-page-balance.d.ts.map +1 -0
- package/dist/eslint-rules/pdf-last-page-balance.js +237 -0
- package/dist/eslint-rules/pdf-last-page-balance.js.map +1 -0
- package/dist/eslint-rules/review-frontmatter.d.ts +57 -0
- package/dist/eslint-rules/review-frontmatter.d.ts.map +1 -0
- package/dist/eslint-rules/review-frontmatter.js +126 -0
- package/dist/eslint-rules/review-frontmatter.js.map +1 -0
- package/dist/eslint-rules/review-frontmatter.schema.json +36 -0
- package/dist/eslint-rules/rule-context.d.ts +55 -0
- package/dist/eslint-rules/rule-context.d.ts.map +1 -0
- package/dist/eslint-rules/rule-context.js +9 -0
- package/dist/eslint-rules/rule-context.js.map +1 -0
- package/dist/eslint-rules/sibling-frontmatter.d.ts +25 -0
- package/dist/eslint-rules/sibling-frontmatter.d.ts.map +1 -0
- package/dist/eslint-rules/sibling-frontmatter.js +16 -0
- package/dist/eslint-rules/sibling-frontmatter.js.map +1 -0
- package/dist/eslint-rules/sibling-frontmatter.schema.json +14 -0
- package/dist/eslint-rules/temp-root-realpath.d.ts +71 -0
- package/dist/eslint-rules/temp-root-realpath.d.ts.map +1 -0
- package/dist/eslint-rules/temp-root-realpath.js +139 -0
- package/dist/eslint-rules/temp-root-realpath.js.map +1 -0
- package/dist/eslint-rules/tex-build.d.ts +35 -0
- package/dist/eslint-rules/tex-build.d.ts.map +1 -0
- package/dist/eslint-rules/tex-build.js +313 -0
- package/dist/eslint-rules/tex-build.js.map +1 -0
- package/dist/facts-file.d.ts.map +1 -1
- package/dist/facts-file.js +2 -1
- package/dist/facts-file.js.map +1 -1
- package/dist/hooks-settings.d.ts +1 -1
- package/dist/hooks-settings.d.ts.map +1 -1
- package/dist/hooks-settings.js +14 -9
- package/dist/hooks-settings.js.map +1 -1
- package/dist/init.d.ts +5 -5
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +15 -7
- package/dist/init.js.map +1 -1
- package/dist/latex-loop.d.ts +2 -2
- package/dist/latex-loop.d.ts.map +1 -1
- package/dist/latex-loop.js +2 -2
- package/dist/latex-loop.js.map +1 -1
- package/dist/lib/agent-cli-version.d.ts +65 -0
- package/dist/lib/agent-cli-version.d.ts.map +1 -0
- package/dist/lib/agent-cli-version.js +77 -0
- package/dist/lib/agent-cli-version.js.map +1 -0
- package/dist/lib/check.d.ts +19 -0
- package/dist/lib/check.d.ts.map +1 -0
- package/dist/lib/check.js +52 -0
- package/dist/lib/check.js.map +1 -0
- package/dist/lib/markdown.d.ts +180 -0
- package/dist/lib/markdown.d.ts.map +1 -0
- package/dist/lib/markdown.js +302 -0
- package/dist/lib/markdown.js.map +1 -0
- package/dist/lib/paper-config.d.ts +84 -0
- package/dist/lib/paper-config.d.ts.map +1 -0
- package/dist/lib/paper-config.js +142 -0
- package/dist/lib/paper-config.js.map +1 -0
- package/dist/lib/skill-eval-fixture.d.ts +29 -0
- package/dist/lib/skill-eval-fixture.d.ts.map +1 -0
- package/dist/lib/skill-eval-fixture.js +62 -0
- package/dist/lib/skill-eval-fixture.js.map +1 -0
- package/dist/link-skills.d.ts.map +1 -1
- package/dist/link-skills.js +5 -4
- package/dist/link-skills.js.map +1 -1
- package/dist/new-paper.d.ts.map +1 -1
- package/dist/new-paper.js +2 -2
- package/dist/new-paper.js.map +1 -1
- package/dist/paper-settings.d.ts.map +1 -1
- package/dist/paper-settings.js +5 -4
- package/dist/paper-settings.js.map +1 -1
- package/dist/pdf-facts.d.ts.map +1 -1
- package/dist/pdf-facts.js +2 -1
- package/dist/pdf-facts.js.map +1 -1
- package/dist/pdf-geometry.d.ts.map +1 -1
- package/dist/pdf-geometry.js +1 -1
- package/dist/pdf-geometry.js.map +1 -1
- package/dist/presets.d.ts.map +1 -1
- package/dist/presets.js +3 -2
- package/dist/presets.js.map +1 -1
- package/dist/references.d.ts.map +1 -1
- package/dist/references.js +11 -6
- package/dist/references.js.map +1 -1
- package/dist/rules-config.d.ts.map +1 -1
- package/dist/rules-config.js +6 -3
- package/dist/rules-config.js.map +1 -1
- package/dist/structure.js +1 -1
- package/dist/structure.js.map +1 -1
- package/dist/tex-requirements.d.ts.map +1 -1
- package/dist/tex-requirements.js +8 -3
- package/dist/tex-requirements.js.map +1 -1
- package/dist/toolchain.d.ts.map +1 -1
- package/dist/toolchain.js +21 -16
- package/dist/toolchain.js.map +1 -1
- package/dist/venue-rules.js +1 -1
- package/dist/venue-rules.js.map +1 -1
- package/docs/e2e.md +7 -7
- package/docs/install.md +1 -1
- package/docs/prior-art/README.md +1 -1
- package/docs/prior-art/package-location.md +5 -5
- package/docs/prior-art/repro/README.md +1 -1
- package/docs/prior-art/test-tooling.md +2 -2
- package/docs/testing.md +11 -8
- package/docs/toolchain.md +1 -1
- package/eslint-rules/{bib-reachable-entry.mjs → bib-reachable-entry.ts} +4 -3
- package/eslint-rules/install-path-literals.harness.mjs +1 -1
- package/eslint-rules/{install-path-literals.mjs → install-path-literals.ts} +16 -8
- package/eslint-rules/latex-language.harness.mjs +2 -2
- package/eslint-rules/latex-language.test.mjs +7 -1
- package/eslint-rules/{latex-language.mjs → latex-language.ts} +297 -109
- package/eslint-rules/paper-research-question.harness.mjs +3 -3
- package/eslint-rules/{paper-research-question.mjs → paper-research-question.ts} +34 -15
- package/eslint-rules/paper-stages.harness.mjs +2 -2
- package/eslint-rules/paper-stages.test.mjs +8 -2
- package/eslint-rules/{paper-stages.mjs → paper-stages.ts} +74 -29
- package/eslint-rules/paper-typography.test.mjs +3 -3
- package/eslint-rules/{paper-typography.mjs → paper-typography.ts} +132 -54
- package/eslint-rules/papers.harness.mjs +2 -2
- package/eslint-rules/{papers.mjs → papers.ts} +7 -4
- package/eslint-rules/pdf-last-page-balance.harness.mjs +3 -3
- package/eslint-rules/{pdf-last-page-balance.mjs → pdf-last-page-balance.ts} +88 -31
- package/eslint-rules/review-frontmatter.test.mjs +2 -2
- package/eslint-rules/{review-frontmatter.mjs → review-frontmatter.ts} +37 -15
- package/eslint-rules/rule-context.ts +62 -0
- package/eslint-rules/{sibling-frontmatter.mjs → sibling-frontmatter.ts} +1 -1
- package/eslint-rules/temp-root-realpath.harness.mjs +1 -1
- package/eslint-rules/{temp-root-realpath.mjs → temp-root-realpath.ts} +19 -6
- package/eslint-rules/tex-build.harness.mjs +2 -2
- package/eslint-rules/{tex-build.mjs → tex-build.ts} +4 -3
- package/eslint.config.mjs +139 -30
- package/fixtures/pdf-facts/README.md +2 -2
- package/fixtures/real-markdown-paper/{baseline.mjs → baseline.ts} +31 -10
- package/hooks/{hooks.harness.mjs → hooks.harness.ts} +51 -34
- package/hooks/paper-edit-guard.hook.mjs +1 -1
- package/hooks/{paper-edit-guard.test.mjs → paper-edit-guard.test.ts} +3 -7
- package/hooks/paper-skills-nudge.hook.mjs +1 -1
- package/hooks/{paper-skills-nudge.test.mjs → paper-skills-nudge.test.ts} +2 -6
- package/hooks/{paper-status-gates.test.mjs → paper-status-gates.test.ts} +2 -6
- package/lib/agent-cli-version.harness.mjs +1 -1
- package/lib/{agent-cli-version.mjs → agent-cli-version.ts} +32 -18
- package/lib/check.test.ts +14 -9
- package/lib/{check.mjs → check.ts} +22 -9
- package/lib/markdown.test.mjs +7 -7
- package/lib/{markdown.mjs → markdown.ts} +68 -29
- package/lib/paper-config.harness.mjs +8 -8
- package/lib/{paper-config.mjs → paper-config.ts} +19 -14
- package/lib/skill-checks.mjs +1 -1
- package/lib/skill-checks.test.mjs +1 -1
- package/lib/skill-corpus.mjs +1 -1
- package/lib/skill-eval-kit.mjs +1 -1
- package/package.json +42 -10
- package/scripts/{check.harness.mjs → check.harness.ts} +111 -10
- package/scripts/{check.test.mjs → check.test.ts} +13 -10
- package/scripts/{check.mjs → check.ts} +116 -42
- package/scripts/coverage-config.test.ts +80 -37
- package/scripts/eslint-report-guard.test.mjs +1 -1
- package/scripts/harness-api.frozen.json +14 -15
- package/scripts/harness-api.test.ts +8 -5
- package/scripts/layer-legacy-frozen.test.ts +17 -13
- package/scripts/{layer-legacy-frozen.mjs → layer-legacy-frozen.ts} +128 -39
- package/scripts/release-config.test.ts +12 -4
- package/scripts/rules-see-files.test.mjs +1 -1
- package/scripts/test.test.ts +78 -0
- package/scripts/test.ts +87 -0
- package/skills/grade-paper-writing/prose-lint.mjs +1 -1
- package/skills/grade-paper-writing/{prose-lint.test.mjs → prose-lint.test.ts} +2 -2
- package/skills/paper-pipeline/description-language.eval.mjs +1 -1
- package/skills/paper-pipeline/framing-vs-vocabulary.eval.mjs +1 -1
- package/skills/paper-pipeline/grade-paper-writing-ablation.eval.mjs +1 -1
- package/skills/paper-pipeline/pipeline-firing.eval.mjs +1 -1
- package/skills/paper-pipeline/pipeline-language.eval.mjs +1 -1
- package/skills/paper-pipeline/scripts/README.md +1 -1
- package/skills/paper-pipeline/scripts/announce.test.mjs +1 -1
- package/skills/paper-pipeline/scripts/artifact-coverage.mjs +1 -1
- package/skills/paper-pipeline/scripts/{artifact-coverage.test.mjs → artifact-coverage.test.ts} +2 -2
- package/skills/paper-pipeline/scripts/consumer.mjs +1 -5
- package/skills/paper-pipeline/scripts/consumer.test.mjs +1 -1
- package/skills/paper-pipeline/scripts/extract-ref-facts.harness.mjs +1 -1
- package/skills/paper-pipeline/scripts/extract-ref-facts.mjs +1 -4
- package/skills/paper-pipeline/scripts/extract-ref-facts.test.mjs +1 -1
- package/skills/paper-pipeline/scripts/fixtures/{scorecard.mjs → scorecard.ts} +36 -7
- package/skills/paper-pipeline/scripts/{generated-code.test.mjs → generated-code.test.ts} +3 -3
- package/skills/paper-pipeline/scripts/ledger.cli.test.mjs +1 -1
- package/skills/paper-pipeline/scripts/pipeline-check.cli.test.mjs +2 -2
- package/skills/paper-pipeline/scripts/pipeline-check.harness.mjs +2 -2
- package/skills/paper-pipeline/scripts/pipeline-check.mjs +1 -4
- package/skills/paper-pipeline/scripts/population-map.mjs +1 -4
- package/skills/paper-pipeline/scripts/population-map.test.mjs +1 -1
- package/skills/paper-pipeline/scripts/{round-diff.harness.mjs → round-diff.harness.ts} +45 -18
- package/skills/paper-pipeline/scripts/round-diff.mjs +1 -1
- package/skills/paper-pipeline/scripts/round-diff.test.mjs +1 -1
- package/skills/paper-pipeline/scripts/run-mechanical.test.mjs +1 -1
- package/skills/paper-pipeline/scripts/status.test.mjs +1 -1
- package/skills/plan-paper-timeline/fixtures/{fake-google-calendar.mjs → fake-google-calendar.ts} +101 -70
- package/skills/plan-paper-timeline/plan-paper-timeline.effects.harness.mjs +3 -3
- package/skills/render-paper/{extract-pdf-facts.harness.mjs → extract-pdf-facts.harness.ts} +34 -9
- package/skills/render-paper/render-paper.harness.mjs +2 -2
- package/skills/tighten-paper/structure.mjs +1 -1
- package/skills/tighten-paper/{structure.test.mjs → structure.test.ts} +4 -3
- package/skills/verify-citations/scripts/{bib-authors.cli.test.mjs → bib-authors.cli.test.ts} +14 -4
- package/skills/verify-citations/scripts/bib-authors.d.mts +63 -0
- package/skills/verify-citations/scripts/bib-authors.mjs +1 -4
- package/skills/verify-citations/scripts/{verify-cites.cli.test.mjs → verify-cites.cli.test.ts} +32 -9
- package/skills/verify-citations/scripts/verify-cites.d.mts +58 -0
- package/skills/verify-citations/scripts/verify-cites.mjs +11 -1
- package/skills/verify-citations/scripts/verify-cites.net.test.mjs +35 -0
- package/skills/verify-citations/scripts/verify-cites.test.mjs +14 -0
- package/src/CLAUDE.md +1 -1
- package/src/adapters/banal/index.test.ts +3 -6
- package/src/adapters/banal/index.ts +7 -4
- package/src/adapters/banal/invocation.test.ts +3 -1
- package/src/adapters/banal/invocation.ts +1 -1
- package/src/adapters/banal/output.test.ts +1 -1
- package/src/adapters/banal/run.test.ts +3 -3
- package/src/adapters/banal/xml.test.ts +1 -1
- package/src/adapters/curl/download.test.ts +4 -2
- package/src/adapters/node/files.io.ts +2 -2
- package/src/adapters/node/files.test.ts +3 -1
- package/src/adapters/node/process.io.ts +4 -3
- package/src/adapters/node/process.test.ts +1 -1
- package/src/adapters/node/workspace.test.ts +3 -1
- package/src/adapters/pdfjs/fill.test.ts +2 -2
- package/src/adapters/pdfjs/fill.ts +14 -7
- package/src/adapters/references/index.test.ts +31 -38
- package/src/adapters/references/index.ts +26 -58
- package/src/adapters/references/pool.ts +3 -5
- package/src/adapters/references/reach.io.ts +2 -1
- package/src/build-engine.harness.mjs +1 -1
- package/src/build-engine.test.ts +2 -2
- package/src/build-engine.ts +2 -2
- package/src/build.harness.mjs +2 -2
- package/src/build.test.ts +15 -14
- package/src/build.ts +28 -19
- package/src/cli.harness.mjs +6 -6
- package/src/cli.test.ts +13 -6
- package/src/cli.ts +39 -37
- package/src/doctor.harness.mjs +3 -3
- package/src/doctor.ts +3 -2
- package/src/domain/lookup-cache.ts +21 -11
- package/src/domain/result.test.ts +2 -2
- package/src/domain/text.test.ts +32 -0
- package/src/domain/text.ts +23 -0
- package/src/engine.harness.mjs +2 -2
- package/src/engine.ts +4 -3
- package/src/facts-file.test.ts +9 -7
- package/src/facts-file.ts +2 -1
- package/src/{hooks-settings.harness.mjs → hooks-settings.harness.ts} +39 -20
- package/src/hooks-settings.ts +20 -9
- package/src/init.test.ts +12 -9
- package/src/init.ts +22 -12
- package/src/{latex-log.harness.mjs → latex-log.harness.ts} +14 -14
- package/src/{latex-loop.harness.mjs → latex-loop.harness.ts} +64 -36
- package/src/latex-loop.ts +3 -3
- package/src/{link-skills.harness.mjs → link-skills.harness.ts} +19 -19
- package/src/link-skills.test.ts +3 -3
- package/src/link-skills.ts +5 -4
- package/src/lint-fix.test.ts +4 -6
- package/src/linted-set.test.ts +2 -2
- package/src/new-paper.harness.mjs +2 -2
- package/src/new-paper.test.ts +8 -10
- package/src/new-paper.ts +2 -2
- package/src/paper-files.test.ts +3 -5
- package/src/paper-settings-commands.test.ts +5 -4
- package/src/paper-settings.test.ts +5 -5
- package/src/paper-settings.ts +8 -9
- package/src/{pdf-facts.harness.mjs → pdf-facts.harness.ts} +9 -8
- package/src/pdf-facts.test.ts +10 -11
- package/src/pdf-facts.ts +2 -1
- package/src/{pdf-geometry.harness.mjs → pdf-geometry.harness.ts} +19 -12
- package/src/pdf-geometry.ts +3 -1
- package/src/presets.ts +3 -2
- package/src/references.test.ts +51 -43
- package/src/references.ts +14 -7
- package/src/{rules-config.harness.mjs → rules-config.harness.ts} +7 -13
- package/src/rules-config.ts +7 -4
- package/src/rules-off.test.ts +6 -4
- package/src/{structure.harness.mjs → structure.harness.ts} +26 -15
- package/src/structure.ts +1 -1
- package/src/{tex-requirements.harness.mjs → tex-requirements.harness.ts} +50 -22
- package/src/tex-requirements.ts +8 -5
- package/src/toolchain.harness.mjs +2 -2
- package/src/toolchain.test.ts +1 -1
- package/src/toolchain.ts +31 -17
- package/src/venue-rules.test.ts +62 -64
- package/src/venue-rules.ts +1 -1
- package/tsconfig.json +6 -3
- package/tsconfig.pkg.json +10 -0
- package/lib/check.d.mts +0 -17
- package/lib/paper-config.d.mts +0 -31
- package/scripts/layer-legacy-frozen.d.mts +0 -36
- package/scripts/rules-are-content-only.harness.mjs +0 -105
- package/scripts/rules-are-content-only.mjs +0 -148
- package/scripts/rules-are-content-only.test.mjs +0 -61
- package/scripts/test.mjs +0 -44
- package/scripts/test.test.mjs +0 -52
- /package/bin/{paperlint.test.mjs → paperlint.test.ts} +0 -0
- /package/lib/{skill-eval-fixture.mjs → skill-eval-fixture.ts} +0 -0
- /package/skills/grade-paper-writing/__snapshots__/{prose-lint.test.mjs.snap → prose-lint.test.ts.snap} +0 -0
- /package/skills/osf-artifact-upload/{osf-artifact-upload.harness.mjs → osf-artifact-upload.harness.ts} +0 -0
- /package/skills/tighten-paper/__snapshots__/{structure.test.mjs.snap → structure.test.ts.snap} +0 -0
package/dist/doctor.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,6FAA6F;AAC7F,OAAO,EAAe,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpD,6FAA6F;AAC7F,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,kGAAkG;AAClG,kDAAkD;AAClD,OAAO,EACL,UAAU,EACV,mBAAmB,EACnB,gBAAgB,EAChB,WAAW,GACZ,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,WAAW,EAAmB,MAAM,kBAAkB,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lookup-cache.d.ts","sourceRoot":"","sources":["../../src/domain/lookup-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"lookup-cache.d.ts","sourceRoot":"","sources":["../../src/domain/lookup-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AAGnD,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAErC,KAAK,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAE9C,8FAA8F;AAC9F,MAAM,WAAW,cAAc;IAC7B,uCAAuC;IACvC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC;CACzB;AAED,0DAA0D;AAC1D,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,gHAAgH;IAChH,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,SAAS,OAAO,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACxD,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;CAChD;AAED,eAAO,MAAM,kBAAkB,EAAE,WAGhC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,YAAY,KAAK,CAAC;AAK/B,qFAAqF;AACrF,wBAAgB,SAAS,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,WAAW,CAUxE;AAuED,qDAAqD;AACrD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CA8B1E;AAKD,sFAAsF;AACtF,eAAO,MAAM,oBAAoB,GAAI,GAAG,WAAW,KAAG,MAS/C,CAAC"}
|
|
@@ -31,6 +31,7 @@
|
|
|
31
31
|
* never read as empty.
|
|
32
32
|
*/
|
|
33
33
|
import { err, ok } from "./result.js";
|
|
34
|
+
import { messageOf } from "./text.js";
|
|
34
35
|
export const LOOKUP_CACHE_SCHEMA = 1;
|
|
35
36
|
export const EMPTY_LOOKUP_CACHE = {
|
|
36
37
|
citations: new Map(),
|
|
@@ -72,23 +73,24 @@ function sectionOf(name, section, known, one) {
|
|
|
72
73
|
const extra = unknownField(v, known);
|
|
73
74
|
if (extra !== undefined)
|
|
74
75
|
return err(`${at}\`: unknown field \`${extra}\``);
|
|
75
|
-
|
|
76
|
+
const fetched = v["fetched"];
|
|
77
|
+
if (!isDate(fetched))
|
|
76
78
|
return err(`${at}.fetched\`: expected a date, YYYY-MM-DD`);
|
|
77
|
-
const r = one(v, at);
|
|
79
|
+
const r = one(v, fetched, at);
|
|
78
80
|
if (!r.ok)
|
|
79
81
|
return r;
|
|
80
82
|
out.set(key, r.value);
|
|
81
83
|
}
|
|
82
84
|
return ok(out);
|
|
83
85
|
}
|
|
84
|
-
const cachedResponse = (o, at) => isObject(o["response"]) && o["response"]["transport"] === "ok"
|
|
85
|
-
? ok({ fetched
|
|
86
|
+
const cachedResponse = (o, fetched, at) => isObject(o["response"]) && o["response"]["transport"] === "ok"
|
|
87
|
+
? ok({ fetched, response: o["response"] })
|
|
86
88
|
: err(`${at}.response\`: expected a successful response ({"transport": "ok", …})`);
|
|
87
89
|
const isHit = (h) => isObject(h) &&
|
|
88
90
|
["venue", "year", "type", "title"].every((k) => typeof h[k] === "string") &&
|
|
89
91
|
Array.isArray(h["authors"]) &&
|
|
90
92
|
h["authors"].every((a) => typeof a === "string");
|
|
91
|
-
function cachedDblp(o, at) {
|
|
93
|
+
function cachedDblp(o, fetched, at) {
|
|
92
94
|
const { title, hits } = o;
|
|
93
95
|
if (typeof title !== "string")
|
|
94
96
|
return err(`${at}.title\`: expected a string`);
|
|
@@ -98,9 +100,9 @@ function cachedDblp(o, at) {
|
|
|
98
100
|
if (bad !== -1)
|
|
99
101
|
return err(`${at}.hits[${String(bad)}]\`: expected {venue, year, type, title: string; authors: string[]}`);
|
|
100
102
|
return ok({
|
|
101
|
-
fetched
|
|
103
|
+
fetched,
|
|
102
104
|
title,
|
|
103
|
-
hits: hits,
|
|
105
|
+
hits: hits.filter(isHit),
|
|
104
106
|
});
|
|
105
107
|
}
|
|
106
108
|
/** The cache in `text`, or why it cannot be read. */
|
|
@@ -110,7 +112,7 @@ export function parseLookupCache(text) {
|
|
|
110
112
|
json = JSON.parse(text);
|
|
111
113
|
}
|
|
112
114
|
catch (e) {
|
|
113
|
-
return err(`not JSON: ${e
|
|
115
|
+
return err(`not JSON: ${messageOf(e)}`);
|
|
114
116
|
}
|
|
115
117
|
if (!isObject(json))
|
|
116
118
|
return err("expected an object with `schema`, `citations` and `dblp`");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lookup-cache.js","sourceRoot":"","sources":["../../src/domain/lookup-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,OAAO,EAAE,GAAG,EAAE,EAAE,EAAe,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"lookup-cache.js","sourceRoot":"","sources":["../../src/domain/lookup-cache.ts"],"names":[],"mappings":"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"}
|
package/dist/domain/text.d.ts
CHANGED
|
@@ -3,4 +3,16 @@
|
|
|
3
3
|
export type Lines = readonly [string, ...string[]];
|
|
4
4
|
/** The first non-blank line of a stream — what a failure shows. */
|
|
5
5
|
export declare const firstLine: (s: string) => string;
|
|
6
|
+
/**
|
|
7
|
+
* What a process printed on one stream, as text. Node types `spawnSync(…, { encoding })`'s
|
|
8
|
+
* `stdout`/`stderr` as `string`, but both are `undefined` when the spawn itself failed (measured:
|
|
9
|
+
* `spawnSync("no-such-program", [], { encoding: "utf8" }).stdout` is `undefined`). The parameter
|
|
10
|
+
* takes the stream as it really arrives, so the fallback guards a real case instead of reading
|
|
11
|
+
* as dead code against a type that lies.
|
|
12
|
+
*/
|
|
13
|
+
export declare const printed: (stream: string | null | undefined) => string;
|
|
14
|
+
/** What a caught value says: an `Error`'s message, anything else as text (`catch` gets `unknown`). */
|
|
15
|
+
export declare const messageOf: (e: unknown) => string;
|
|
16
|
+
/** The `code` a Node error carries (`ENOENT`, `EACCES`, …), when it carries a string one. */
|
|
17
|
+
export declare const codeOf: (e: unknown) => string | undefined;
|
|
6
18
|
//# sourceMappingURL=text.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/domain/text.ts"],"names":[],"mappings":"AAAA,oGAAoG;AAEpG,+FAA+F;AAC/F,MAAM,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;AAEnD,mEAAmE;AACnE,eAAO,MAAM,SAAS,GAAI,GAAG,MAAM,KAAG,MAId,CAAC"}
|
|
1
|
+
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/domain/text.ts"],"names":[],"mappings":"AAAA,oGAAoG;AAEpG,+FAA+F;AAC/F,MAAM,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;AAEnD,mEAAmE;AACnE,eAAO,MAAM,SAAS,GAAI,GAAG,MAAM,KAAG,MAId,CAAC;AAEzB;;;;;;GAMG;AACH,eAAO,MAAM,OAAO,GAAI,QAAQ,MAAM,GAAG,IAAI,GAAG,SAAS,KAAG,MAC9C,CAAC;AAEf,sGAAsG;AACtG,eAAO,MAAM,SAAS,GAAI,GAAG,OAAO,KAAG,MACK,CAAC;AAE7C,6FAA6F;AAC7F,eAAO,MAAM,MAAM,GAAI,GAAG,OAAO,KAAG,MAAM,GAAG,SAM9B,CAAC"}
|
package/dist/domain/text.js
CHANGED
|
@@ -4,4 +4,21 @@ export const firstLine = (s) => s
|
|
|
4
4
|
.split("\n")
|
|
5
5
|
.map((l) => l.trim())
|
|
6
6
|
.find(Boolean) ?? "";
|
|
7
|
+
/**
|
|
8
|
+
* What a process printed on one stream, as text. Node types `spawnSync(…, { encoding })`'s
|
|
9
|
+
* `stdout`/`stderr` as `string`, but both are `undefined` when the spawn itself failed (measured:
|
|
10
|
+
* `spawnSync("no-such-program", [], { encoding: "utf8" }).stdout` is `undefined`). The parameter
|
|
11
|
+
* takes the stream as it really arrives, so the fallback guards a real case instead of reading
|
|
12
|
+
* as dead code against a type that lies.
|
|
13
|
+
*/
|
|
14
|
+
export const printed = (stream) => stream ?? "";
|
|
15
|
+
/** What a caught value says: an `Error`'s message, anything else as text (`catch` gets `unknown`). */
|
|
16
|
+
export const messageOf = (e) => e instanceof Error ? e.message : String(e);
|
|
17
|
+
/** The `code` a Node error carries (`ENOENT`, `EACCES`, …), when it carries a string one. */
|
|
18
|
+
export const codeOf = (e) => typeof e === "object" &&
|
|
19
|
+
e !== null &&
|
|
20
|
+
"code" in e &&
|
|
21
|
+
typeof e.code === "string"
|
|
22
|
+
? e.code
|
|
23
|
+
: undefined;
|
|
7
24
|
//# sourceMappingURL=text.js.map
|
package/dist/domain/text.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/domain/text.ts"],"names":[],"mappings":"AAAA,oGAAoG;AAKpG,mEAAmE;AACnE,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAS,EAAU,EAAE,CAC7C,CAAC;KACE,KAAK,CAAC,IAAI,CAAC;KACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;KACpB,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC"}
|
|
1
|
+
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/domain/text.ts"],"names":[],"mappings":"AAAA,oGAAoG;AAKpG,mEAAmE;AACnE,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAS,EAAU,EAAE,CAC7C,CAAC;KACE,KAAK,CAAC,IAAI,CAAC;KACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;KACpB,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;AAEzB;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,MAAiC,EAAU,EAAE,CACnE,MAAM,IAAI,EAAE,CAAC;AAEf,sGAAsG;AACtG,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAU,EAAU,EAAE,CAC9C,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAE7C,6FAA6F;AAC7F,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,CAAU,EAAsB,EAAE,CACvD,OAAO,CAAC,KAAK,QAAQ;IACrB,CAAC,KAAK,IAAI;IACV,MAAM,IAAI,CAAC;IACX,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ;IACxB,CAAC,CAAC,CAAC,CAAC,IAAI;IACR,CAAC,CAAC,SAAS,CAAC"}
|
package/dist/engine.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAI/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAI/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAG7D,iFAAiF;AACjF,MAAM,MAAM,MAAM,GAAG,OAAO,SAAS,CAAC;AAEtC,6DAA6D;AAC7D,MAAM,WAAW,SAAS;IACxB,yFAAyF;IACzF,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,wDAAwD;IACxD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,4EAA4E;IAC5E,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAED,MAAM,WAAW,WAAW;IAC1B,+CAA+C;IAC/C,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,wEAAwE;IACxE,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;IACjC,mEAAmE;IACnE,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC;IAClC,yEAAyE;IACzE,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,qFAAqF;IACrF,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAED,MAAM,MAAM,cAAc,GACtB;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CAAE,GACxD;IAAE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CAAE,GACzD;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GAC7D;IACE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,aAAa,GAAG,eAAe,CAAC;IACjD,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC,CAAC;AAEN;;;GAGG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,WAAW,GAAG,cAAc,CAS5D;AAID,oGAAoG;AACpG,eAAO,MAAM,iBAAiB,GAAI,UAAU,MAAM,CAAC,QAAQ,KAAG,OACf,CAAC;AAEhD;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,eAAe,CAAC,UAAU,CAAC,EACrC,KAAK,EAAE,MAAM,GACZ,MAAM,EAAE,CAYV;AAED;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EAEZ,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAC3C,OAAO,CAQT;AAED,sEAAsE;AACtE,wBAAgB,YAAY,CAC1B,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC,EAC/B,GAAG,EAAE,MAAM,EACX,MAAM,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAsB,GAC/C,MAAM,EAAE,CAKV;AAOD;;;GAGG;AACH,wBAAgB,SAAS,CACvB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,eAAe,CAAC,UAAU,CAAC,EACrC,GAAG,GAAE,MAAkB,GACtB,MAAM,EAAE,CASV;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,EACX,GAAG,GAAE,MAAkB,GACtB,MAAM,EAAE,CAsBV;AAED,wFAAwF;AACxF,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,MAAM,GAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAsB,GAC5C,MAAM,GAAG,IAAI,CAIf"}
|
package/dist/engine.js
CHANGED
|
@@ -23,6 +23,7 @@ import { spawnSync } from "node:child_process";
|
|
|
23
23
|
// eslint-disable-next-line boundaries/dependencies -- legacy I/O, moves behind a port in #76
|
|
24
24
|
import { accessSync, constants, statSync } from "node:fs";
|
|
25
25
|
import { basename, delimiter, join } from "node:path";
|
|
26
|
+
import { printed } from "./domain/text.js";
|
|
26
27
|
/**
|
|
27
28
|
* The decision. `missing` in `ask` and `refuse` is what `paperlint toolchain` would install: the cache's
|
|
28
29
|
* gaps when a cache exists, every required package when it does not.
|
|
@@ -107,7 +108,7 @@ export function probeTree(bin, packages, run = spawnSync) {
|
|
|
107
108
|
});
|
|
108
109
|
if (r.error)
|
|
109
110
|
return Object.keys(packages).sort();
|
|
110
|
-
return missingPackages(packages,
|
|
111
|
+
return missingPackages(packages, printed(r.stdout));
|
|
111
112
|
}
|
|
112
113
|
/**
|
|
113
114
|
* Packages the tree's OWN database lists as dependencies but never installed, by its `tlmgr check
|
|
@@ -124,7 +125,7 @@ export function missingDependencies(bin, run = spawnSync) {
|
|
|
124
125
|
});
|
|
125
126
|
if (r.error)
|
|
126
127
|
return [];
|
|
127
|
-
const lines =
|
|
128
|
+
const lines = printed(r.stdout).split("\n");
|
|
128
129
|
const start = lines.findIndex((l) => l.trim() === "DEPENDS WITHOUT PACKAGES:");
|
|
129
130
|
if (start < 0)
|
|
130
131
|
return [];
|
|
@@ -133,7 +134,7 @@ export function missingDependencies(bin, run = spawnSync) {
|
|
|
133
134
|
const section = lines.slice(start + 1);
|
|
134
135
|
const end = section.findIndex((l) => l !== l.trimStart() || !l.trim());
|
|
135
136
|
return [
|
|
136
|
-
...new Set((end < 0 ? section : section.slice(0, end)).map((l) => l.
|
|
137
|
+
...new Set((end < 0 ? section : section.slice(0, end)).map((l) => l.replace(/ in: [\s\S]*/, "").trim())),
|
|
137
138
|
].sort();
|
|
138
139
|
}
|
|
139
140
|
/** The first directory on `path` holding a runnable `name` — what a shell would run. */
|
package/dist/engine.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,6FAA6F;AAC7F,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,6FAA6F;AAC7F,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { RuleContext } from "./rule-context.ts";
|
|
2
|
+
declare const _default: {
|
|
3
|
+
rules: {
|
|
4
|
+
"reachable-entry": {
|
|
5
|
+
meta: {
|
|
6
|
+
type: string;
|
|
7
|
+
docs: {
|
|
8
|
+
description: string;
|
|
9
|
+
};
|
|
10
|
+
schema: never[];
|
|
11
|
+
messages: {
|
|
12
|
+
unreachable: string;
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
create(context: RuleContext): {
|
|
16
|
+
"root:exit"(): void;
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
export default _default;
|
|
22
|
+
//# sourceMappingURL=bib-reachable-entry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bib-reachable-entry.d.ts","sourceRoot":"","sources":["../../eslint-rules/bib-reachable-entry.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;;;;;;;;;;;;;;4BAsB/B,WAAW;;;;;;AAfjC,wBA4CE"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `bib/reachable-entry` — a bibliography entry a reader cannot follow: no doi, no url, no arXiv
|
|
3
|
+
* id. Reported ON THE ENTRY, one finding per entry; there is no fix, because the link has to be
|
|
4
|
+
* looked up. Default severity: warn.
|
|
5
|
+
*
|
|
6
|
+
* Provenance: Reviewer A on HotCRP #20 (2026-08-23), "not every entry has a DOI/link" — one
|
|
7
|
+
* paper had 0 of 47 entries reachable. Until 3.0.0 this was one count inside `paper/typography`,
|
|
8
|
+
* silenced per paper by a declared debt; now each entry is its own finding, and an entry that
|
|
9
|
+
* genuinely has no link (a talk, a personal communication) carries a disable directive with its
|
|
10
|
+
* reason, in the bibliography itself:
|
|
11
|
+
*
|
|
12
|
+
* % eslint-disable-next-line bib/reachable-entry -- an invited talk, no recording exists
|
|
13
|
+
* @misc{smith2024talk, …}
|
|
14
|
+
*
|
|
15
|
+
* ⚠️ NOT "no doi". Measured 2026-08-24: ICLR/NeurIPS/TMLR issue no DOIs at all, so a doi-only
|
|
16
|
+
* rule would demand something that does not exist and get muted for lying. A url or an arXiv id
|
|
17
|
+
* counts.
|
|
18
|
+
*
|
|
19
|
+
* The bibliography read is the one INSIDE `paper.tex` (`filecontents`), where the papers this
|
|
20
|
+
* package targets keep it. The entry boundaries and fields are found by a line-anchored `@` and
|
|
21
|
+
* a field name followed by `=` — BibTeX's own lexical shape, one lexeme at a time, not a parse:
|
|
22
|
+
* the parser (`@retorquere/bibtex-parser`) is an OPTIONAL peer of this package.
|
|
23
|
+
*/
|
|
24
|
+
import { bibRange } from "./paper-typography.js";
|
|
25
|
+
/** Entry types that are not references. */
|
|
26
|
+
const NOT_AN_ENTRY = /^@(comment|string|preamble)\b/i;
|
|
27
|
+
const HAS_LINK = /\b(doi|url)\s*=/i;
|
|
28
|
+
const HAS_ARXIV = /arxiv[:\s]*\d{4}\.\d{4,5}/i;
|
|
29
|
+
export default {
|
|
30
|
+
rules: {
|
|
31
|
+
"reachable-entry": {
|
|
32
|
+
meta: {
|
|
33
|
+
type: "suggestion",
|
|
34
|
+
docs: {
|
|
35
|
+
description: "a bibliography entry carries a doi, a url or an arXiv id — something a reader can follow",
|
|
36
|
+
},
|
|
37
|
+
schema: [],
|
|
38
|
+
messages: {
|
|
39
|
+
unreachable: "`{{key}}` has no doi, url or arXiv id — a reader has nothing to follow. If none exists, keep the exception with `% eslint-disable-next-line bib/reachable-entry -- <why>` above the entry",
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
create(context) {
|
|
43
|
+
return {
|
|
44
|
+
"root:exit"() {
|
|
45
|
+
const sc = context.sourceCode;
|
|
46
|
+
const raw = sc.raw ?? sc.text;
|
|
47
|
+
const bib = typeof raw === "string" ? bibRange(raw) : null;
|
|
48
|
+
if (!bib)
|
|
49
|
+
return;
|
|
50
|
+
const starts = [...bib.body.matchAll(/^@/gm)].map((m) => m.index);
|
|
51
|
+
starts.forEach((s, i) => {
|
|
52
|
+
const entry = bib.body.slice(s, starts[i + 1] ?? bib.body.length);
|
|
53
|
+
if (NOT_AN_ENTRY.test(entry))
|
|
54
|
+
return;
|
|
55
|
+
if (HAS_LINK.test(entry) || HAS_ARXIV.test(entry))
|
|
56
|
+
return;
|
|
57
|
+
const [head = ""] = entry.split("\n");
|
|
58
|
+
const key = /\{\s*([^,\s]+)/.exec(head)?.[1] ?? "?";
|
|
59
|
+
const from = bib.bodyStart + s;
|
|
60
|
+
context.report({
|
|
61
|
+
loc: {
|
|
62
|
+
start: sc.getLocFromIndex(from),
|
|
63
|
+
end: sc.getLocFromIndex(from + head.length),
|
|
64
|
+
},
|
|
65
|
+
messageId: "unreachable",
|
|
66
|
+
data: { key },
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
//# sourceMappingURL=bib-reachable-entry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bib-reachable-entry.js","sourceRoot":"","sources":["../../eslint-rules/bib-reachable-entry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAGjD,2CAA2C;AAC3C,MAAM,YAAY,GAAG,gCAAgC,CAAC;AACtD,MAAM,QAAQ,GAAG,kBAAkB,CAAC;AACpC,MAAM,SAAS,GAAG,4BAA4B,CAAC;AAE/C,eAAe;IACb,KAAK,EAAE;QACL,iBAAiB,EAAE;YACjB,IAAI,EAAE;gBACJ,IAAI,EAAE,YAAY;gBAClB,IAAI,EAAE;oBACJ,WAAW,EACT,0FAA0F;iBAC7F;gBACD,MAAM,EAAE,EAAE;gBACV,QAAQ,EAAE;oBACR,WAAW,EACT,2LAA2L;iBAC9L;aACF;YACD,MAAM,CAAC,OAAoB;gBACzB,OAAO;oBACL,WAAW;wBACT,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC;wBAC9B,MAAM,GAAG,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,IAAI,CAAC;wBAC9B,MAAM,GAAG,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;wBAC3D,IAAI,CAAC,GAAG;4BAAE,OAAO;wBACjB,MAAM,MAAM,GAAG,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;wBAClE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;4BACtB,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;4BAClE,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;gCAAE,OAAO;4BACrC,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;gCAAE,OAAO;4BAC1D,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;4BACtC,MAAM,GAAG,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;4BACpD,MAAM,IAAI,GAAG,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC;4BAC/B,OAAO,CAAC,MAAM,CAAC;gCACb,GAAG,EAAE;oCACH,KAAK,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC;oCAC/B,GAAG,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;iCAC5C;gCACD,SAAS,EAAE,aAAa;gCACxB,IAAI,EAAE,EAAE,GAAG,EAAE;6BACd,CAAC,CAAC;wBACL,CAAC,CAAC,CAAC;oBACL,CAAC;iBACF,CAAC;YACJ,CAAC;SACF;KACF;CACF,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rule 10's mechanical half: nothing outside the port may name a file by WHERE IT IS
|
|
3
|
+
* INSTALLED.
|
|
4
|
+
*
|
|
5
|
+
* The class this exists for has broken this repository five times, silently every time, and
|
|
6
|
+
* the detail is in `docs/incidents.md`. What matters for the code below is the shape of the
|
|
7
|
+
* defect: a path that is correct in one install channel and absent in another. There are
|
|
8
|
+
* three channels and each has its own give-away prefix — the consumer's skills directory
|
|
9
|
+
* (the symlink channel), the package directory npm creates, and the plugin cache. A literal
|
|
10
|
+
* naming any of them is a bet on the channel, made by a file that has no business knowing
|
|
11
|
+
* which channel it is in.
|
|
12
|
+
*
|
|
13
|
+
* WHY TWO RULES RATHER THAN ONE. The literals live in two different languages: markdown, in
|
|
14
|
+
* a skill's own prose and in its `allowed-tools` frontmatter, and JavaScript, in the modules
|
|
15
|
+
* this package ships. A single rule cannot visit both — ESLint hands a rule the AST of
|
|
16
|
+
* whatever language the file is, and the node types share nothing. So the detector is shared
|
|
17
|
+
* and the visitors are not.
|
|
18
|
+
*
|
|
19
|
+
* WHY NOT A GREP OVER THE FILE. In markdown the give-away sits inside a fenced block, inline
|
|
20
|
+
* code, or a YAML frontmatter value, and a text scan cannot tell those from a sentence that
|
|
21
|
+
* merely discusses the hazard — which is exactly what `CLAUDE.md` and `docs/incidents.md` do.
|
|
22
|
+
* The parser can: this rule sees nodes, and it is pointed only at skills.
|
|
23
|
+
*/
|
|
24
|
+
import type { RuleContext } from "./rule-context.ts";
|
|
25
|
+
declare const CHANNEL_PREFIXES: string[];
|
|
26
|
+
/** The first channel prefix appearing in `s`, or null. Plain substring: a path IS a string. */
|
|
27
|
+
declare function channelPrefixIn(s: unknown): string | null;
|
|
28
|
+
declare const PORT = "skills/paper-pipeline/scripts/consumer.mjs";
|
|
29
|
+
declare const _default: {
|
|
30
|
+
rules: {
|
|
31
|
+
"md-install-path": {
|
|
32
|
+
meta: {
|
|
33
|
+
type: string;
|
|
34
|
+
docs: {
|
|
35
|
+
description: string;
|
|
36
|
+
};
|
|
37
|
+
schema: never[];
|
|
38
|
+
messages: Readonly<Record<string, string>>;
|
|
39
|
+
};
|
|
40
|
+
create(context: RuleContext): {
|
|
41
|
+
yaml: (node: {
|
|
42
|
+
readonly value?: unknown;
|
|
43
|
+
}) => void;
|
|
44
|
+
code: (node: {
|
|
45
|
+
readonly value?: unknown;
|
|
46
|
+
}) => void;
|
|
47
|
+
inlineCode: (node: {
|
|
48
|
+
readonly value?: unknown;
|
|
49
|
+
}) => void;
|
|
50
|
+
text: (node: {
|
|
51
|
+
readonly value?: unknown;
|
|
52
|
+
}) => void;
|
|
53
|
+
};
|
|
54
|
+
};
|
|
55
|
+
"js-install-path": {
|
|
56
|
+
meta: {
|
|
57
|
+
type: string;
|
|
58
|
+
docs: {
|
|
59
|
+
description: string;
|
|
60
|
+
};
|
|
61
|
+
schema: never[];
|
|
62
|
+
messages: Readonly<Record<string, string>>;
|
|
63
|
+
};
|
|
64
|
+
create(context: RuleContext): {
|
|
65
|
+
Literal(node: {
|
|
66
|
+
readonly value: unknown;
|
|
67
|
+
}): void;
|
|
68
|
+
TemplateElement(node: {
|
|
69
|
+
readonly value?: {
|
|
70
|
+
readonly cooked?: string | null;
|
|
71
|
+
readonly raw: string;
|
|
72
|
+
};
|
|
73
|
+
}): void;
|
|
74
|
+
};
|
|
75
|
+
};
|
|
76
|
+
};
|
|
77
|
+
};
|
|
78
|
+
export default _default;
|
|
79
|
+
export { channelPrefixIn, CHANNEL_PREFIXES, PORT };
|
|
80
|
+
//# sourceMappingURL=install-path-literals.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-path-literals.d.ts","sourceRoot":"","sources":["../../eslint-rules/install-path-literals.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD,QAAA,MAAM,gBAAgB,UAKrB,CAAC;AAEF,+FAA+F;AAC/F,iBAAS,eAAe,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAIlD;AAKD,QAAA,MAAM,IAAI,+CAA+C,CAAC;;;;;;;;;;;;4BAqBxC,WAAW;6BACJ;oBAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;iBAAE;6BAA5B;oBAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;iBAAE;mCAA5B;oBAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;iBAAE;6BAA5B;oBAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;iBAAE;;;;;;;;;;;;4BAsBnC,WAAW;8BAKT;oBAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;iBAAE;sCAMnB;oBACpB,QAAQ,CAAC,KAAK,CAAC,EAAE;wBACf,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;wBAChC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;qBACtB,CAAC;iBACH;;;;;AAQP,wBAEE;AACF,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rule 10's mechanical half: nothing outside the port may name a file by WHERE IT IS
|
|
3
|
+
* INSTALLED.
|
|
4
|
+
*
|
|
5
|
+
* The class this exists for has broken this repository five times, silently every time, and
|
|
6
|
+
* the detail is in `docs/incidents.md`. What matters for the code below is the shape of the
|
|
7
|
+
* defect: a path that is correct in one install channel and absent in another. There are
|
|
8
|
+
* three channels and each has its own give-away prefix — the consumer's skills directory
|
|
9
|
+
* (the symlink channel), the package directory npm creates, and the plugin cache. A literal
|
|
10
|
+
* naming any of them is a bet on the channel, made by a file that has no business knowing
|
|
11
|
+
* which channel it is in.
|
|
12
|
+
*
|
|
13
|
+
* WHY TWO RULES RATHER THAN ONE. The literals live in two different languages: markdown, in
|
|
14
|
+
* a skill's own prose and in its `allowed-tools` frontmatter, and JavaScript, in the modules
|
|
15
|
+
* this package ships. A single rule cannot visit both — ESLint hands a rule the AST of
|
|
16
|
+
* whatever language the file is, and the node types share nothing. So the detector is shared
|
|
17
|
+
* and the visitors are not.
|
|
18
|
+
*
|
|
19
|
+
* WHY NOT A GREP OVER THE FILE. In markdown the give-away sits inside a fenced block, inline
|
|
20
|
+
* code, or a YAML frontmatter value, and a text scan cannot tell those from a sentence that
|
|
21
|
+
* merely discusses the hazard — which is exactly what `CLAUDE.md` and `docs/incidents.md` do.
|
|
22
|
+
* The parser can: this rule sees nodes, and it is pointed only at skills.
|
|
23
|
+
*/
|
|
24
|
+
// Each entry is a prefix that only makes sense in ONE install channel.
|
|
25
|
+
const CHANNEL_PREFIXES = [
|
|
26
|
+
".claude/skills/", // the consumer symlinks the package's skills to here
|
|
27
|
+
"node_modules/", // npm's copy
|
|
28
|
+
".claude/plugins/", // the plugin cache
|
|
29
|
+
"plugins/cache/", // the same cache, named from further up
|
|
30
|
+
];
|
|
31
|
+
/** The first channel prefix appearing in `s`, or null. Plain substring: a path IS a string. */
|
|
32
|
+
function channelPrefixIn(s) {
|
|
33
|
+
if (typeof s !== "string")
|
|
34
|
+
return null;
|
|
35
|
+
for (const p of CHANNEL_PREFIXES)
|
|
36
|
+
if (s.includes(p))
|
|
37
|
+
return p;
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
// The port, named by its path INSIDE this package — the same in every channel, so naming it
|
|
41
|
+
// is not the bet this rule forbids. One constant, because the advice below was once a file
|
|
42
|
+
// that never existed (#67) and read fine for a week: the harness now requires it on disk.
|
|
43
|
+
const PORT = "skills/paper-pipeline/scripts/consumer.mjs";
|
|
44
|
+
const MESSAGES = {
|
|
45
|
+
installPath: "This names a file by where it is INSTALLED ('{{prefix}}'), so it resolves in one " +
|
|
46
|
+
"delivery channel and does not exist in another. Rule 10: every answer to *where* comes " +
|
|
47
|
+
`from the port, ${PORT}. In a skill, use the substitution the harness performs ` +
|
|
48
|
+
"(CLAUDE_SKILL_DIR / CLAUDE_PLUGIN_ROOT); in a module, ask the port.",
|
|
49
|
+
};
|
|
50
|
+
/** Markdown: a skill's own prose, its fenced commands, and its YAML frontmatter. */
|
|
51
|
+
const mdInstallPath = {
|
|
52
|
+
meta: {
|
|
53
|
+
type: "problem",
|
|
54
|
+
docs: {
|
|
55
|
+
description: "a skill must not name its scripts by an install-specific path — rule 10, the port owns where",
|
|
56
|
+
},
|
|
57
|
+
schema: [],
|
|
58
|
+
messages: MESSAGES,
|
|
59
|
+
},
|
|
60
|
+
create(context) {
|
|
61
|
+
const check = (node) => {
|
|
62
|
+
const prefix = channelPrefixIn(node.value);
|
|
63
|
+
if (prefix)
|
|
64
|
+
context.report({ node, messageId: "installPath", data: { prefix } });
|
|
65
|
+
};
|
|
66
|
+
// `yaml` is the frontmatter block, which is where `allowed-tools` lives; the other three
|
|
67
|
+
// are the ways a command can appear in the body.
|
|
68
|
+
return { yaml: check, code: check, inlineCode: check, text: check };
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
/** JavaScript: the modules this package ships. */
|
|
72
|
+
const jsInstallPath = {
|
|
73
|
+
meta: {
|
|
74
|
+
type: "problem",
|
|
75
|
+
docs: {
|
|
76
|
+
description: "a shipped module must not carry an install-specific path literal — rule 10, the port owns where",
|
|
77
|
+
},
|
|
78
|
+
schema: [],
|
|
79
|
+
messages: MESSAGES,
|
|
80
|
+
},
|
|
81
|
+
create(context) {
|
|
82
|
+
const report = (node, prefix) => {
|
|
83
|
+
context.report({ node, messageId: "installPath", data: { prefix } });
|
|
84
|
+
};
|
|
85
|
+
return {
|
|
86
|
+
Literal(node) {
|
|
87
|
+
const prefix = channelPrefixIn(node.value);
|
|
88
|
+
if (prefix)
|
|
89
|
+
report(node, prefix);
|
|
90
|
+
},
|
|
91
|
+
// A template literal's static parts are just as much a path as a plain string; its
|
|
92
|
+
// interpolations are not our business, which is why the quasis are read one by one.
|
|
93
|
+
TemplateElement(node) {
|
|
94
|
+
const prefix = channelPrefixIn(node.value?.cooked ?? node.value?.raw);
|
|
95
|
+
if (prefix)
|
|
96
|
+
report(node, prefix);
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
},
|
|
100
|
+
};
|
|
101
|
+
export default {
|
|
102
|
+
rules: { "md-install-path": mdInstallPath, "js-install-path": jsInstallPath },
|
|
103
|
+
};
|
|
104
|
+
export { channelPrefixIn, CHANNEL_PREFIXES, PORT };
|
|
105
|
+
//# sourceMappingURL=install-path-literals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-path-literals.js","sourceRoot":"","sources":["../../eslint-rules/install-path-literals.ts"],"names":[],"mappings":"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"}
|