paperlint 3.1.3 → 4.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/.github/workflows/ci.yml +12 -7
- package/CLAUDE.md +5 -5
- package/CONTRIBUTING.md +34 -5
- package/dist/adapters/banal/failure.d.ts +1 -7
- package/dist/adapters/banal/failure.d.ts.map +1 -1
- package/dist/adapters/banal/failure.js +5 -7
- package/dist/adapters/banal/failure.js.map +1 -1
- package/dist/adapters/banal/index.d.ts.map +1 -1
- package/dist/adapters/banal/index.js +4 -3
- package/dist/adapters/banal/index.js.map +1 -1
- package/dist/adapters/banal/install.d.ts.map +1 -1
- package/dist/adapters/banal/install.js +4 -3
- package/dist/adapters/banal/install.js.map +1 -1
- package/dist/adapters/banal/invocation.d.ts +10 -5
- package/dist/adapters/banal/invocation.d.ts.map +1 -1
- package/dist/adapters/banal/invocation.js +13 -1
- package/dist/adapters/banal/invocation.js.map +1 -1
- package/dist/adapters/banal/locate.d.ts +12 -9
- package/dist/adapters/banal/locate.d.ts.map +1 -1
- package/dist/adapters/banal/locate.js +19 -12
- package/dist/adapters/banal/locate.js.map +1 -1
- package/dist/adapters/banal/run.d.ts +10 -1
- package/dist/adapters/banal/run.d.ts.map +1 -1
- package/dist/adapters/banal/run.js +8 -4
- package/dist/adapters/banal/run.js.map +1 -1
- package/dist/adapters/banal/settings.d.ts +1 -1
- package/dist/adapters/banal/settings.d.ts.map +1 -1
- package/dist/adapters/banal/settings.js +2 -1
- package/dist/adapters/banal/settings.js.map +1 -1
- package/dist/adapters/memory/index.d.ts.map +1 -1
- package/dist/adapters/memory/index.js +8 -2
- package/dist/adapters/memory/index.js.map +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 +5 -7
- 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/node/workspace.io.d.ts.map +1 -1
- package/dist/adapters/node/workspace.io.js +4 -2
- package/dist/adapters/node/workspace.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 +8 -7
- 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.d.ts +1 -1
- package/dist/build-engine.d.ts.map +1 -1
- package/dist/build-engine.js +10 -3
- package/dist/build-engine.js.map +1 -1
- package/dist/build.d.ts +2 -3
- package/dist/build.d.ts.map +1 -1
- package/dist/build.js +19 -17
- package/dist/build.js.map +1 -1
- package/dist/caller-path.d.ts +3 -0
- package/dist/caller-path.d.ts.map +1 -0
- package/dist/caller-path.js +13 -0
- package/dist/caller-path.js.map +1 -0
- package/dist/cli.d.ts +10 -17
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +93 -46
- package/dist/cli.js.map +1 -1
- package/dist/doctor.d.ts +12 -3
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +5 -3
- 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/paths.d.ts +8 -2
- package/dist/domain/paths.d.ts.map +1 -1
- package/dist/domain/paths.js +12 -1
- package/dist/domain/paths.js.map +1 -1
- package/dist/domain/ready.d.ts +24 -0
- package/dist/domain/ready.d.ts.map +1 -0
- package/dist/domain/ready.js +11 -0
- package/dist/domain/ready.js.map +1 -0
- package/dist/domain/record.d.ts +8 -0
- package/dist/domain/record.d.ts.map +1 -0
- package/dist/domain/record.js +8 -0
- package/dist/domain/record.js.map +1 -0
- package/dist/domain/sha256.d.ts.map +1 -1
- package/dist/domain/sha256.js +4 -2
- package/dist/domain/sha256.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 +23 -22
- 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 +31 -27
- 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 +31 -11
- package/dist/hooks-settings.js.map +1 -1
- package/dist/init.d.ts +8 -9
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +33 -15
- 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 +138 -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 +7 -3
- package/dist/new-paper.js.map +1 -1
- package/dist/paper-files.d.ts +4 -4
- package/dist/paper-files.d.ts.map +1 -1
- package/dist/paper-files.js +6 -6
- package/dist/paper-files.js.map +1 -1
- package/dist/paper-settings.d.ts.map +1 -1
- package/dist/paper-settings.js +8 -7
- package/dist/paper-settings.js.map +1 -1
- package/dist/pdf-facts.d.ts +51 -1
- package/dist/pdf-facts.d.ts.map +1 -1
- package/dist/pdf-facts.js +25 -16
- package/dist/pdf-facts.js.map +1 -1
- package/dist/pdf-geometry.d.ts.map +1 -1
- package/dist/pdf-geometry.js +3 -4
- package/dist/pdf-geometry.js.map +1 -1
- package/dist/ports/tool-installer.d.ts +2 -14
- package/dist/ports/tool-installer.d.ts.map +1 -1
- package/dist/presets.d.ts.map +1 -1
- package/dist/presets.js +19 -6
- package/dist/presets.js.map +1 -1
- package/dist/references.d.ts.map +1 -1
- package/dist/references.js +15 -10
- package/dist/references.js.map +1 -1
- package/dist/rules-config.d.ts +26 -1
- package/dist/rules-config.d.ts.map +1 -1
- package/dist/rules-config.js +15 -12
- 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 +4 -0
- package/dist/tex-requirements.d.ts.map +1 -1
- package/dist/tex-requirements.js +22 -5
- 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/types.d.ts +5 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/venue-rules.d.ts.map +1 -1
- package/dist/venue-rules.js +21 -8
- package/dist/venue-rules.js.map +1 -1
- package/docs/configuration.md +2 -2
- 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} +5 -4
- package/eslint-rules/install-path-literals.harness.mjs +1 -1
- package/eslint-rules/{install-path-literals.mjs → install-path-literals.ts} +18 -10
- 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} +35 -16
- 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} +76 -31
- package/eslint-rules/paper-typography.test.mjs +3 -3
- package/eslint-rules/{paper-typography.mjs → paper-typography.ts} +134 -56
- 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} +89 -32
- package/eslint-rules/review-frontmatter.test.mjs +2 -2
- package/eslint-rules/{review-frontmatter.mjs → review-frontmatter.ts} +38 -16
- 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} +20 -7
- package/eslint-rules/tex-build.harness.mjs +2 -2
- package/eslint-rules/{tex-build.mjs → tex-build.ts} +6 -5
- package/eslint.config.mjs +146 -30
- package/fixtures/install-path-literals/clean.fixture.mjs +1 -1
- package/fixtures/install-path-literals/clean.md +2 -2
- package/fixtures/install-path-literals/defect.fixture.mjs +1 -1
- package/fixtures/install-path-literals/defect.md +2 -2
- 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.sh +9 -19
- 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 +9 -9
- package/lib/{paper-config.mjs → paper-config.ts} +20 -19
- package/lib/skill-checks.mjs +24 -381
- package/lib/skill-checks.test.mjs +64 -116
- package/lib/skill-corpus.mjs +10 -251
- package/lib/skill-corpus.test.mjs +2 -13
- package/lib/skill-eval-kit.mjs +1 -1
- package/lib/skill-trigger-cases.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 -38
- package/scripts/eslint-report-guard.test.mjs +1 -1
- package/scripts/harness-api.frozen.json +14 -16
- 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/analyze-sibling-paper/SKILL.md +1 -39
- package/skills/analyze-sibling-paper/SKILL.md.spec.ts +0 -38
- package/skills/argument-arc/SKILL.md +2 -36
- package/skills/argument-arc/SKILL.md.spec.ts +1 -43
- package/skills/build-benchmark/SKILL.md +1 -41
- package/skills/build-benchmark/SKILL.md.spec.ts +0 -40
- package/skills/camera-ready/SKILL.md +1 -34
- package/skills/camera-ready/SKILL.md.spec.ts +0 -33
- package/skills/cold-read-diff/SKILL.md +1 -35
- package/skills/cold-read-diff/SKILL.md.spec.ts +0 -34
- package/skills/draft-paper/SKILL.md +2 -41
- package/skills/draft-paper/SKILL.md.spec.ts +1 -50
- package/skills/extend-paper/SKILL.md +2 -33
- package/skills/extend-paper/SKILL.md.spec.ts +1 -42
- package/skills/find-venue/SKILL.md +2 -38
- package/skills/find-venue/SKILL.md.spec.ts +1 -47
- package/skills/grade-paper-writing/SKILL.md +3 -38
- package/skills/grade-paper-writing/SKILL.md.spec.ts +2 -47
- package/skills/grade-paper-writing/prose-lint.mjs +3 -4
- package/skills/grade-paper-writing/{prose-lint.test.mjs → prose-lint.test.ts} +3 -3
- package/skills/harden-paper/SKILL.md +1 -39
- package/skills/harden-paper/SKILL.md.spec.ts +0 -38
- package/skills/map-prior-work/SKILL.md +1 -35
- package/skills/map-prior-work/SKILL.md.spec.ts +0 -34
- package/skills/osf-artifact-upload/{osf-artifact-upload.harness.mjs → osf-artifact-upload.harness.ts} +3 -4
- package/skills/paper-adversarial-review/SKILL.md +2 -35
- package/skills/paper-adversarial-review/SKILL.md.spec.ts +1 -43
- package/skills/paper-pipeline/SKILL.md +2 -28
- package/skills/paper-pipeline/SKILL.md.spec.ts +1 -27
- 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 +2 -2
- package/skills/paper-pipeline/paper-pipeline.harness.mjs +25 -40
- package/skills/paper-pipeline/pipeline-firing.eval.mjs +1 -1
- package/skills/paper-pipeline/pipeline-language.eval.mjs +1 -1
- package/skills/paper-pipeline/references/acceptance-gate.md +1 -6
- package/skills/paper-pipeline/references/pipeline-status-template.md +8 -35
- package/skills/paper-pipeline/scripts/README.md +30 -225
- package/skills/paper-pipeline/scripts/artifact-coverage.harness.mjs +4 -8
- 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.harness.mjs +6 -104
- package/skills/paper-pipeline/scripts/consumer.mjs +24 -109
- 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/generated-code.harness.mjs +2 -3
- package/skills/paper-pipeline/scripts/{generated-code.test.mjs → generated-code.test.ts} +3 -3
- package/skills/paper-pipeline/scripts/population-map.harness.mjs +3 -3
- 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-status/SKILL.md +2 -42
- package/skills/paper-status/SKILL.md.spec.ts +1 -41
- package/skills/pc-panel-review/SKILL.md +2 -46
- package/skills/pc-panel-review/SKILL.md.spec.ts +1 -45
- package/skills/plan-paper-timeline/SKILL.md +2 -36
- package/skills/plan-paper-timeline/SKILL.md.spec.ts +0 -36
- 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/SKILL.md +1 -37
- package/skills/render-paper/SKILL.md.spec.ts +0 -36
- 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/research-ideate/SKILL.md +2 -39
- package/skills/research-ideate/SKILL.md.spec.ts +1 -47
- package/skills/study-accepted-papers/SKILL.md +1 -34
- package/skills/study-accepted-papers/SKILL.md.spec.ts +0 -33
- package/skills/submit-paper/SKILL.md +1 -33
- package/skills/submit-paper/SKILL.md.spec.ts +0 -32
- package/skills/sweep-design-space/SKILL.md +1 -38
- package/skills/sweep-design-space/SKILL.md.spec.ts +0 -37
- package/skills/tighten-paper/SKILL.md +2 -39
- package/skills/tighten-paper/SKILL.md.spec.ts +1 -47
- package/skills/tighten-paper/structure.mjs +5 -12
- package/skills/tighten-paper/{structure.test.mjs → structure.test.ts} +4 -3
- package/skills/verify-citations/SKILL.md +2 -38
- package/skills/verify-citations/SKILL.md.spec.ts +1 -37
- 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/src/CLAUDE.md +1 -1
- package/src/adapters/banal/failure.ts +9 -10
- package/src/adapters/banal/index.test.ts +5 -8
- package/src/adapters/banal/index.ts +8 -7
- package/src/adapters/banal/install.ts +9 -4
- package/src/adapters/banal/invocation.test.ts +23 -9
- package/src/adapters/banal/invocation.ts +24 -9
- package/src/adapters/banal/locate.test.ts +2 -2
- package/src/adapters/banal/locate.ts +27 -21
- package/src/adapters/banal/output.test.ts +1 -1
- package/src/adapters/banal/run.test.ts +5 -5
- package/src/adapters/banal/run.ts +16 -10
- package/src/adapters/banal/settings.ts +2 -2
- package/src/adapters/banal/xml.test.ts +1 -1
- package/src/adapters/curl/download.test.ts +8 -6
- package/src/adapters/memory/index.ts +4 -3
- package/src/adapters/node/files.io.ts +2 -2
- package/src/adapters/node/files.test.ts +8 -4
- package/src/adapters/node/process.io.ts +13 -5
- package/src/adapters/node/process.test.ts +5 -5
- package/src/adapters/node/workspace.io.ts +9 -4
- 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 +33 -60
- 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 +13 -8
- package/src/build-engine.ts +12 -7
- package/src/build.harness.mjs +2 -2
- package/src/build.test.ts +24 -24
- package/src/build.ts +34 -26
- package/src/caller-path.ts +13 -0
- package/src/cli.harness.mjs +6 -8
- package/src/cli.test.ts +31 -13
- package/src/cli.ts +117 -58
- package/src/doctor.harness.mjs +3 -3
- package/src/doctor.test.ts +1 -1
- package/src/doctor.ts +17 -7
- package/src/domain/lookup-cache.ts +21 -11
- package/src/domain/paths.test.ts +15 -0
- package/src/domain/paths.ts +20 -1
- package/src/domain/ready.ts +31 -0
- package/src/domain/record.test.ts +20 -0
- package/src/domain/record.ts +12 -0
- package/src/domain/result.test.ts +2 -2
- package/src/domain/sha256.ts +5 -3
- 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 +34 -5
- package/src/facts-file.test.ts +9 -7
- package/src/facts-file.ts +45 -29
- package/src/{hooks-settings.harness.mjs → hooks-settings.harness.ts} +56 -20
- package/src/hooks-settings.ts +48 -13
- package/src/init.test.ts +37 -14
- package/src/init.ts +48 -24
- 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 +9 -25
- package/src/new-paper.test.ts +8 -10
- package/src/new-paper.ts +9 -5
- package/src/paper-files.test.ts +25 -24
- package/src/paper-files.ts +16 -27
- package/src/paper-settings-commands.test.ts +5 -4
- package/src/paper-settings.test.ts +7 -7
- package/src/paper-settings.ts +13 -14
- package/src/{pdf-facts.harness.mjs → pdf-facts.harness.ts} +9 -8
- package/src/pdf-facts.test.ts +25 -15
- package/src/pdf-facts.ts +81 -23
- package/src/{pdf-geometry.harness.mjs → pdf-geometry.harness.ts} +19 -12
- package/src/pdf-geometry.ts +8 -4
- package/src/ports/tool-installer.ts +2 -17
- package/src/presets.ts +31 -16
- package/src/references.test.ts +76 -62
- package/src/references.ts +18 -12
- package/src/{rules-config.harness.mjs → rules-config.harness.ts} +7 -13
- package/src/rules-config.ts +46 -14
- 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.test.ts +21 -0
- package/src/tex-requirements.ts +37 -11
- package/src/toolchain.harness.mjs +2 -2
- package/src/toolchain.test.ts +10 -6
- package/src/toolchain.ts +31 -17
- package/src/types.ts +5 -3
- package/src/venue-rules.test.ts +70 -68
- package/src/venue-rules.ts +22 -12
- 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/skills/paper-pipeline/scripts/announce.mjs +0 -67
- package/skills/paper-pipeline/scripts/announce.test.mjs +0 -102
- package/skills/paper-pipeline/scripts/fixtures/clean/PIPELINE-STATUS.md +0 -51
- package/skills/paper-pipeline/scripts/fixtures/dirty/PIPELINE-STATUS.md +0 -52
- package/skills/paper-pipeline/scripts/fixtures/dirty/paper.md +0 -6
- package/skills/paper-pipeline/scripts/fixtures/scorecard.mjs +0 -71
- package/skills/paper-pipeline/scripts/ledger.cli.test.mjs +0 -302
- package/skills/paper-pipeline/scripts/ledger.mjs +0 -623
- package/skills/paper-pipeline/scripts/ledger.test.mjs +0 -254
- package/skills/paper-pipeline/scripts/pipeline-check.cli.test.mjs +0 -474
- package/skills/paper-pipeline/scripts/pipeline-check.harness.mjs +0 -328
- package/skills/paper-pipeline/scripts/pipeline-check.mjs +0 -753
- package/skills/paper-pipeline/scripts/pipeline-edges.mjs +0 -169
- package/skills/paper-pipeline/scripts/pipeline-edges.test.mjs +0 -73
- package/skills/paper-pipeline/scripts/run-mechanical.mjs +0 -648
- package/skills/paper-pipeline/scripts/run-mechanical.test.mjs +0 -468
- package/skills/paper-pipeline/scripts/status.mjs +0 -295
- package/skills/paper-pipeline/scripts/status.test.mjs +0 -232
- /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/tighten-paper/__snapshots__/{structure.test.mjs.snap → structure.test.ts.snap} +0 -0
|
@@ -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/paths.d.ts
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
|
-
/** Paths as the domain holds them. */
|
|
2
1
|
import type { Opaque } from "ts-essentials";
|
|
3
|
-
/**
|
|
2
|
+
/**
|
|
3
|
+
* An absolute path. Minted by `absolutePath` (a checked string) or `joinPath` (an absolute base and
|
|
4
|
+
* segments) only, so nothing holding one has to ask whether it is relative.
|
|
5
|
+
*/
|
|
4
6
|
export type AbsolutePath = Opaque<string, "AbsolutePath">;
|
|
7
|
+
/** A path the caller holds as text, checked where it becomes a value. A relative one throws. */
|
|
8
|
+
export declare function absolutePath(p: string): AbsolutePath;
|
|
9
|
+
/** `segments` under `base`: absolute because `base` is. */
|
|
10
|
+
export declare const joinPath: (base: AbsolutePath, ...segments: string[]) => AbsolutePath;
|
|
5
11
|
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/domain/paths.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/domain/paths.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAE5C;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;AAK1D,gGAAgG;AAChG,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,YAAY,CAGpD;AAED,2DAA2D;AAC3D,eAAO,MAAM,QAAQ,GACnB,MAAM,YAAY,EAClB,GAAG,UAAU,MAAM,EAAE,KACpB,YAAqD,CAAC"}
|
package/dist/domain/paths.js
CHANGED
|
@@ -1,2 +1,13 @@
|
|
|
1
|
-
|
|
1
|
+
/** Paths as the domain holds them. */
|
|
2
|
+
import { isAbsolute, join } from "node:path";
|
|
3
|
+
// The brand's one owner: the predicate IS the check, so no assertion is needed to mint the type.
|
|
4
|
+
const isAbsolutePath = (p) => isAbsolute(p);
|
|
5
|
+
/** A path the caller holds as text, checked where it becomes a value. A relative one throws. */
|
|
6
|
+
export function absolutePath(p) {
|
|
7
|
+
if (!isAbsolutePath(p))
|
|
8
|
+
throw new Error(`not an absolute path: ${p}`);
|
|
9
|
+
return p;
|
|
10
|
+
}
|
|
11
|
+
/** `segments` under `base`: absolute because `base` is. */
|
|
12
|
+
export const joinPath = (base, ...segments) => absolutePath(join(base, ...segments));
|
|
2
13
|
//# sourceMappingURL=paths.js.map
|
package/dist/domain/paths.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/domain/paths.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/domain/paths.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAS7C,iGAAiG;AACjG,MAAM,cAAc,GAAG,CAAC,CAAS,EAAqB,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AAEvE,gGAAgG;AAChG,MAAM,UAAU,YAAY,CAAC,CAAS;IACpC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,EAAE,CAAC,CAAC;IACtE,OAAO,CAAC,CAAC;AACX,CAAC;AAED,2DAA2D;AAC3D,MAAM,CAAC,MAAM,QAAQ,GAAG,CACtB,IAAkB,EAClB,GAAG,QAAkB,EACP,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/** A program `paperlint toolchain` installed or found: present, verified, running. */
|
|
2
|
+
declare const READY: unique symbol;
|
|
3
|
+
/**
|
|
4
|
+
* Present, verified, running. BRANDED: a literal `{ where, fresh, verified }` is not a `Ready`, so
|
|
5
|
+
* only an installer's adapter — one minting call each (banal's is `ready` in
|
|
6
|
+
* `adapters/banal/index.ts`) — can make one, and a ready line cannot be printed without it.
|
|
7
|
+
*/
|
|
8
|
+
export interface Ready {
|
|
9
|
+
/** Where it is: the program's path or its bin directory. */
|
|
10
|
+
readonly where: string;
|
|
11
|
+
/** This run installed it. */
|
|
12
|
+
readonly fresh: boolean;
|
|
13
|
+
/** What was checked before calling it ready, as a person reads it. */
|
|
14
|
+
readonly verified: string;
|
|
15
|
+
readonly [READY]: true;
|
|
16
|
+
}
|
|
17
|
+
/** An installer's verdict that its program is ready. Called by an installer adapter, after its checks. */
|
|
18
|
+
export declare const ready: (r: {
|
|
19
|
+
readonly where: string;
|
|
20
|
+
readonly fresh: boolean;
|
|
21
|
+
readonly verified: string;
|
|
22
|
+
}) => Ready;
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=ready.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ready.d.ts","sourceRoot":"","sources":["../../src/domain/ready.ts"],"names":[],"mappings":"AAAA,sFAAsF;AAGtF,QAAA,MAAM,KAAK,eAAkB,CAAC;AAE9B;;;;GAIG;AACH,MAAM,WAAW,KAAK;IACpB,4DAA4D;IAC5D,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,6BAA6B;IAC7B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,sEAAsE;IACtE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC;CACxB;AAED,0GAA0G;AAC1G,eAAO,MAAM,KAAK,GAAI,GAAG;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B,KAAG,KAKF,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** A program `paperlint toolchain` installed or found: present, verified, running. */
|
|
2
|
+
// Not exported: a `Ready` carries this property, and the one way to write it is `ready` below.
|
|
3
|
+
const READY = Symbol("Ready");
|
|
4
|
+
/** An installer's verdict that its program is ready. Called by an installer adapter, after its checks. */
|
|
5
|
+
export const ready = (r) => ({
|
|
6
|
+
where: r.where,
|
|
7
|
+
fresh: r.fresh,
|
|
8
|
+
verified: r.verified,
|
|
9
|
+
[READY]: true,
|
|
10
|
+
});
|
|
11
|
+
//# sourceMappingURL=ready.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ready.js","sourceRoot":"","sources":["../../src/domain/ready.ts"],"names":[],"mappings":"AAAA,sFAAsF;AAEtF,+FAA+F;AAC/F,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;AAiB9B,0GAA0G;AAC1G,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,CAIrB,EAAS,EAAE,CAAC,CAAC;IACZ,KAAK,EAAE,CAAC,CAAC,KAAK;IACd,KAAK,EAAE,CAAC,CAAC,KAAK;IACd,QAAQ,EAAE,CAAC,CAAC,QAAQ;IACpB,CAAC,KAAK,CAAC,EAAE,IAAI;CACd,CAAC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** Reading fields off a value typed `unknown` — a parsed JSON file, an object a library hands back. */
|
|
2
|
+
/** Any non-null object that is not an array, readable by key. */
|
|
3
|
+
export declare const isRecord: (v: unknown) => v is Readonly<Record<string, unknown>>;
|
|
4
|
+
/** `v[key]` when `v` is a record; undefined for anything else. Inherited fields count, as `.` reads them. */
|
|
5
|
+
export declare const fieldOf: (v: unknown, key: string) => unknown;
|
|
6
|
+
/** A number array a library types as `any[]`, read as the numbers it holds. */
|
|
7
|
+
export declare const numbersOf: (xs: readonly unknown[]) => number[];
|
|
8
|
+
//# sourceMappingURL=record.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record.d.ts","sourceRoot":"","sources":["../../src/domain/record.ts"],"names":[],"mappings":"AAAA,uGAAuG;AAEvG,iEAAiE;AACjE,eAAO,MAAM,QAAQ,GAAI,GAAG,OAAO,KAAG,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CACjB,CAAC;AAE3D,6GAA6G;AAC7G,eAAO,MAAM,OAAO,GAAI,GAAG,OAAO,EAAE,KAAK,MAAM,KAAG,OAChB,CAAC;AAEnC,+EAA+E;AAC/E,eAAO,MAAM,SAAS,GAAI,IAAI,SAAS,OAAO,EAAE,KAAG,MAAM,EAAoB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** Reading fields off a value typed `unknown` — a parsed JSON file, an object a library hands back. */
|
|
2
|
+
/** Any non-null object that is not an array, readable by key. */
|
|
3
|
+
export const isRecord = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
|
|
4
|
+
/** `v[key]` when `v` is a record; undefined for anything else. Inherited fields count, as `.` reads them. */
|
|
5
|
+
export const fieldOf = (v, key) => isRecord(v) ? v[key] : undefined;
|
|
6
|
+
/** A number array a library types as `any[]`, read as the numbers it holds. */
|
|
7
|
+
export const numbersOf = (xs) => xs.map(Number);
|
|
8
|
+
//# sourceMappingURL=record.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record.js","sourceRoot":"","sources":["../../src/domain/record.ts"],"names":[],"mappings":"AAAA,uGAAuG;AAEvG,iEAAiE;AACjE,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAU,EAA0C,EAAE,CAC7E,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAE3D,6GAA6G;AAC7G,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAU,EAAE,GAAW,EAAW,EAAE,CAC1D,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAEnC,+EAA+E;AAC/E,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,EAAsB,EAAY,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sha256.d.ts","sourceRoot":"","sources":["../../src/domain/sha256.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAE5C,gGAAgG;AAChG,MAAM,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"sha256.d.ts","sourceRoot":"","sources":["../../src/domain/sha256.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAE5C,gGAAgG;AAChG,MAAM,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAM9C,4GAA4G;AAC5G,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAI7C;AAED,eAAO,MAAM,SAAS,GAAI,OAAO,UAAU,KAAG,MACiB,CAAC"}
|
package/dist/domain/sha256.js
CHANGED
|
@@ -4,11 +4,13 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { createHash } from "node:crypto";
|
|
6
6
|
const SHA256 = /^[0-9a-f]{64}$/;
|
|
7
|
+
// The brand's one owner: the predicate IS the check, so no assertion is needed to mint the type.
|
|
8
|
+
const isSha256 = (s) => SHA256.test(s);
|
|
7
9
|
/** A sha256 written down as text — a pin, an option — checked where it is written, not where it is used. */
|
|
8
10
|
export function parseSha256(s) {
|
|
9
|
-
if (!
|
|
11
|
+
if (!isSha256(s))
|
|
10
12
|
throw new Error(`not a sha256 (64 lowercase hex digits): ${s}`);
|
|
11
13
|
return s;
|
|
12
14
|
}
|
|
13
|
-
export const sha256Hex = (bytes) => createHash("sha256").update(bytes).digest("hex");
|
|
15
|
+
export const sha256Hex = (bytes) => parseSha256(createHash("sha256").update(bytes).digest("hex"));
|
|
14
16
|
//# sourceMappingURL=sha256.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sha256.js","sourceRoot":"","sources":["../../src/domain/sha256.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAMzC,MAAM,MAAM,GAAG,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"sha256.js","sourceRoot":"","sources":["../../src/domain/sha256.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAMzC,MAAM,MAAM,GAAG,gBAAgB,CAAC;AAChC,iGAAiG;AACjG,MAAM,QAAQ,GAAG,CAAC,CAAS,EAAe,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAE5D,4GAA4G;AAC5G,MAAM,UAAU,WAAW,CAAC,CAAS;IACnC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,EAAE,CAAC,CAAC;IAClE,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,KAAiB,EAAU,EAAE,CACrD,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC"}
|
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
CHANGED
|
@@ -1,27 +1,28 @@
|
|
|
1
|
+
import type { TexRequirements } from "./tex-requirements.ts";
|
|
2
|
+
/** The options paperlint hands a process runner: text out, both streams captured. */
|
|
3
|
+
export interface RunOptions {
|
|
4
|
+
readonly encoding: "utf8" | "latin1";
|
|
5
|
+
readonly stdio: ["ignore", "pipe", "pipe"];
|
|
6
|
+
readonly env?: NodeJS.ProcessEnv;
|
|
7
|
+
readonly cwd?: string;
|
|
8
|
+
readonly maxBuffer?: number;
|
|
9
|
+
readonly timeout?: number;
|
|
10
|
+
}
|
|
1
11
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* 🔴 WHY "HAS pdflatex" IS NOT THE QUESTION. A TeX Live without `libertine.sty` builds an acmart
|
|
6
|
-
* paper GREEN: the class notices the missing font, falls back to Computer Modern, and the PDF looks
|
|
7
|
-
* fine in the wrong typeface with another pagination. That is how a submitted paper went out. So a
|
|
8
|
-
* TeX Live qualifies only when `kpsewhich` finds every file the venue declares (issue #26).
|
|
9
|
-
*
|
|
10
|
-
* The order (the Playwright pattern, decided 2026-09-24):
|
|
11
|
-
* 1. paperlint's own cache (`paperlint toolchain` installs it) — when it has everything;
|
|
12
|
-
* 2. a TeX Live already on PATH — when IT has everything;
|
|
13
|
-
* 3. neither: on a terminal, ask once and install; without one (CI, an agent), refuse in one line
|
|
14
|
-
* that names `npx paperlint toolchain` and the missing packages. Never a silent install without a
|
|
15
|
-
* human, never a build on a TeX Live that would typeset the wrong font.
|
|
16
|
-
*
|
|
17
|
-
* `resolveEngine` is that order as a PURE function over `EngineFacts`, table-tested. The rest of
|
|
18
|
-
* this file gathers the facts (probing a tree runs `kpsewhich` through the injected `run`, the port
|
|
19
|
-
* `build.ts` already uses) and acts on the decision.
|
|
12
|
+
* What paperlint reads of a finished process. `spawnSync`'s result has this shape; a fake needs
|
|
13
|
+
* nothing more. Both streams are optional: they are `undefined` when the spawn itself failed.
|
|
20
14
|
*/
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
15
|
+
export interface RunResult {
|
|
16
|
+
readonly status: number | null;
|
|
17
|
+
readonly stdout?: string;
|
|
18
|
+
readonly stderr?: string;
|
|
19
|
+
readonly error?: Error;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* A process runner: `spawnSync`'s text overload, narrowed to what paperlint passes and reads — the
|
|
23
|
+
* port the harness replaces. `spawnSync` itself is one.
|
|
24
|
+
*/
|
|
25
|
+
export type Runner = (file: string, args: readonly string[], options: RunOptions) => RunResult;
|
|
25
26
|
/** One TeX Live and what it lacks for the papers at hand. */
|
|
26
27
|
export interface TreeProbe {
|
|
27
28
|
/** How to name it to a human: `paperlint cache, TeX Live 2026` / `/usr/bin/pdflatex`. */
|
package/dist/engine.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
|
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: "suggestion";
|
|
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,YAAqB;gBAC3B,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: "problem";
|
|
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: "problem";
|
|
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"}
|