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
package/.github/workflows/ci.yml
CHANGED
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
# npm run fmt:check 5 s
|
|
19
19
|
# vigiles lint . README.md 6 s
|
|
20
20
|
# rules-see-files.mjs 5 s
|
|
21
|
-
# layer-legacy-frozen.
|
|
21
|
+
# layer-legacy-frozen.ts 3 s
|
|
22
22
|
# install e2e --strict (npm + pnpm) 28 s
|
|
23
23
|
# ───────────────────────────────────────────
|
|
24
24
|
# total work ~96 s, plus checkout + install + the claude binary
|
|
@@ -118,6 +118,11 @@ jobs:
|
|
|
118
118
|
- name: npm test, under coverage
|
|
119
119
|
run: npm run coverage -- --no-skip
|
|
120
120
|
|
|
121
|
+
# vitest strips types without checking them, so the tests' types are checked here. After
|
|
122
|
+
# `npm ci`, whose `prepare` built `dist/`: the e2e runs import its declarations.
|
|
123
|
+
- name: the tests type-check
|
|
124
|
+
run: npx tsc -p tsconfig.test.json
|
|
125
|
+
|
|
121
126
|
# The rules themselves, over this repository's own fixtures. Two of the four fixtures are
|
|
122
127
|
# DEFECTIVE ON PURPOSE, so a healthy checkout reports warnings here and still exits 0 —
|
|
123
128
|
# the pass/fail signal for rule behaviour lives in `npm test`, not in the warning count.
|
|
@@ -146,7 +151,7 @@ jobs:
|
|
|
146
151
|
# or a pointer to a file that does not exist. Bond is 3 × the measured 3 s, floored at the
|
|
147
152
|
# 1-minute granularity GitHub bills in.
|
|
148
153
|
#
|
|
149
|
-
# README.md is linted too, by name (see the same gate in scripts/check.
|
|
154
|
+
# README.md is linted too, by name (see the same gate in scripts/check.ts). Its
|
|
150
155
|
# `vigiles:symbol` marks name the functions behind `paperlint init` and `paperlint new`; if one is
|
|
151
156
|
# renamed or removed, this step fails and names README.md.
|
|
152
157
|
- name: vigiles lint (skills + README.md)
|
|
@@ -163,7 +168,7 @@ jobs:
|
|
|
163
168
|
# The legacy exemptions from src/'s layer rules (#76) may only shrink: counted from ESLint's
|
|
164
169
|
# own suppressedMessages, so a new `-- legacy …` directive anywhere fails here.
|
|
165
170
|
- name: legacy layer exemptions are frozen
|
|
166
|
-
run: node scripts/layer-legacy-frozen.
|
|
171
|
+
run: node scripts/layer-legacy-frozen.ts
|
|
167
172
|
|
|
168
173
|
# pnpm is INSTALLED here rather than hoped for. The runner image may or may not carry it,
|
|
169
174
|
# and the npm/pnpm difference is the entire reason the install e2e exists — so leaving it
|
|
@@ -176,7 +181,7 @@ jobs:
|
|
|
176
181
|
# Called directly with --strict, the same as the build e2e below. --strict: a manager that does not launch is a declared skip on a
|
|
177
182
|
# contributor's clone and a FAILURE here, because in CI it means a broken environment.
|
|
178
183
|
- name: install e2e (--strict)
|
|
179
|
-
run: node test/e2e/install.
|
|
184
|
+
run: node test/e2e/install.ts --strict
|
|
180
185
|
timeout-minutes: 10
|
|
181
186
|
|
|
182
187
|
# ── BUILDING THE PAPER WITH REAL pdflatex, ON LINUX AND macOS ──────────────────────────────────
|
|
@@ -271,14 +276,14 @@ jobs:
|
|
|
271
276
|
# result must equal the numbers banal gave on the same PDFs through poppler's pdftohtml
|
|
272
277
|
# (recorded once, hardcoded in the test). Runs in seconds, hence the short timeout.
|
|
273
278
|
- name: banal e2e (--strict)
|
|
274
|
-
run: node test/e2e/banal.
|
|
279
|
+
run: node test/e2e/banal.ts --strict
|
|
275
280
|
timeout-minutes: 3
|
|
276
281
|
|
|
277
282
|
# Called directly with --strict (see the install e2e step in the `gates` job).
|
|
278
283
|
- name: build e2e (--strict)
|
|
279
|
-
run: node test/e2e/build.
|
|
284
|
+
run: node test/e2e/build.ts --strict
|
|
280
285
|
timeout-minutes: 10
|
|
281
286
|
|
|
282
287
|
- name: toolchain e2e (--strict)
|
|
283
|
-
run: node test/e2e/toolchain.
|
|
288
|
+
run: node test/e2e/toolchain.ts --strict
|
|
284
289
|
timeout-minutes: 10
|
package/CLAUDE.md
CHANGED
|
@@ -279,7 +279,7 @@ cannot.
|
|
|
279
279
|
|
|
280
280
|
What the twin was for was the CAPABILITY CHECK — `vigiles compile` refuses a hook that imports
|
|
281
281
|
anything but `vigiles/hook`, because the import list _is_ the capability surface. That check is a
|
|
282
|
-
function, `checkHookImports`, and `hooks/hooks.harness.
|
|
282
|
+
function, `checkHookImports`, and `hooks/hooks.harness.ts` runs it over every shipped
|
|
283
283
|
`.hook.mjs` directly. Same check, applied to the artifact that actually executes, with no second
|
|
284
284
|
file to keep in step. What is lost is `tsc` on the hook body and the typed `e.ctx` — named here
|
|
285
285
|
rather than left as an omission.
|
|
@@ -363,8 +363,8 @@ paid for by a consumer who only wants the ESLint rules and never loads a hook.
|
|
|
363
363
|
|
|
364
364
|
`optional: true` is the entry that matches what this section already argues: the consumer brings
|
|
365
365
|
its own `vigiles` _when it uses the hooks_, and npm stops deciding that for them. Both halves
|
|
366
|
-
measured on the 56 MB tree: `eslint-rules/latex-language.mjs` and
|
|
367
|
-
|
|
366
|
+
measured on the 56 MB tree: `eslint-rules/latex-language.mjs` and the skill scripts load and
|
|
367
|
+
run (RC=0), while
|
|
368
368
|
`hooks/paper-edit-guard.hook.mjs` fails with `ERR_MODULE_NOT_FOUND` — which is this contract
|
|
369
369
|
working, not a defect, exactly as argued below.
|
|
370
370
|
|
|
@@ -497,8 +497,8 @@ justified two hundred lines above precisely by these minutes being free.
|
|
|
497
497
|
| -------------------------------------------------------------------------- | --------------------------------------------- |
|
|
498
498
|
| a pure function | unit — vitest, `<module>.test.ts` beside it |
|
|
499
499
|
| a use case or adapter that reaches disk, a process, the network, the clock | integration — vitest, fakes through the ports |
|
|
500
|
-
| a hook's decision, a skill's contract | harness — vigiles, `<surface>.harness.
|
|
501
|
-
| the installed package, a real TeX build | e2e — `test/e2e/*.
|
|
500
|
+
| a hook's decision, a skill's contract | harness — vigiles, `<surface>.harness.ts` |
|
|
501
|
+
| the installed package, a real TeX build | e2e — `test/e2e/*.ts` |
|
|
502
502
|
|
|
503
503
|
Red first · assert the whole value · test what the code does, never what its source says · no test
|
|
504
504
|
touches the real network · 100% coverage, no `c8 ignore`. **Before every push: `npm run check`,
|
package/CONTRIBUTING.md
CHANGED
|
@@ -44,10 +44,10 @@ and reported as "the gates". If a step genuinely cannot run here, it says so out
|
|
|
44
44
|
being skipped quietly: an e2e that finds no TeX or no pnpm exits 77 _having stated_ why, and
|
|
45
45
|
`npm run check` lists it as skipped instead of counting it as passed.
|
|
46
46
|
|
|
47
|
-
Each gate's command is listed in `scripts/check.
|
|
47
|
+
Each gate's command is listed in `scripts/check.ts`; run one of them directly while iterating on
|
|
48
48
|
one rule. They are not what you run before pushing.
|
|
49
49
|
|
|
50
|
-
**The list of gates cannot quietly fall behind CI.** `scripts/check.harness.
|
|
50
|
+
**The list of gates cannot quietly fall behind CI.** `scripts/check.harness.ts` pulls the job
|
|
51
51
|
names out of `.github/workflows/ci.yml` and requires each to be either reproduced by a gate or
|
|
52
52
|
named with a reason for why it cannot be. Add a job and it goes red the same day, naming the job
|
|
53
53
|
nobody covered — verified by adding a `windows` job and watching it fail.
|
|
@@ -55,8 +55,8 @@ nobody covered — verified by adding a `windows` job and watching it fail.
|
|
|
55
55
|
## Layout
|
|
56
56
|
|
|
57
57
|
```
|
|
58
|
-
eslint-rules/ the rules, each with its
|
|
59
|
-
lib/ shared readers — markdown, skill corpus
|
|
58
|
+
eslint-rules/ the rules (TypeScript, built to dist/eslint-rules/), each with its harness beside it
|
|
59
|
+
lib/ shared readers — markdown, config keys (TypeScript, built to dist/lib/); skill corpus
|
|
60
60
|
hooks/ three hooks for vigiles — the code
|
|
61
61
|
plugin/ the Claude Code plugin: wiring for those hooks, no code, no package.json
|
|
62
62
|
skills/ 24 stage skills
|
|
@@ -102,6 +102,35 @@ npm run coverage # the same, under c8, failing below the thresholds in .
|
|
|
102
102
|
None of these are needed to USE the tool — they are here because the gates are part of the
|
|
103
103
|
argument, not decoration.
|
|
104
104
|
|
|
105
|
+
New code is TypeScript (#78). The last block of [`eslint.config.mjs`](eslint.config.mjs) makes any
|
|
106
|
+
`.js`, `.mjs` or `.cjs` file an error in the directories already converted (`TYPESCRIPT_ONLY`), so
|
|
107
|
+
`npm run lint` fails on one; a directory that still mixes the two is not listed yet, and the change
|
|
108
|
+
that converts it adds it. Code that only this repository runs (tests, `scripts/`, `test/e2e/`) is
|
|
109
|
+
run by `node` directly; code a consumer runs from `node_modules` needs a build first, because Node
|
|
110
|
+
does not strip types there.
|
|
111
|
+
|
|
112
|
+
`npm run build` is one `tsc` over two projects into one `dist/`: `tsconfig.json` builds `src/` to
|
|
113
|
+
`dist/*.js`, and `tsconfig.pkg.json` builds `lib/` and `eslint-rules/` to `dist/lib/` and
|
|
114
|
+
`dist/eslint-rules/`. Everything else imports those two through the package's subpath imports,
|
|
115
|
+
`#lib/<name>` and `#eslint-rules/<name>` (`"imports"` in `package.json`): the default target is the
|
|
116
|
+
build, which is what an install runs; the `paperlint-source` condition points at the `.ts` instead,
|
|
117
|
+
and `npm test` (so `npm run coverage` and `npm run check` too) and `tsconfig.test.json` set it so
|
|
118
|
+
they read the source. `scripts/test.ts` is the one place the tests get it; a harness run on its own
|
|
119
|
+
(`npx vigiles test <file>`) needs `NODE_OPTIONS=--conditions=paperlint-source`.
|
|
120
|
+
|
|
121
|
+
Consumers import the same modules by their old public names — `paperlint/eslint-rules/<name>.mjs`,
|
|
122
|
+
`paperlint/lib/<name>.mjs`, `paperlint/bin/paperlint.mjs` — which the `"exports"` map in
|
|
123
|
+
`package.json` points at `dist/`. The install e2e imports every one of them, and every
|
|
124
|
+
`paperlint/…` import in a `docs/` code block, from the installed package; a module moved or renamed
|
|
125
|
+
without its public name fails there. The five `lib/*.mjs` modules not yet converted are listed in
|
|
126
|
+
`"exports"` by name until step 4 (#127) converts them.
|
|
127
|
+
|
|
128
|
+
TypeScript is pinned to 6.x, not 7 (measured 2026-09-27): typescript-eslint 8.70.1 declares
|
|
129
|
+
`typescript: >=4.8.4 <6.1.0`, and `typescript@7.0.2`'s package root exports only its version — the
|
|
130
|
+
compiler API that `scripts/harness-api.test.ts` and `scripts/coverage-config.test.ts` parse with
|
|
131
|
+
(`createSourceFile`) moved under `typescript/unstable/*`. Moving to 7 waits for a typescript-eslint
|
|
132
|
+
release that allows it and for those two tests to parse through a stable API.
|
|
133
|
+
|
|
105
134
|
Coverage is 100% for lines, statements, functions and branches, and there is no `c8 ignore`:
|
|
106
135
|
code a test cannot reach directly — a race, a permission, a broken install, a real download — takes
|
|
107
136
|
the effect as a parameter (the ports in `src/ports`, an injected `readdir` or runner), and the test
|
|
@@ -123,7 +152,7 @@ A venue is a **preset**, a JSONC file in `skills/submit-paper/references/venues/
|
|
|
123
152
|
2. **The card.** `venues/<name>.md` — prose about the venue: deadlines, tracks, the blind model,
|
|
124
153
|
what the form asks.
|
|
125
154
|
3. **A test.** A case in `src/presets.test.ts` that `paperlint:<name>` resolves over its family with
|
|
126
|
-
the kinds you declared; `src/tex-requirements.harness.
|
|
155
|
+
the kinds you declared; `src/tex-requirements.harness.ts` already checks every shipped preset
|
|
127
156
|
against the schema.
|
|
128
157
|
|
|
129
158
|
`paperlint toolchain` picks the new preset's packages up by itself, and the README and
|
|
@@ -60,13 +60,7 @@ export type BanalFailure = {
|
|
|
60
60
|
readonly why: BanalFailure;
|
|
61
61
|
};
|
|
62
62
|
export declare const PERL_MISSING: string;
|
|
63
|
-
/**
|
|
64
|
-
* What to tell a person. Most failures are one line; a sha256 mismatch shows both hashes.
|
|
65
|
-
*
|
|
66
|
-
* The one assertion below narrows the table's entry for `f.kind` to a function of `f`: the mapped
|
|
67
|
-
* type already pairs each kind with its own variant, and TypeScript cannot correlate the index with
|
|
68
|
-
* the argument on its own.
|
|
69
|
-
*/
|
|
63
|
+
/** What to tell a person. Most failures are one line; a sha256 mismatch shows both hashes. */
|
|
70
64
|
export declare function describe(f: BanalFailure): Lines;
|
|
71
65
|
/** `describe` as one line, for a caller that has a single line to fill. */
|
|
72
66
|
export declare function describeLine(f: BanalFailure): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"failure.d.ts","sourceRoot":"","sources":["../../../src/adapters/banal/failure.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,MAAM,YAAY,GACpB;IAAE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAA;CAAE,GACjC;IAAE,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAA;CAAE,GAClE;IACE,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B,GACD;IAAE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC3D;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACxD;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AACrD,0FAA0F;GACxF;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAC7D;IAAE,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GACzE;IAAE,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAA;CAAE,GAC1D;IACE,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AACH,uDAAuD;GACrD;IAAE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AACxD,kEAAkE;GAChE;IACE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,YAAY,CAAC;CAC5B,CAAC;AAEN,eAAO,MAAM,YAAY,QAE+E,CAAC;
|
|
1
|
+
{"version":3,"file":"failure.d.ts","sourceRoot":"","sources":["../../../src/adapters/banal/failure.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,MAAM,YAAY,GACpB;IAAE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAA;CAAE,GACjC;IAAE,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAA;CAAE,GAClE;IACE,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B,GACD;IAAE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC3D;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACxD;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AACrD,0FAA0F;GACxF;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAC7D;IAAE,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GACzE;IAAE,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAA;CAAE,GAC1D;IACE,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AACH,uDAAuD;GACrD;IAAE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AACxD,kEAAkE;GAChE;IACE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,YAAY,CAAC;CAC5B,CAAC;AAEN,eAAO,MAAM,YAAY,QAE+E,CAAC;AAyDzG,8FAA8F;AAC9F,wBAAgB,QAAQ,CAAC,CAAC,EAAE,YAAY,GAAG,KAAK,CAE/C;AAED,2EAA2E;AAC3E,wBAAgB,YAAY,CAAC,CAAC,EAAE,YAAY,GAAG,MAAM,CAEpD"}
|
|
@@ -41,15 +41,13 @@ const DESCRIBE = {
|
|
|
41
41
|
],
|
|
42
42
|
};
|
|
43
43
|
/**
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
* The one assertion below narrows the table's entry for `f.kind` to a function of `f`: the mapped
|
|
47
|
-
* type already pairs each kind with its own variant, and TypeScript cannot correlate the index with
|
|
48
|
-
* the argument on its own.
|
|
44
|
+
* The describer for `kind`, applied to its own variant. Generic over the kind, so the table's entry
|
|
45
|
+
* and the argument are correlated through `FailureOf[K]` and need no assertion (TypeScript#47109).
|
|
49
46
|
*/
|
|
47
|
+
const describeKind = (kind, f) => DESCRIBE[kind](f);
|
|
48
|
+
/** What to tell a person. Most failures are one line; a sha256 mismatch shows both hashes. */
|
|
50
49
|
export function describe(f) {
|
|
51
|
-
|
|
52
|
-
return write(f);
|
|
50
|
+
return describeKind(f.kind, f);
|
|
53
51
|
}
|
|
54
52
|
/** `describe` as one line, for a caller that has a single line to fill. */
|
|
55
53
|
export function describeLine(f) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"failure.js","sourceRoot":"","sources":["../../../src/adapters/banal/failure.ts"],"names":[],"mappings":"AAiDA,MAAM,CAAC,MAAM,YAAY,GACvB,0FAA0F;IAC1F,sGAAsG,CAAC;AAEzG,SAAS,OAAO,CAAC,CAAe;IAC9B,OAAO,CAAC,CAAC,IAAI,KAAK,oBAAoB;QACpC,CAAC,CAAC,iCAAiC,CAAC,CAAC,IAAI,wBAAwB;QACjE,CAAC,CAAC,oBAAoB,CAAC,CAAC,SAAS,4CAA4C,CAAC;AAClF,CAAC;
|
|
1
|
+
{"version":3,"file":"failure.js","sourceRoot":"","sources":["../../../src/adapters/banal/failure.ts"],"names":[],"mappings":"AAiDA,MAAM,CAAC,MAAM,YAAY,GACvB,0FAA0F;IAC1F,sGAAsG,CAAC;AAEzG,SAAS,OAAO,CAAC,CAAe;IAC9B,OAAO,CAAC,CAAC,IAAI,KAAK,oBAAoB;QACpC,CAAC,CAAC,iCAAiC,CAAC,CAAC,IAAI,wBAAwB;QACjE,CAAC,CAAC,oBAAoB,CAAC,CAAC,SAAS,4CAA4C,CAAC;AAClF,CAAC;AAOD,MAAM,MAAM,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,CAAC,IAAI,WAAW,CAAC;AAEvD,MAAM,QAAQ,GAAe;IAC3B,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC,YAAY,CAAC;IACpC,eAAe,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAC5C,gBAAgB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;QACvB,sBAAsB,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE;KACnE;IACD,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,iBAAiB,CAAC,CAAC,MAAM,MAAM,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC;IACzE,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,iBAAiB,CAAC,CAAC,OAAO,EAAE,CAAC;IACrD,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,iCAAiC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IAC7E,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,0BAA0B,CAAC,CAAC,IAAI,IAAI,SAAS,EAAE,CAAC;IACnE,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;QACpB,6CAA6C,CAAC,CAAC,UAAU,EAAE;KAC5D;IACD,kBAAkB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;QACzB,iDAAiD,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;KACvE;IACD,gBAAgB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;QACvB,uDAAuD,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE;KAC/E;IACD,iBAAiB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;QACxB,iCAAiC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,MAAM,EAAE;KACtD;IACD,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;QACrB,cAAc,CAAC,CAAC,GAAG,2DAA2D;QAC9E,YAAY,CAAC,CAAC,QAAQ,EAAE;QACxB,YAAY,CAAC,CAAC,GAAG,EAAE;KACpB;IACD,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;QACnB,YAAY,CAAC,CAAC,IAAI,yCAAyC;KAC5D;IACD,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;QACrB,YAAY,CAAC,CAAC,IAAI,kBAAkB,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE;KAC1D;CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,YAAY,GAAG,CAAiB,IAAO,EAAE,CAAe,EAAS,EAAE,CACvE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAEpB,8FAA8F;AAC9F,MAAM,UAAU,QAAQ,CAAC,CAAe;IACtC,OAAO,YAAY,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AACjC,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,YAAY,CAAC,CAAe;IAC1C,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adapters/banal/index.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adapters/banal/index.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAEvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAGnE,OAAO,EAAY,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,EAIL,KAAK,SAAS,EAEd,KAAK,WAAW,EACjB,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,OAAO,EACL,aAAa,EACb,SAAS,EACT,kBAAkB,EAClB,KAAK,aAAa,GACnB,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvD,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAS5C,mGAAmG;AACnG,wBAAgB,aAAa,CAC3B,CAAC,EAAE,SAAS,EACZ,CAAC,EAAE,aAAa,EAChB,WAAW,EAAE,YAAY,GACxB,eAAe,CAajB;AAUD;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,CAAC,EAAE,WAAW,EACd,CAAC,EAAE,aAAa,EAChB,MAAM,CAAC,EAAE,WAAW,GACnB,aAAa,CAiBf"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { err, ok } from "../../domain/result.js";
|
|
2
|
+
import { ready } from "../../domain/ready.js";
|
|
2
3
|
import { describe } from "./failure.js";
|
|
3
4
|
import { provenanceLabel } from "./locate.js";
|
|
4
5
|
import { pinLabel } from "./pin.js";
|
|
@@ -26,7 +27,7 @@ export function banalMeasurer(d, s, projectRoot) {
|
|
|
26
27
|
};
|
|
27
28
|
}
|
|
28
29
|
/** The one place banal's `Ready` is minted: from an `Installed`, whose `PinnedBanal` only run.ts mints. */
|
|
29
|
-
const
|
|
30
|
+
const readyOf = (i) => ready({
|
|
30
31
|
where: i.banal.path,
|
|
31
32
|
fresh: i.fresh,
|
|
32
33
|
verified: "sha256 verified, and it measured a probe page",
|
|
@@ -43,12 +44,12 @@ export function banalInstaller(d, s, source) {
|
|
|
43
44
|
...(source ? { source } : {}),
|
|
44
45
|
onDownload: report,
|
|
45
46
|
});
|
|
46
|
-
return r.ok ? ok(
|
|
47
|
+
return r.ok ? ok(readyOf(r.value)) : err(describe(r.error));
|
|
47
48
|
},
|
|
48
49
|
check() {
|
|
49
50
|
const r = checkBanal(d, s, source);
|
|
50
51
|
return r.ok
|
|
51
|
-
? ok(
|
|
52
|
+
? ok(readyOf({ banal: r.value, fresh: false }))
|
|
52
53
|
: err(describe(r.error));
|
|
53
54
|
},
|
|
54
55
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/adapters/banal/index.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/adapters/banal/index.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,wBAAwB,CAAC;AAEjD,OAAO,EAAE,KAAK,EAAc,MAAM,uBAAuB,CAAC;AAE1D,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,eAAe,EAAuB,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAoB,MAAM,UAAU,CAAC;AACtD,OAAO,EACL,UAAU,EACV,WAAW,EACX,eAAe,GAIhB,MAAM,UAAU,CAAC;AAGlB,OAAO,EACL,aAAa,EACb,SAAS,EACT,kBAAkB,GAEnB,MAAM,eAAe,CAAC;AAIvB,gGAAgG;AAChG,MAAM,UAAU,GAAG,CAAC,CAAiB,EAAc,EAAE,CAAC,CAAC;IACrD,IAAI,EAAE,OAAO;IACb,IAAI,EAAE,CAAC,CAAC,IAAI;IACZ,GAAG,EAAE,eAAe,CAAC,CAAC,CAAC,UAAU,CAAC;CACnC,CAAC,CAAC;AAEH,mGAAmG;AACnG,MAAM,UAAU,aAAa,CAC3B,CAAY,EACZ,CAAgB,EAChB,WAAyB;IAEzB,OAAO;QACL,OAAO,CAAC,KAAK;YACX,MAAM,CAAC,GAAG,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;YACpD,OAAO,CAAC,CAAC,MAAM,KAAK,OAAO;gBACzB,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE;gBAClE,CAAC,CAAC;oBACE,IAAI,EAAE,YAAY;oBAClB,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC;oBACpB,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI;iBAC5C,CAAC;QACR,CAAC;KACF,CAAC;AACJ,CAAC;AAED,2GAA2G;AAC3G,MAAM,OAAO,GAAG,CAAC,CAAY,EAAS,EAAE,CACtC,KAAK,CAAC;IACJ,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI;IACnB,KAAK,EAAE,CAAC,CAAC,KAAK;IACd,QAAQ,EAAE,+CAA+C;CAC1D,CAAC,CAAC;AAEL;;;GAGG;AACH,MAAM,UAAU,cAAc,CAC5B,CAAc,EACd,CAAgB,EAChB,MAAoB;IAEpB,OAAO;QACL,KAAK,EAAE,QAAQ,EAAE;QACjB,MAAM,CAAC,MAAM;YACX,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE;gBAC1B,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7B,UAAU,EAAE,MAAM;aACnB,CAAC,CAAC;YACH,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9D,CAAC;QACD,KAAK;YACH,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;YACnC,OAAO,CAAC,CAAC,EAAE;gBACT,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC/C,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7B,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../../src/adapters/banal/install.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAa,KAAK,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C,iGAAiG;AACjG,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAE5D,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../../src/adapters/banal/install.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAa,KAAK,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C,iGAAiG;AACjG,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAE5D,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAQD,wBAAgB,SAAS,CACvB,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,WAAW,GAClB,MAAM,CAAC,WAAW,EAAE,WAAW,CAAC,CAIlC;AAED,iDAAiD;AACjD,MAAM,MAAM,cAAc,GACtB;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAC3B;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAA;CAAE,GAChE;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC;AAEhC,wBAAgB,cAAc,CAC5B,OAAO,EAAE,UAAU,GAAG,IAAI,EAC1B,MAAM,EAAE,WAAW,GAClB,cAAc,CAIhB"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { err, ok } from "../../domain/result.js";
|
|
2
2
|
import { sha256Hex } from "../../domain/sha256.js";
|
|
3
|
+
// The brand's one owner: the predicate IS the pin check, so no assertion is needed to mint the type.
|
|
4
|
+
const isPinned = (bytes, source) => sha256Hex(bytes) === source.sha256;
|
|
3
5
|
export function verifyPin(bytes, source) {
|
|
4
|
-
|
|
5
|
-
return got === source.sha256
|
|
6
|
+
return isPinned(bytes, source)
|
|
6
7
|
? ok(bytes)
|
|
7
|
-
: err({ expected: source.sha256, got });
|
|
8
|
+
: err({ expected: source.sha256, got: sha256Hex(bytes) });
|
|
8
9
|
}
|
|
9
10
|
export function installedState(current, source) {
|
|
10
11
|
if (current === null)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../../src/adapters/banal/install.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,GAAG,EAAE,EAAE,EAAe,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAe,MAAM,wBAAwB,CAAC;AAWhE,MAAM,
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../../src/adapters/banal/install.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,GAAG,EAAE,EAAE,EAAe,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAe,MAAM,wBAAwB,CAAC;AAWhE,qGAAqG;AACrG,MAAM,QAAQ,GAAG,CACf,KAAiB,EACjB,MAAmB,EACG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC;AAE9D,MAAM,UAAU,SAAS,CACvB,KAAiB,EACjB,MAAmB;IAEnB,OAAO,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QAC5B,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACX,CAAC,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AAC9D,CAAC;AAQD,MAAM,UAAU,cAAc,CAC5B,OAA0B,EAC1B,MAAmB;IAEnB,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAChD,MAAM,CAAC,GAAG,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACrC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;AAChF,CAAC"}
|
|
@@ -7,18 +7,20 @@
|
|
|
7
7
|
* (`Error: Failed to run pdftohtml`, measured); told a version below 0.85 it applies a larger
|
|
8
8
|
* correction and every font size moves. So `$PDFTOHTML` (banal's own override, line 166) points at a
|
|
9
9
|
* stub that answers `-v` with `XML_DIALECT.version` — the pdftohtml whose XML `xml.ts` writes — and
|
|
10
|
-
* refuses anything else. `test/e2e/banal.
|
|
10
|
+
* refuses anything else. `test/e2e/banal.ts` shows both failures with the real banal.
|
|
11
11
|
*/
|
|
12
12
|
import type { Opaque } from "ts-essentials";
|
|
13
13
|
import type { AbsolutePath } from "../../domain/paths.ts";
|
|
14
14
|
import type { Command } from "../../ports/process.ts";
|
|
15
15
|
import type { Scratch } from "../../ports/workspace.ts";
|
|
16
|
-
import type {
|
|
16
|
+
import type { BanalCandidate } from "./locate.ts";
|
|
17
17
|
import type { PageLayout } from "../../domain/page-layout.ts";
|
|
18
18
|
/** banal takes well under a second on a paper; a hang still has to end. */
|
|
19
19
|
export declare const BANAL_RUN_MS = 120000;
|
|
20
20
|
/** A path quoted for `/bin/sh`. Minted by `shQuote` only. */
|
|
21
21
|
export type ShQuoted = Opaque<string, "ShQuoted">;
|
|
22
|
+
/** A word already quoted for `/bin/sh`, checked; anything else throws. */
|
|
23
|
+
export declare function parseShQuoted(s: string): ShQuoted;
|
|
22
24
|
/** banal interpolates `$PDFTOHTML` into a shell command unquoted — so the value is quoted here. */
|
|
23
25
|
export declare const shQuote: (s: string) => ShQuoted;
|
|
24
26
|
/** The stub standing in for `pdftohtml`: it answers `-v` and refuses to convert anything. */
|
|
@@ -36,13 +38,16 @@ export interface BanalStaging {
|
|
|
36
38
|
];
|
|
37
39
|
}
|
|
38
40
|
export declare const stageBanalInput: (pages: readonly PageLayout[]) => BanalStaging;
|
|
41
|
+
declare const STAGED: unique symbol;
|
|
39
42
|
/** The staging written to disk. Minted by `stage` only: both files written, or nothing returned. */
|
|
40
|
-
export
|
|
43
|
+
export interface StagedInput {
|
|
41
44
|
readonly xml: AbsolutePath;
|
|
42
45
|
readonly stub: AbsolutePath;
|
|
43
|
-
|
|
46
|
+
readonly [STAGED]: true;
|
|
47
|
+
}
|
|
44
48
|
/** Write a staging into a scratch directory, the stub executable. The only minter of `StagedInput`. */
|
|
45
49
|
export declare function stage(s: Scratch, staging: BanalStaging): StagedInput;
|
|
46
50
|
/** `perl banal -no-time -json <xml>`, with `$PDFTOHTML` quoted by construction. */
|
|
47
|
-
export declare function banalCommand(banal:
|
|
51
|
+
export declare function banalCommand(banal: Pick<BanalCandidate, "path">, staged: StagedInput, baseEnv: Readonly<Record<string, string>>): Command;
|
|
52
|
+
export {};
|
|
48
53
|
//# sourceMappingURL=invocation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"invocation.d.ts","sourceRoot":"","sources":["../../../src/adapters/banal/invocation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"invocation.d.ts","sourceRoot":"","sources":["../../../src/adapters/banal/invocation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAG9D,2EAA2E;AAC3E,eAAO,MAAM,YAAY,SAAU,CAAC;AAEpC,6DAA6D;AAC7D,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AAMlD,0EAA0E;AAC1E,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,QAAQ,CAGjD;AAED,mGAAmG;AACnG,eAAO,MAAM,OAAO,GAAI,GAAG,MAAM,KAAG,QACY,CAAC;AAEjD,6FAA6F;AAC7F,eAAO,MAAM,cAAc,QAWf,CAAC;AAEb,MAAM,WAAW,UAAU,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,GAAG,MAAM;IACrE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACjB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;CAClB;AAED,yGAAyG;AACzG,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,SAAS;QACvB,UAAU,CAAC,WAAW,EAAE,MAAM,CAAC;QAC/B,UAAU,CAAC,WAAW,EAAE,MAAM,CAAC;KAChC,CAAC;CACH;AAED,eAAO,MAAM,eAAe,GAC1B,OAAO,SAAS,UAAU,EAAE,KAC3B,YAKD,CAAC;AAGH,QAAA,MAAM,MAAM,eAAwB,CAAC;AAErC,oGAAoG;AACpG,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,EAAE,YAAY,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC;CACzB;AAED,uGAAuG;AACvG,wBAAgB,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,GAAG,WAAW,CAOpE;AAED,mFAAmF;AACnF,wBAAgB,YAAY,CAC1B,KAAK,EAAE,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,EACnC,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GACxC,OAAO,CAQT"}
|
|
@@ -1,8 +1,17 @@
|
|
|
1
1
|
import { pdf2xml, XML_DIALECT } from "./xml.js";
|
|
2
2
|
/** banal takes well under a second on a paper; a hang still has to end. */
|
|
3
3
|
export const BANAL_RUN_MS = 120_000;
|
|
4
|
+
// One single-quoted word: any run of non-quotes, each quote spelled `'"'"'`. What `shQuote` writes.
|
|
5
|
+
const SH_QUOTED = /^'(?:[^']|'"'"')*'$/;
|
|
6
|
+
const isShQuoted = (s) => SH_QUOTED.test(s);
|
|
7
|
+
/** A word already quoted for `/bin/sh`, checked; anything else throws. */
|
|
8
|
+
export function parseShQuoted(s) {
|
|
9
|
+
if (!isShQuoted(s))
|
|
10
|
+
throw new Error(`not one single-quoted shell word: ${s}`);
|
|
11
|
+
return s;
|
|
12
|
+
}
|
|
4
13
|
/** banal interpolates `$PDFTOHTML` into a shell command unquoted — so the value is quoted here. */
|
|
5
|
-
export const shQuote = (s) => `'${s.replace(/'/g, `'"'"'`)}'
|
|
14
|
+
export const shQuote = (s) => parseShQuoted(`'${s.replace(/'/g, `'"'"'`)}'`);
|
|
6
15
|
/** The stub standing in for `pdftohtml`: it answers `-v` and refuses to convert anything. */
|
|
7
16
|
export const PDFTOHTML_STUB = [
|
|
8
17
|
"#!/bin/sh",
|
|
@@ -22,12 +31,15 @@ export const stageBanalInput = (pages) => ({
|
|
|
22
31
|
{ name: "pdftohtml", content: PDFTOHTML_STUB, mode: "exec" },
|
|
23
32
|
],
|
|
24
33
|
});
|
|
34
|
+
// Not exported: only `stage` can write the property, so only it can make a StagedInput.
|
|
35
|
+
const STAGED = Symbol("StagedInput");
|
|
25
36
|
/** Write a staging into a scratch directory, the stub executable. The only minter of `StagedInput`. */
|
|
26
37
|
export function stage(s, staging) {
|
|
27
38
|
const [xml, stub] = staging.files;
|
|
28
39
|
return {
|
|
29
40
|
xml: s.write(xml.name, xml.content, xml.mode),
|
|
30
41
|
stub: s.write(stub.name, stub.content, stub.mode),
|
|
42
|
+
[STAGED]: true,
|
|
31
43
|
};
|
|
32
44
|
}
|
|
33
45
|
/** `perl banal -no-time -json <xml>`, with `$PDFTOHTML` quoted by construction. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"invocation.js","sourceRoot":"","sources":["../../../src/adapters/banal/invocation.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEhD,2EAA2E;AAC3E,MAAM,CAAC,MAAM,YAAY,GAAG,OAAO,CAAC;AAKpC,mGAAmG;AACnG,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAS,EAAY,EAAE,CAC7C,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"invocation.js","sourceRoot":"","sources":["../../../src/adapters/banal/invocation.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEhD,2EAA2E;AAC3E,MAAM,CAAC,MAAM,YAAY,GAAG,OAAO,CAAC;AAKpC,oGAAoG;AACpG,MAAM,SAAS,GAAG,qBAAqB,CAAC;AACxC,MAAM,UAAU,GAAG,CAAC,CAAS,EAAiB,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAEnE,0EAA0E;AAC1E,MAAM,UAAU,aAAa,CAAC,CAAS;IACrC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,EAAE,CAAC,CAAC;IAC9E,OAAO,CAAC,CAAC;AACX,CAAC;AAED,mGAAmG;AACnG,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAS,EAAY,EAAE,CAC7C,aAAa,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;AAEjD,6FAA6F;AAC7F,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,WAAW;IACX,kFAAkF;IAClF,4FAA4F;IAC5F,0BAA0B;IAC1B,6BAA6B,WAAW,CAAC,OAAO,GAAG;IACnD,UAAU;IACV,IAAI;IACJ,4GAA4G;IAC5G,QAAQ;IACR,EAAE;CACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAgBb,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,KAA4B,EACd,EAAE,CAAC,CAAC;IAClB,KAAK,EAAE;QACL,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE;QAC5D,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE;KAC7D;CACF,CAAC,CAAC;AAEH,wFAAwF;AACxF,MAAM,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;AASrC,uGAAuG;AACvG,MAAM,UAAU,KAAK,CAAC,CAAU,EAAE,OAAqB;IACrD,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC;IAClC,OAAO;QACL,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC;QAC7C,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC;QACjD,CAAC,MAAM,CAAC,EAAE,IAAI;KACf,CAAC;AACJ,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,YAAY,CAC1B,KAAmC,EACnC,MAAmB,EACnB,OAAyC;IAEzC,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC;QACnD,GAAG,EAAE,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;QACpD,SAAS,EAAE,YAAY;QACvB,cAAc,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;KACjC,CAAC;AACJ,CAAC"}
|
|
@@ -1,5 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Where a banal may be, in order; which one is there; and which rule found it. The order:
|
|
3
|
+
* `$BANAL` (an explicit choice — if it names nothing, there is NO fallback), `<project>/vendor/banal`
|
|
4
|
+
* (a project that vendors its own copy), then the one `paperlint toolchain` installed.
|
|
5
|
+
*/
|
|
6
|
+
import { type AbsolutePath } from "../../domain/paths.ts";
|
|
3
7
|
import { type Result } from "../../domain/result.ts";
|
|
4
8
|
import type { BanalSettings } from "./settings.ts";
|
|
5
9
|
export type Provenance = {
|
|
@@ -13,13 +17,11 @@ export interface BanalCandidate {
|
|
|
13
17
|
readonly path: AbsolutePath;
|
|
14
18
|
readonly provenance: Provenance;
|
|
15
19
|
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
*/
|
|
22
|
-
export type PinnedBanal = Opaque<BanalCandidate, "PinnedBanal">;
|
|
20
|
+
declare const LOCATED: unique symbol;
|
|
21
|
+
/** A candidate the `Files` port confirmed is a file. Minted by `pickBanal` (through `locate`) only. */
|
|
22
|
+
export type LocatedBanal = BanalCandidate & {
|
|
23
|
+
readonly [LOCATED]: true;
|
|
24
|
+
};
|
|
23
25
|
/** Why there is no banal to run. */
|
|
24
26
|
export type BanalMissing =
|
|
25
27
|
/** `$BANAL` names a file that is not there. An explicit choice: no fallback to another banal. */
|
|
@@ -47,4 +49,5 @@ export declare function lookupOrder(s: BanalSettings, projectRoot: AbsolutePath)
|
|
|
47
49
|
export declare function pickBanal(order: LookupOrder, isFile: (p: AbsolutePath) => boolean): Result<LocatedBanal, BanalMissing>;
|
|
48
50
|
/** Which rule found it, as a person reads it. */
|
|
49
51
|
export declare const provenanceLabel: (p: Provenance) => string;
|
|
52
|
+
export {};
|
|
50
53
|
//# sourceMappingURL=locate.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"locate.d.ts","sourceRoot":"","sources":["../../../src/adapters/banal/locate.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"locate.d.ts","sourceRoot":"","sources":["../../../src/adapters/banal/locate.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAY,KAAK,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,MAAM,UAAU,GAClB;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAA;CAAE,GACxB;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAC3B;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAE/B,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;CACjC;AAGD,QAAA,MAAM,OAAO,eAAyB,CAAC;AAEvC,uGAAuG;AACvG,MAAM,MAAM,YAAY,GAAG,cAAc,GAAG;IAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,CAAA;CAAE,CAAC;AAWzE,oCAAoC;AACpC,MAAM,MAAM,YAAY;AACtB,iGAAiG;AAC/F;IAAE,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AAChE,8FAA8F;GAC5F;IAAE,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnE,iGAAiG;AACjG,MAAM,MAAM,WAAW,GACnB;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAA;CAAE,GAC1D;IACE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;CAC9B,CAAC;AAEN,0FAA0F;AAC1F,eAAO,MAAM,cAAc,GAAI,GAAG,aAAa,KAAG,YACY,CAAC;AAE/D,wBAAgB,WAAW,CACzB,CAAC,EAAE,aAAa,EAChB,WAAW,EAAE,YAAY,GACxB,WAAW,CAOb;AAED,wBAAgB,SAAS,CACvB,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,CAAC,CAAC,EAAE,YAAY,KAAK,OAAO,GACnC,MAAM,CAAC,YAAY,EAAE,YAAY,CAAC,CAapC;AAED,iDAAiD;AACjD,eAAO,MAAM,eAAe,GAAI,GAAG,UAAU,KAAG,MAG7C,CAAC"}
|
|
@@ -3,31 +3,38 @@
|
|
|
3
3
|
* `$BANAL` (an explicit choice — if it names nothing, there is NO fallback), `<project>/vendor/banal`
|
|
4
4
|
* (a project that vendors its own copy), then the one `paperlint toolchain` installed.
|
|
5
5
|
*/
|
|
6
|
-
import {
|
|
6
|
+
import { joinPath } from "../../domain/paths.js";
|
|
7
7
|
import { err, ok } from "../../domain/result.js";
|
|
8
8
|
import { BANAL_PIN } from "./pin.js";
|
|
9
|
+
// Not exported: only this module can write the property, so only `locate` can make a LocatedBanal.
|
|
10
|
+
const LOCATED = Symbol("LocatedBanal");
|
|
11
|
+
/** `path` as a banal to run — when the `Files` port says it is a file, else null. */
|
|
12
|
+
function locate(path, kind, isFile) {
|
|
13
|
+
return isFile(path) ? { path, provenance: { kind }, [LOCATED]: true } : null;
|
|
14
|
+
}
|
|
9
15
|
/** Where `paperlint toolchain` puts the pinned banal: one directory per HotCRP commit. */
|
|
10
|
-
export const installedBanal = (s) =>
|
|
16
|
+
export const installedBanal = (s) => joinPath(s.cacheDir, BANAL_PIN.commit.slice(0, 12), "banal");
|
|
11
17
|
export function lookupOrder(s, projectRoot) {
|
|
12
18
|
if (s.explicit)
|
|
13
19
|
return { kind: "explicit", path: s.explicit };
|
|
14
20
|
return {
|
|
15
21
|
kind: "search",
|
|
16
|
-
vendor:
|
|
22
|
+
vendor: joinPath(projectRoot, "vendor", "banal"),
|
|
17
23
|
cache: installedBanal(s),
|
|
18
24
|
};
|
|
19
25
|
}
|
|
20
|
-
const located = (path, kind) => ok({ path, provenance: { kind } });
|
|
21
26
|
export function pickBanal(order, isFile) {
|
|
22
|
-
if (order.kind === "explicit")
|
|
23
|
-
|
|
24
|
-
|
|
27
|
+
if (order.kind === "explicit") {
|
|
28
|
+
const own = locate(order.path, "env", isFile);
|
|
29
|
+
return own
|
|
30
|
+
? ok(own)
|
|
25
31
|
: err({ kind: "explicit-not-found", path: order.path });
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
32
|
+
}
|
|
33
|
+
const found = locate(order.vendor, "vendor", isFile) ??
|
|
34
|
+
locate(order.cache, "cache", isFile);
|
|
35
|
+
return found
|
|
36
|
+
? ok(found)
|
|
37
|
+
: err({ kind: "not-installed", installed: order.cache });
|
|
31
38
|
}
|
|
32
39
|
/** Which rule found it, as a person reads it. */
|
|
33
40
|
export const provenanceLabel = (p) => ({ env: "$BANAL", vendor: "vendor/banal", cache: "paperlint toolchain" })[p.kind];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"locate.js","sourceRoot":"","sources":["../../../src/adapters/banal/locate.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"locate.js","sourceRoot":"","sources":["../../../src/adapters/banal/locate.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,QAAQ,EAAqB,MAAM,uBAAuB,CAAC;AACpE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAe,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAarC,mGAAmG;AACnG,MAAM,OAAO,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;AAKvC,qFAAqF;AACrF,SAAS,MAAM,CACb,IAAkB,EAClB,IAAwB,EACxB,MAAoC;IAEpC,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/E,CAAC;AAkBD,0FAA0F;AAC1F,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAgB,EAAgB,EAAE,CAC/D,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;AAE/D,MAAM,UAAU,WAAW,CACzB,CAAgB,EAChB,WAAyB;IAEzB,IAAI,CAAC,CAAC,QAAQ;QAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC9D,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,QAAQ,CAAC,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAC;QAChD,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC;KACzB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS,CACvB,KAAkB,EAClB,MAAoC;IAEpC,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC9B,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QAC9C,OAAO,GAAG;YACR,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC;YACT,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC;IACD,MAAM,KAAK,GACT,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACvC,OAAO,KAAK;QACV,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACX,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,SAAS,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED,iDAAiD;AACjD,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAa,EAAU,EAAE,CACvD,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC,CACvE,CAAC,CAAC,IAAI,CACP,CAAC"}
|
|
@@ -32,7 +32,7 @@ import type { RunProcess } from "../../ports/process.ts";
|
|
|
32
32
|
import type { Workspace } from "../../ports/workspace.ts";
|
|
33
33
|
import { type Result } from "../../domain/result.ts";
|
|
34
34
|
import type { BanalFailure } from "./failure.ts";
|
|
35
|
-
import { type BanalCandidate
|
|
35
|
+
import { type BanalCandidate } from "./locate.ts";
|
|
36
36
|
import { type BanalSource } from "./pin.ts";
|
|
37
37
|
import type { BanalSettings } from "./settings.ts";
|
|
38
38
|
import type { PageLayout } from "../../domain/page-layout.ts";
|
|
@@ -67,6 +67,14 @@ export type BanalOutcome = {
|
|
|
67
67
|
* `vendor/banal`, or `paperlint toolchain`'s — or why there is none.
|
|
68
68
|
*/
|
|
69
69
|
export declare function measureGeometry(d: BanalDeps, s: BanalSettings, projectRoot: AbsolutePath, pages: readonly PageLayout[]): BanalOutcome;
|
|
70
|
+
declare const PINNED: unique symbol;
|
|
71
|
+
/**
|
|
72
|
+
* `paperlint toolchain`'s banal after its bytes hashed to the pin AND it measured the probe page. Minted by
|
|
73
|
+
* `probe` only, for `ensureBanal` / `checkBanal` (`./index.ts`): a "ready" line cannot be printed without one.
|
|
74
|
+
*/
|
|
75
|
+
export type PinnedBanal = BanalCandidate & {
|
|
76
|
+
readonly [PINNED]: true;
|
|
77
|
+
};
|
|
70
78
|
export interface Installed {
|
|
71
79
|
readonly banal: PinnedBanal;
|
|
72
80
|
/** True when this run downloaded it. */
|
|
@@ -86,4 +94,5 @@ export interface EnsureOptions {
|
|
|
86
94
|
export declare function ensureBanal(d: InstallDeps, s: BanalSettings, o?: EnsureOptions): Result<Installed, BanalFailure>;
|
|
87
95
|
/** `--check`: is the pinned banal installed and running? The same predicate as `ensureBanal`, no download. */
|
|
88
96
|
export declare function checkBanal(d: BanalDeps, s: BanalSettings, source?: BanalSource): Result<PinnedBanal, BanalFailure>;
|
|
97
|
+
export {};
|
|
89
98
|
//# sourceMappingURL=run.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/adapters/banal/run.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAoB,KAAK,MAAM,EAAE,MAAM,wBAAwB,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAQjD,OAAO,EAIL,KAAK,cAAc,
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/adapters/banal/run.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAoB,KAAK,MAAM,EAAE,MAAM,wBAAwB,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAQjD,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,aAAa,CAAC;AAMrB,OAAO,EAAuB,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC;AAEjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAE9D,gCAAgC;AAChC,eAAO,MAAM,sBAAsB,KAAK,CAAC;AAEzC,iCAAiC;AACjC,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;CAC/B;AAED,8DAA8D;AAC9D,MAAM,WAAW,WAAY,SAAQ,SAAS;IAC5C,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;CAC7B;AAED;;;GAGG;AACH,MAAM,MAAM,YAAY,GACpB;IACE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,EAAE,cAAc,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;CACjC,GACD;IACE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,YAAY,CAAC;IAC3B,mEAAmE;IACnE,QAAQ,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAAC;CACvC,CAAC;AAyBN;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,CAAC,EAAE,SAAS,EACZ,CAAC,EAAE,aAAa,EAChB,WAAW,EAAE,YAAY,EACzB,KAAK,EAAE,SAAS,UAAU,EAAE,GAC3B,YAAY,CAed;AAgBD,QAAA,MAAM,MAAM,eAAwB,CAAC;AAErC;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,cAAc,GAAG;IAAE,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,CAAA;CAAE,CAAC;AAqCvE,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,wCAAwC;IACxC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,yEAAyE;IACzE,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,2DAA2D;IAC3D,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,CAAC,EAAE,WAAW,EACd,CAAC,EAAE,aAAa,EAChB,CAAC,GAAE,aAAkB,GACpB,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,CAajC;AAED,8GAA8G;AAC9G,wBAAgB,UAAU,CACxB,CAAC,EAAE,SAAS,EACZ,CAAC,EAAE,aAAa,EAChB,MAAM,GAAE,WAAuB,GAC9B,MAAM,CAAC,WAAW,EAAE,YAAY,CAAC,CAYnC"}
|
|
@@ -7,7 +7,10 @@ import { BANAL_PIN, pinLabel } from "./pin.js";
|
|
|
7
7
|
import { acceptProbe, PROBE_PAGE } from "./probe.js";
|
|
8
8
|
/** Seconds: banal is ~90 KB. */
|
|
9
9
|
export const BANAL_DOWNLOAD_SECONDS = 60;
|
|
10
|
-
/**
|
|
10
|
+
/**
|
|
11
|
+
* Run `banal` on `pages` in a scratch directory that is gone when this returns. It needs the path
|
|
12
|
+
* only: `measureGeometry` passes the banal `pickBanal` located, `probe` the one whose bytes it verified.
|
|
13
|
+
*/
|
|
11
14
|
function runBanal(d, s, banal, pages) {
|
|
12
15
|
return d.workspace.within("paperlint-banal-", (scratch) => parseBanalOutput(d.run.run(banalCommand(banal, stage(scratch, stageBanalInput(pages)), s.processEnv))));
|
|
13
16
|
}
|
|
@@ -40,15 +43,16 @@ function perlRuns(d, s) {
|
|
|
40
43
|
});
|
|
41
44
|
return r.kind === "exited" && r.status === 0;
|
|
42
45
|
}
|
|
46
|
+
// Not exported: only `probe` below can write the property, so only it can make a PinnedBanal.
|
|
47
|
+
const PINNED = Symbol("PinnedBanal");
|
|
43
48
|
/**
|
|
44
49
|
* Does the installed, pin-verified banal RUN — accepted by measuring the probe page, not by a
|
|
45
50
|
* download's exit code. The one place a `PinnedBanal` is minted; callers verified the bytes first.
|
|
46
51
|
*/
|
|
47
52
|
function probe(d, s, path) {
|
|
48
|
-
const
|
|
49
|
-
const r = andThen(runBanal(d, s, at, [PROBE_PAGE]), acceptProbe);
|
|
53
|
+
const r = andThen(runBanal(d, s, { path }, [PROBE_PAGE]), acceptProbe);
|
|
50
54
|
return r.ok
|
|
51
|
-
? ok(
|
|
55
|
+
? ok({ path, provenance: { kind: "cache" }, [PINNED]: true })
|
|
52
56
|
: err({ kind: "does-not-run", path, why: r.error });
|
|
53
57
|
}
|
|
54
58
|
/** Download `source` into `dest`, keeping the bytes only when they hash to the pin. */
|