@redocly/recheck 0.1.0 → 0.3.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/README.md +1023 -56
- package/dist/cli.js +40 -7
- package/dist/cli.js.map +1 -1
- package/dist/commands/markdoc-schema.d.ts +17 -0
- package/dist/commands/markdoc-schema.d.ts.map +1 -0
- package/dist/commands/markdoc-schema.js +127 -0
- package/dist/commands/markdoc-schema.js.map +1 -0
- package/dist/commands/run.d.ts +2 -1
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +87 -10
- package/dist/commands/run.js.map +1 -1
- package/dist/config/load.d.ts +11 -0
- package/dist/config/load.d.ts.map +1 -1
- package/dist/config/load.js +12 -2
- package/dist/config/load.js.map +1 -1
- package/dist/config/presets/google.d.ts +3 -0
- package/dist/config/presets/google.d.ts.map +1 -0
- package/dist/config/presets/google.js +1671 -0
- package/dist/config/presets/google.js.map +1 -0
- package/dist/config/presets/inclusive-language.d.ts +3 -0
- package/dist/config/presets/inclusive-language.d.ts.map +1 -0
- package/dist/config/presets/inclusive-language.js +321 -0
- package/dist/config/presets/inclusive-language.js.map +1 -0
- package/dist/config/presets/index.d.ts +67 -0
- package/dist/config/presets/index.d.ts.map +1 -0
- package/dist/config/presets/index.js +137 -0
- package/dist/config/presets/index.js.map +1 -0
- package/dist/config/presets/markdoc.d.ts +21 -0
- package/dist/config/presets/markdoc.d.ts.map +1 -0
- package/dist/config/presets/markdoc.js +101 -0
- package/dist/config/presets/markdoc.js.map +1 -0
- package/dist/config/presets/markdown-relaxed.d.ts +3 -0
- package/dist/config/presets/markdown-relaxed.d.ts.map +1 -0
- package/dist/config/presets/markdown-relaxed.js +98 -0
- package/dist/config/presets/markdown-relaxed.js.map +1 -0
- package/dist/config/presets/markdown.d.ts +43 -0
- package/dist/config/presets/markdown.d.ts.map +1 -0
- package/dist/config/presets/markdown.js +132 -0
- package/dist/config/presets/markdown.js.map +1 -0
- package/dist/config/presets/microsoft.d.ts +3 -0
- package/dist/config/presets/microsoft.d.ts.map +1 -0
- package/dist/config/presets/microsoft.js +2268 -0
- package/dist/config/presets/microsoft.js.map +1 -0
- package/dist/config/presets/minimal.d.ts +3 -0
- package/dist/config/presets/minimal.d.ts.map +1 -0
- package/dist/config/presets/minimal.js +21 -0
- package/dist/config/presets/minimal.js.map +1 -0
- package/dist/config/presets/plain-language.d.ts +3 -0
- package/dist/config/presets/plain-language.d.ts.map +1 -0
- package/dist/config/presets/plain-language.js +351 -0
- package/dist/config/presets/plain-language.js.map +1 -0
- package/dist/config/presets/prose.d.ts +52 -0
- package/dist/config/presets/prose.d.ts.map +1 -0
- package/dist/config/presets/prose.js +138 -0
- package/dist/config/presets/prose.js.map +1 -0
- package/dist/config/schema.d.ts +128 -22
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +105 -21
- package/dist/config/schema.js.map +1 -1
- package/dist/config/validate.d.ts +12 -2
- package/dist/config/validate.d.ts.map +1 -1
- package/dist/config/validate.js +1200 -44
- package/dist/config/validate.js.map +1 -1
- package/dist/core/auto-fix.d.ts +8 -13
- package/dist/core/auto-fix.d.ts.map +1 -1
- package/dist/core/auto-fix.js +94 -75
- package/dist/core/auto-fix.js.map +1 -1
- package/dist/core/case-preserve.d.ts +46 -0
- package/dist/core/case-preserve.d.ts.map +1 -0
- package/dist/core/case-preserve.js +57 -0
- package/dist/core/case-preserve.js.map +1 -0
- package/dist/core/directives.d.ts +9 -0
- package/dist/core/directives.d.ts.map +1 -0
- package/dist/core/directives.js +73 -0
- package/dist/core/directives.js.map +1 -0
- package/dist/core/files.d.ts +63 -0
- package/dist/core/files.d.ts.map +1 -1
- package/dist/core/files.js +185 -0
- package/dist/core/files.js.map +1 -1
- package/dist/core/inline-code.d.ts +87 -0
- package/dist/core/inline-code.d.ts.map +1 -0
- package/dist/core/inline-code.js +104 -0
- package/dist/core/inline-code.js.map +1 -0
- package/dist/core/line-endings.d.ts +32 -0
- package/dist/core/line-endings.d.ts.map +1 -0
- package/dist/core/line-endings.js +65 -0
- package/dist/core/line-endings.js.map +1 -0
- package/dist/core/markdoc-tags.d.ts +79 -0
- package/dist/core/markdoc-tags.d.ts.map +1 -0
- package/dist/core/markdoc-tags.js +131 -0
- package/dist/core/markdoc-tags.js.map +1 -0
- package/dist/core/rule-filters.d.ts +17 -0
- package/dist/core/rule-filters.d.ts.map +1 -1
- package/dist/core/rule-filters.js +64 -0
- package/dist/core/rule-filters.js.map +1 -1
- package/dist/core/runner.d.ts +92 -3
- package/dist/core/runner.d.ts.map +1 -1
- package/dist/core/runner.js +348 -110
- package/dist/core/runner.js.map +1 -1
- package/dist/core/timing.d.ts.map +1 -1
- package/dist/data/markdoc-realm-schema.d.ts +3 -0
- package/dist/data/markdoc-realm-schema.d.ts.map +1 -0
- package/dist/data/markdoc-realm-schema.js +760 -0
- package/dist/data/markdoc-realm-schema.js.map +1 -0
- package/dist/data/proper-nouns.d.ts +2 -0
- package/dist/data/proper-nouns.d.ts.map +1 -0
- package/dist/data/proper-nouns.js +47 -0
- package/dist/data/proper-nouns.js.map +1 -0
- package/dist/index.d.ts +90 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +152 -0
- package/dist/index.js.map +1 -0
- package/dist/metrics/formulas.d.ts +17 -0
- package/dist/metrics/formulas.d.ts.map +1 -0
- package/dist/metrics/formulas.js +70 -0
- package/dist/metrics/formulas.js.map +1 -0
- package/dist/metrics/index.d.ts +5 -0
- package/dist/metrics/index.d.ts.map +1 -0
- package/dist/metrics/index.js +3 -0
- package/dist/metrics/index.js.map +1 -0
- package/dist/metrics/statistics.d.ts +27 -0
- package/dist/metrics/statistics.d.ts.map +1 -0
- package/dist/metrics/statistics.js +56 -0
- package/dist/metrics/statistics.js.map +1 -0
- package/dist/parser/index.d.ts +18 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +168 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/markdoc/extract-statics.d.ts +45 -0
- package/dist/parser/markdoc/extract-statics.d.ts.map +1 -0
- package/dist/parser/markdoc/extract-statics.js +139 -0
- package/dist/parser/markdoc/extract-statics.js.map +1 -0
- package/dist/parser/markdoc/pairing.d.ts +63 -0
- package/dist/parser/markdoc/pairing.d.ts.map +1 -0
- package/dist/parser/markdoc/pairing.js +94 -0
- package/dist/parser/markdoc/pairing.js.map +1 -0
- package/dist/parser/markdoc/schema.d.ts +85 -0
- package/dist/parser/markdoc/schema.d.ts.map +1 -0
- package/dist/parser/markdoc/schema.js +86 -0
- package/dist/parser/markdoc/schema.js.map +1 -0
- package/dist/parser/markdoc/span.d.ts +64 -0
- package/dist/parser/markdoc/span.d.ts.map +1 -0
- package/dist/parser/markdoc/span.js +729 -0
- package/dist/parser/markdoc/span.js.map +1 -0
- package/dist/parser/markdoc/structure.d.ts +28 -0
- package/dist/parser/markdoc/structure.d.ts.map +1 -0
- package/dist/parser/markdoc/structure.js +153 -0
- package/dist/parser/markdoc/structure.js.map +1 -0
- package/dist/parser/markdoc/syntax.d.ts +44 -0
- package/dist/parser/markdoc/syntax.d.ts.map +1 -0
- package/dist/parser/markdoc/syntax.js +317 -0
- package/dist/parser/markdoc/syntax.js.map +1 -0
- package/dist/parser/types.d.ts +18 -0
- package/dist/parser/types.d.ts.map +1 -0
- package/dist/parser/types.js.map +1 -0
- package/dist/reporter/fixes.d.ts.map +1 -1
- package/dist/reporter/fixes.js +22 -1
- package/dist/reporter/fixes.js.map +1 -1
- package/dist/reporter/statistics.d.ts +1 -8
- package/dist/reporter/statistics.d.ts.map +1 -1
- package/dist/reporter/statistics.js.map +1 -1
- package/dist/rules/registry.d.ts +15 -0
- package/dist/rules/registry.d.ts.map +1 -0
- package/dist/rules/registry.js +81 -0
- package/dist/rules/registry.js.map +1 -0
- package/dist/rules/scope/capitalization.d.ts +3 -0
- package/dist/rules/scope/capitalization.d.ts.map +1 -0
- package/dist/rules/scope/capitalization.js +163 -0
- package/dist/rules/scope/capitalization.js.map +1 -0
- package/dist/rules/scope/conditional.d.ts +3 -0
- package/dist/rules/scope/conditional.d.ts.map +1 -0
- package/dist/rules/scope/conditional.js +112 -0
- package/dist/rules/scope/conditional.js.map +1 -0
- package/dist/rules/scope/consistency.d.ts +3 -0
- package/dist/rules/scope/consistency.d.ts.map +1 -0
- package/dist/rules/scope/consistency.js +178 -0
- package/dist/rules/scope/consistency.js.map +1 -0
- package/dist/rules/scope/length.d.ts +3 -0
- package/dist/rules/scope/length.d.ts.map +1 -0
- package/dist/rules/scope/length.js +69 -0
- package/dist/rules/scope/length.js.map +1 -0
- package/dist/rules/scope/max-image-size.d.ts +3 -0
- package/dist/rules/scope/max-image-size.d.ts.map +1 -0
- package/dist/rules/scope/max-image-size.js +65 -0
- package/dist/rules/scope/max-image-size.js.map +1 -0
- package/dist/rules/scope/metric.d.ts +17 -0
- package/dist/rules/scope/metric.d.ts.map +1 -0
- package/dist/rules/scope/metric.js +216 -0
- package/dist/rules/scope/metric.js.map +1 -0
- package/dist/rules/scope/occurrence.d.ts +3 -0
- package/dist/rules/scope/occurrence.d.ts.map +1 -0
- package/dist/rules/scope/occurrence.js +48 -0
- package/dist/rules/scope/occurrence.js.map +1 -0
- package/dist/rules/scope/pattern.d.ts +3 -0
- package/dist/rules/scope/pattern.d.ts.map +1 -0
- package/dist/rules/scope/pattern.js +75 -0
- package/dist/rules/scope/pattern.js.map +1 -0
- package/dist/rules/scope/repetition.d.ts +3 -0
- package/dist/rules/scope/repetition.d.ts.map +1 -0
- package/dist/rules/scope/repetition.js +139 -0
- package/dist/rules/scope/repetition.js.map +1 -0
- package/dist/rules/scope/semantic-line-breaks.d.ts +3 -0
- package/dist/rules/scope/semantic-line-breaks.d.ts.map +1 -0
- package/dist/rules/scope/semantic-line-breaks.js +213 -0
- package/dist/rules/scope/semantic-line-breaks.js.map +1 -0
- package/dist/rules/scope/spelling.d.ts +27 -0
- package/dist/rules/scope/spelling.d.ts.map +1 -0
- package/dist/rules/scope/spelling.js +227 -0
- package/dist/rules/scope/spelling.js.map +1 -0
- package/dist/rules/scope/swap.d.ts +3 -0
- package/dist/rules/scope/swap.d.ts.map +1 -0
- package/dist/rules/scope/swap.js +149 -0
- package/dist/rules/scope/swap.js.map +1 -0
- package/dist/rules/scope/title-case.d.ts +46 -0
- package/dist/rules/scope/title-case.d.ts.map +1 -0
- package/dist/rules/scope/title-case.js +301 -0
- package/dist/rules/scope/title-case.js.map +1 -0
- package/dist/rules/token/blanks-around-fences.d.ts +3 -0
- package/dist/rules/token/blanks-around-fences.d.ts.map +1 -0
- package/dist/rules/token/blanks-around-fences.js +44 -0
- package/dist/rules/token/blanks-around-fences.js.map +1 -0
- package/dist/rules/token/blanks-around-headings.d.ts +3 -0
- package/dist/rules/token/blanks-around-headings.d.ts.map +1 -0
- package/dist/rules/token/blanks-around-headings.js +108 -0
- package/dist/rules/token/blanks-around-headings.js.map +1 -0
- package/dist/rules/token/blanks-around-lists.d.ts +3 -0
- package/dist/rules/token/blanks-around-lists.d.ts.map +1 -0
- package/dist/rules/token/blanks-around-lists.js +56 -0
- package/dist/rules/token/blanks-around-lists.js.map +1 -0
- package/dist/rules/token/blanks-around-tables.d.ts +3 -0
- package/dist/rules/token/blanks-around-tables.d.ts.map +1 -0
- package/dist/rules/token/blanks-around-tables.js +42 -0
- package/dist/rules/token/blanks-around-tables.js.map +1 -0
- package/dist/rules/token/code-block-style.d.ts +3 -0
- package/dist/rules/token/code-block-style.d.ts.map +1 -0
- package/dist/rules/token/code-block-style.js +30 -0
- package/dist/rules/token/code-block-style.js.map +1 -0
- package/dist/rules/token/code-fence-style.d.ts +3 -0
- package/dist/rules/token/code-fence-style.d.ts.map +1 -0
- package/dist/rules/token/code-fence-style.js +35 -0
- package/dist/rules/token/code-fence-style.js.map +1 -0
- package/dist/rules/token/commands-show-output.d.ts +3 -0
- package/dist/rules/token/commands-show-output.d.ts.map +1 -0
- package/dist/rules/token/commands-show-output.js +38 -0
- package/dist/rules/token/commands-show-output.js.map +1 -0
- package/dist/rules/token/descriptive-link-text.d.ts +3 -0
- package/dist/rules/token/descriptive-link-text.d.ts.map +1 -0
- package/dist/rules/token/descriptive-link-text.js +53 -0
- package/dist/rules/token/descriptive-link-text.js.map +1 -0
- package/dist/rules/token/emphasis-style.d.ts +3 -0
- package/dist/rules/token/emphasis-style.d.ts.map +1 -0
- package/dist/rules/token/emphasis-style.js +51 -0
- package/dist/rules/token/emphasis-style.js.map +1 -0
- package/dist/rules/token/fenced-code-language.d.ts +3 -0
- package/dist/rules/token/fenced-code-language.d.ts.map +1 -0
- package/dist/rules/token/fenced-code-language.js +35 -0
- package/dist/rules/token/fenced-code-language.js.map +1 -0
- package/dist/rules/token/first-line-h1.d.ts +3 -0
- package/dist/rules/token/first-line-h1.d.ts.map +1 -0
- package/dist/rules/token/first-line-h1.js +107 -0
- package/dist/rules/token/first-line-h1.js.map +1 -0
- package/dist/rules/token/heading-increment.d.ts +3 -0
- package/dist/rules/token/heading-increment.d.ts.map +1 -0
- package/dist/rules/token/heading-increment.js +27 -0
- package/dist/rules/token/heading-increment.js.map +1 -0
- package/dist/rules/token/heading-start-left.d.ts +3 -0
- package/dist/rules/token/heading-start-left.d.ts.map +1 -0
- package/dist/rules/token/heading-start-left.js +31 -0
- package/dist/rules/token/heading-start-left.js.map +1 -0
- package/dist/rules/token/heading-style.d.ts +3 -0
- package/dist/rules/token/heading-style.d.ts.map +1 -0
- package/dist/rules/token/heading-style.js +41 -0
- package/dist/rules/token/heading-style.js.map +1 -0
- package/dist/rules/token/helpers.d.ts +313 -0
- package/dist/rules/token/helpers.d.ts.map +1 -0
- package/dist/rules/token/helpers.js +746 -0
- package/dist/rules/token/helpers.js.map +1 -0
- package/dist/rules/token/hr-style.d.ts +3 -0
- package/dist/rules/token/hr-style.d.ts.map +1 -0
- package/dist/rules/token/hr-style.js +28 -0
- package/dist/rules/token/hr-style.js.map +1 -0
- package/dist/rules/token/index.d.ts +75 -0
- package/dist/rules/token/index.d.ts.map +1 -0
- package/dist/rules/token/index.js +226 -0
- package/dist/rules/token/index.js.map +1 -0
- package/dist/rules/token/line-length.d.ts +3 -0
- package/dist/rules/token/line-length.d.ts.map +1 -0
- package/dist/rules/token/line-length.js +120 -0
- package/dist/rules/token/line-length.js.map +1 -0
- package/dist/rules/token/link-fragments.d.ts +3 -0
- package/dist/rules/token/link-fragments.d.ts.map +1 -0
- package/dist/rules/token/link-fragments.js +145 -0
- package/dist/rules/token/link-fragments.js.map +1 -0
- package/dist/rules/token/link-image-reference-definitions.d.ts +3 -0
- package/dist/rules/token/link-image-reference-definitions.d.ts.map +1 -0
- package/dist/rules/token/link-image-reference-definitions.js +50 -0
- package/dist/rules/token/link-image-reference-definitions.js.map +1 -0
- package/dist/rules/token/link-image-style.d.ts +3 -0
- package/dist/rules/token/link-image-style.d.ts.map +1 -0
- package/dist/rules/token/link-image-style.js +131 -0
- package/dist/rules/token/link-image-style.js.map +1 -0
- package/dist/rules/token/list-indent.d.ts +3 -0
- package/dist/rules/token/list-indent.d.ts.map +1 -0
- package/dist/rules/token/list-indent.js +60 -0
- package/dist/rules/token/list-indent.js.map +1 -0
- package/dist/rules/token/list-length.d.ts +3 -0
- package/dist/rules/token/list-length.d.ts.map +1 -0
- package/dist/rules/token/list-length.js +55 -0
- package/dist/rules/token/list-length.js.map +1 -0
- package/dist/rules/token/list-marker-space.d.ts +3 -0
- package/dist/rules/token/list-marker-space.d.ts.map +1 -0
- package/dist/rules/token/list-marker-space.js +52 -0
- package/dist/rules/token/list-marker-space.js.map +1 -0
- package/dist/rules/token/markdoc-attributes.d.ts +3 -0
- package/dist/rules/token/markdoc-attributes.d.ts.map +1 -0
- package/dist/rules/token/markdoc-attributes.js +269 -0
- package/dist/rules/token/markdoc-attributes.js.map +1 -0
- package/dist/rules/token/markdoc-pairing.d.ts +3 -0
- package/dist/rules/token/markdoc-pairing.d.ts.map +1 -0
- package/dist/rules/token/markdoc-pairing.js +73 -0
- package/dist/rules/token/markdoc-pairing.js.map +1 -0
- package/dist/rules/token/markdoc-syntax.d.ts +3 -0
- package/dist/rules/token/markdoc-syntax.d.ts.map +1 -0
- package/dist/rules/token/markdoc-syntax.js +119 -0
- package/dist/rules/token/markdoc-syntax.js.map +1 -0
- package/dist/rules/token/markdoc-unknown-tag.d.ts +3 -0
- package/dist/rules/token/markdoc-unknown-tag.d.ts.map +1 -0
- package/dist/rules/token/markdoc-unknown-tag.js +64 -0
- package/dist/rules/token/markdoc-unknown-tag.js.map +1 -0
- package/dist/rules/token/messages.d.ts +4 -0
- package/dist/rules/token/messages.d.ts.map +1 -0
- package/dist/rules/token/messages.js +20 -0
- package/dist/rules/token/messages.js.map +1 -0
- package/dist/rules/token/no-alt-text.d.ts +3 -0
- package/dist/rules/token/no-alt-text.d.ts.map +1 -0
- package/dist/rules/token/no-alt-text.js +47 -0
- package/dist/rules/token/no-alt-text.js.map +1 -0
- package/dist/rules/token/no-bare-urls.d.ts +3 -0
- package/dist/rules/token/no-bare-urls.d.ts.map +1 -0
- package/dist/rules/token/no-bare-urls.js +88 -0
- package/dist/rules/token/no-bare-urls.js.map +1 -0
- package/dist/rules/token/no-blanks-blockquote.d.ts +3 -0
- package/dist/rules/token/no-blanks-blockquote.d.ts.map +1 -0
- package/dist/rules/token/no-blanks-blockquote.js +39 -0
- package/dist/rules/token/no-blanks-blockquote.js.map +1 -0
- package/dist/rules/token/no-duplicate-heading.d.ts +3 -0
- package/dist/rules/token/no-duplicate-heading.d.ts.map +1 -0
- package/dist/rules/token/no-duplicate-heading.js +101 -0
- package/dist/rules/token/no-duplicate-heading.js.map +1 -0
- package/dist/rules/token/no-duplicate-link-destinations.d.ts +3 -0
- package/dist/rules/token/no-duplicate-link-destinations.d.ts.map +1 -0
- package/dist/rules/token/no-duplicate-link-destinations.js +65 -0
- package/dist/rules/token/no-duplicate-link-destinations.js.map +1 -0
- package/dist/rules/token/no-emphasis-as-heading.d.ts +3 -0
- package/dist/rules/token/no-emphasis-as-heading.d.ts.map +1 -0
- package/dist/rules/token/no-emphasis-as-heading.js +44 -0
- package/dist/rules/token/no-emphasis-as-heading.js.map +1 -0
- package/dist/rules/token/no-empty-headings.d.ts +3 -0
- package/dist/rules/token/no-empty-headings.d.ts.map +1 -0
- package/dist/rules/token/no-empty-headings.js +28 -0
- package/dist/rules/token/no-empty-headings.js.map +1 -0
- package/dist/rules/token/no-empty-links.d.ts +3 -0
- package/dist/rules/token/no-empty-links.d.ts.map +1 -0
- package/dist/rules/token/no-empty-links.js +67 -0
- package/dist/rules/token/no-empty-links.js.map +1 -0
- package/dist/rules/token/no-hard-tabs.d.ts +3 -0
- package/dist/rules/token/no-hard-tabs.d.ts.map +1 -0
- package/dist/rules/token/no-hard-tabs.js +76 -0
- package/dist/rules/token/no-hard-tabs.js.map +1 -0
- package/dist/rules/token/no-inline-html.d.ts +3 -0
- package/dist/rules/token/no-inline-html.d.ts.map +1 -0
- package/dist/rules/token/no-inline-html.js +45 -0
- package/dist/rules/token/no-inline-html.js.map +1 -0
- package/dist/rules/token/no-missing-space-atx.d.ts +3 -0
- package/dist/rules/token/no-missing-space-atx.d.ts.map +1 -0
- package/dist/rules/token/no-missing-space-atx.js +36 -0
- package/dist/rules/token/no-missing-space-atx.js.map +1 -0
- package/dist/rules/token/no-missing-space-closed-atx.d.ts +3 -0
- package/dist/rules/token/no-missing-space-closed-atx.d.ts.map +1 -0
- package/dist/rules/token/no-missing-space-closed-atx.js +45 -0
- package/dist/rules/token/no-missing-space-closed-atx.js.map +1 -0
- package/dist/rules/token/no-multiple-blanks.d.ts +3 -0
- package/dist/rules/token/no-multiple-blanks.d.ts.map +1 -0
- package/dist/rules/token/no-multiple-blanks.js +35 -0
- package/dist/rules/token/no-multiple-blanks.js.map +1 -0
- package/dist/rules/token/no-multiple-space-atx.d.ts +13 -0
- package/dist/rules/token/no-multiple-space-atx.d.ts.map +1 -0
- package/dist/rules/token/no-multiple-space-atx.js +50 -0
- package/dist/rules/token/no-multiple-space-atx.js.map +1 -0
- package/dist/rules/token/no-multiple-space-blockquote.d.ts +3 -0
- package/dist/rules/token/no-multiple-space-blockquote.d.ts.map +1 -0
- package/dist/rules/token/no-multiple-space-blockquote.js +43 -0
- package/dist/rules/token/no-multiple-space-blockquote.js.map +1 -0
- package/dist/rules/token/no-multiple-space-closed-atx.d.ts +3 -0
- package/dist/rules/token/no-multiple-space-closed-atx.d.ts.map +1 -0
- package/dist/rules/token/no-multiple-space-closed-atx.js +19 -0
- package/dist/rules/token/no-multiple-space-closed-atx.js.map +1 -0
- package/dist/rules/token/no-reversed-links.d.ts +3 -0
- package/dist/rules/token/no-reversed-links.d.ts.map +1 -0
- package/dist/rules/token/no-reversed-links.js +52 -0
- package/dist/rules/token/no-reversed-links.js.map +1 -0
- package/dist/rules/token/no-space-in-code.d.ts +3 -0
- package/dist/rules/token/no-space-in-code.d.ts.map +1 -0
- package/dist/rules/token/no-space-in-code.js +75 -0
- package/dist/rules/token/no-space-in-code.js.map +1 -0
- package/dist/rules/token/no-space-in-emphasis.d.ts +3 -0
- package/dist/rules/token/no-space-in-emphasis.d.ts.map +1 -0
- package/dist/rules/token/no-space-in-emphasis.js +79 -0
- package/dist/rules/token/no-space-in-emphasis.js.map +1 -0
- package/dist/rules/token/no-space-in-links.d.ts +3 -0
- package/dist/rules/token/no-space-in-links.d.ts.map +1 -0
- package/dist/rules/token/no-space-in-links.js +48 -0
- package/dist/rules/token/no-space-in-links.js.map +1 -0
- package/dist/rules/token/no-trailing-punctuation.d.ts +3 -0
- package/dist/rules/token/no-trailing-punctuation.d.ts.map +1 -0
- package/dist/rules/token/no-trailing-punctuation.js +38 -0
- package/dist/rules/token/no-trailing-punctuation.js.map +1 -0
- package/dist/rules/token/no-trailing-spaces.d.ts +3 -0
- package/dist/rules/token/no-trailing-spaces.d.ts.map +1 -0
- package/dist/rules/token/no-trailing-spaces.js +89 -0
- package/dist/rules/token/no-trailing-spaces.js.map +1 -0
- package/dist/rules/token/ol-prefix.d.ts +3 -0
- package/dist/rules/token/ol-prefix.d.ts.map +1 -0
- package/dist/rules/token/ol-prefix.js +70 -0
- package/dist/rules/token/ol-prefix.js.map +1 -0
- package/dist/rules/token/proper-names.d.ts +3 -0
- package/dist/rules/token/proper-names.d.ts.map +1 -0
- package/dist/rules/token/proper-names.js +93 -0
- package/dist/rules/token/proper-names.js.map +1 -0
- package/dist/rules/token/reference-links-images.d.ts +3 -0
- package/dist/rules/token/reference-links-images.d.ts.map +1 -0
- package/dist/rules/token/reference-links-images.js +36 -0
- package/dist/rules/token/reference-links-images.js.map +1 -0
- package/dist/rules/token/required-headings.d.ts +3 -0
- package/dist/rules/token/required-headings.d.ts.map +1 -0
- package/dist/rules/token/required-headings.js +83 -0
- package/dist/rules/token/required-headings.js.map +1 -0
- package/dist/rules/token/single-h1.d.ts +3 -0
- package/dist/rules/token/single-h1.d.ts.map +1 -0
- package/dist/rules/token/single-h1.js +56 -0
- package/dist/rules/token/single-h1.js.map +1 -0
- package/dist/rules/token/single-trailing-newline.d.ts +3 -0
- package/dist/rules/token/single-trailing-newline.d.ts.map +1 -0
- package/dist/rules/token/single-trailing-newline.js +25 -0
- package/dist/rules/token/single-trailing-newline.js.map +1 -0
- package/dist/rules/token/strong-style.d.ts +3 -0
- package/dist/rules/token/strong-style.d.ts.map +1 -0
- package/dist/rules/token/strong-style.js +51 -0
- package/dist/rules/token/strong-style.js.map +1 -0
- package/dist/rules/token/table-column-count.d.ts +3 -0
- package/dist/rules/token/table-column-count.d.ts.map +1 -0
- package/dist/rules/token/table-column-count.js +44 -0
- package/dist/rules/token/table-column-count.js.map +1 -0
- package/dist/rules/token/table-column-style.d.ts +3 -0
- package/dist/rules/token/table-column-style.d.ts.map +1 -0
- package/dist/rules/token/table-column-style.js +179 -0
- package/dist/rules/token/table-column-style.js.map +1 -0
- package/dist/rules/token/table-pipe-style.d.ts +3 -0
- package/dist/rules/token/table-pipe-style.d.ts.map +1 -0
- package/dist/rules/token/table-pipe-style.js +54 -0
- package/dist/rules/token/table-pipe-style.js.map +1 -0
- package/dist/rules/token/ul-indent.d.ts +3 -0
- package/dist/rules/token/ul-indent.d.ts.map +1 -0
- package/dist/rules/token/ul-indent.js +72 -0
- package/dist/rules/token/ul-indent.js.map +1 -0
- package/dist/rules/token/ul-style.d.ts +3 -0
- package/dist/rules/token/ul-style.d.ts.map +1 -0
- package/dist/rules/token/ul-style.js +80 -0
- package/dist/rules/token/ul-style.js.map +1 -0
- package/dist/rules/types.d.ts +81 -0
- package/dist/rules/types.d.ts.map +1 -0
- package/dist/rules/types.js +2 -0
- package/dist/rules/types.js.map +1 -0
- package/dist/rules/utils.d.ts +29 -0
- package/dist/rules/utils.d.ts.map +1 -0
- package/dist/{assertions → rules}/utils.js +27 -0
- package/dist/rules/utils.js.map +1 -0
- package/dist/scopes/extractor.d.ts +7 -0
- package/dist/scopes/extractor.d.ts.map +1 -0
- package/dist/scopes/extractor.js +475 -0
- package/dist/scopes/extractor.js.map +1 -0
- package/dist/scopes/selector.d.ts +51 -0
- package/dist/scopes/selector.d.ts.map +1 -0
- package/dist/scopes/selector.js +121 -0
- package/dist/scopes/selector.js.map +1 -0
- package/dist/scopes/sentences.d.ts +15 -0
- package/dist/scopes/sentences.d.ts.map +1 -0
- package/dist/scopes/sentences.js +124 -0
- package/dist/scopes/sentences.js.map +1 -0
- package/dist/scopes/types.d.ts +44 -0
- package/dist/scopes/types.d.ts.map +1 -0
- package/dist/scopes/types.js +2 -0
- package/dist/scopes/types.js.map +1 -0
- package/dist/scopes/vocabulary.d.ts +16 -0
- package/dist/scopes/vocabulary.d.ts.map +1 -0
- package/dist/scopes/vocabulary.js +70 -0
- package/dist/scopes/vocabulary.js.map +1 -0
- package/dist/types/assertions.d.ts +95 -32
- package/dist/types/assertions.d.ts.map +1 -1
- package/dist/types/problems.d.ts +4 -5
- package/dist/types/problems.d.ts.map +1 -1
- package/dist/types/rules.d.ts +4 -6
- package/dist/types/rules.d.ts.map +1 -1
- package/examples/appendices/google.appendix.yaml +91 -0
- package/examples/appendices/inclusive-language.appendix.yaml +61 -0
- package/examples/appendices/microsoft.appendix.yaml +99 -0
- package/examples/appendices/plain-language.appendix.yaml +88 -0
- package/examples/google.yaml +1525 -0
- package/examples/inclusive-language.yaml +304 -0
- package/examples/microsoft.yaml +1542 -0
- package/examples/plain-language.yaml +325 -0
- package/package.json +49 -16
- package/presets/google/PROVENANCE.md +1022 -0
- package/presets/google/sources.json +192 -0
- package/presets/inclusive-language/PROVENANCE.md +174 -0
- package/presets/inclusive-language/sources.json +107 -0
- package/presets/microsoft/PROVENANCE.md +1555 -0
- package/presets/microsoft/sources.json +494 -0
- package/presets/plain-language/PROVENANCE.md +364 -0
- package/presets/plain-language/sources.json +108 -0
- package/dist/assertions/bullet-style.d.ts +0 -3
- package/dist/assertions/bullet-style.d.ts.map +0 -1
- package/dist/assertions/bullet-style.js +0 -60
- package/dist/assertions/bullet-style.js.map +0 -1
- package/dist/assertions/index.d.ts +0 -21
- package/dist/assertions/index.d.ts.map +0 -1
- package/dist/assertions/index.js +0 -30
- package/dist/assertions/index.js.map +0 -1
- package/dist/assertions/max-image-size.d.ts +0 -3
- package/dist/assertions/max-image-size.d.ts.map +0 -1
- package/dist/assertions/max-image-size.js +0 -73
- package/dist/assertions/max-image-size.js.map +0 -1
- package/dist/assertions/max-line-length.d.ts +0 -3
- package/dist/assertions/max-line-length.d.ts.map +0 -1
- package/dist/assertions/max-line-length.js +0 -68
- package/dist/assertions/max-line-length.js.map +0 -1
- package/dist/assertions/no-broken-fragment-links.d.ts +0 -3
- package/dist/assertions/no-broken-fragment-links.d.ts.map +0 -1
- package/dist/assertions/no-broken-fragment-links.js +0 -79
- package/dist/assertions/no-broken-fragment-links.js.map +0 -1
- package/dist/assertions/no-duplicate-headings.d.ts +0 -3
- package/dist/assertions/no-duplicate-headings.d.ts.map +0 -1
- package/dist/assertions/no-duplicate-headings.js +0 -66
- package/dist/assertions/no-duplicate-headings.js.map +0 -1
- package/dist/assertions/no-hard-tabs.d.ts +0 -3
- package/dist/assertions/no-hard-tabs.d.ts.map +0 -1
- package/dist/assertions/no-hard-tabs.js +0 -63
- package/dist/assertions/no-hard-tabs.js.map +0 -1
- package/dist/assertions/no-trailing-spaces.d.ts +0 -3
- package/dist/assertions/no-trailing-spaces.d.ts.map +0 -1
- package/dist/assertions/no-trailing-spaces.js +0 -72
- package/dist/assertions/no-trailing-spaces.js.map +0 -1
- package/dist/assertions/pattern.d.ts +0 -3
- package/dist/assertions/pattern.d.ts.map +0 -1
- package/dist/assertions/pattern.js +0 -39
- package/dist/assertions/pattern.js.map +0 -1
- package/dist/assertions/semantic-line-breaks.d.ts +0 -3
- package/dist/assertions/semantic-line-breaks.d.ts.map +0 -1
- package/dist/assertions/semantic-line-breaks.js +0 -152
- package/dist/assertions/semantic-line-breaks.js.map +0 -1
- package/dist/assertions/swap.d.ts +0 -3
- package/dist/assertions/swap.d.ts.map +0 -1
- package/dist/assertions/swap.js +0 -39
- package/dist/assertions/swap.js.map +0 -1
- package/dist/assertions/utils.d.ts +0 -8
- package/dist/assertions/utils.d.ts.map +0 -1
- package/dist/assertions/utils.js.map +0 -1
- package/dist/core/scope-parser.d.ts +0 -26
- package/dist/core/scope-parser.d.ts.map +0 -1
- package/dist/core/scope-parser.js +0 -110
- package/dist/core/scope-parser.js.map +0 -1
- package/dist/files.d.ts +0 -2
- package/dist/files.d.ts.map +0 -1
- package/dist/files.js +0 -39
- package/dist/files.js.map +0 -1
- package/dist/load-config.d.ts +0 -25
- package/dist/load-config.d.ts.map +0 -1
- package/dist/load-config.js +0 -104
- package/dist/load-config.js.map +0 -1
- package/dist/load.d.ts +0 -25
- package/dist/load.d.ts.map +0 -1
- package/dist/load.js +0 -112
- package/dist/load.js.map +0 -1
- package/dist/scope.d.ts +0 -26
- package/dist/scope.d.ts.map +0 -1
- package/dist/scope.js +0 -110
- package/dist/scope.js.map +0 -1
- package/dist/types.d.ts +0 -109
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js.map +0 -1
- package/dist/validate.d.ts +0 -31
- package/dist/validate.d.ts.map +0 -1
- package/dist/validate.js +0 -154
- package/dist/validate.js.map +0 -1
- /package/dist/{types.js → parser/types.js} +0 -0
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
# Provenance: `recheck/plain-language`
|
|
2
|
+
|
|
3
|
+
Source: US federal plain-language guidance, as actually LIVE today —
|
|
4
|
+
`https://digital.gov/guides/plain-language` and its subpages, plus the OMB
|
|
5
|
+
Memo M-11-15 PDF (`whitehouse.gov`). Public domain: no CC-BY attribution
|
|
6
|
+
constraint, but pages are cited here (and in each rule's `link:`) for
|
|
7
|
+
auditability. Sync/verification date: **2026-07-30**.
|
|
8
|
+
|
|
9
|
+
Modification note: rules are adapted to Recheck's assertion vocabulary
|
|
10
|
+
(`length`, `swap`, `pattern`); wording is paraphrased into each rule's
|
|
11
|
+
`message`, not quoted verbatim. Every rule carries a `link:` to its source
|
|
12
|
+
page.
|
|
13
|
+
|
|
14
|
+
## `plainlanguage.gov` is dead
|
|
15
|
+
|
|
16
|
+
Every path under `plainlanguage.gov` — `/guidelines/words/simple-words-
|
|
17
|
+
phrases/`, `/guidelines/sentences/`, `/guidelines/paragraphs/`, even the
|
|
18
|
+
classic `/media/FederalPlainLanguageGuidelines.pdf` — now issues an HTTP 301
|
|
19
|
+
to a single, much thinner overview page: `https://digital.gov/guides/plain-
|
|
20
|
+
language`. That page itself states its content is "adapted from
|
|
21
|
+
PlainLanguage.gov" and that the original site survives only "archived in the
|
|
22
|
+
PlainLanguage.gov GitHub repository" — a non-`.gov` domain, and therefore
|
|
23
|
+
**not used as a source** here, per the verification's own `.gov`-only rule.
|
|
24
|
+
Every citation below is what is actually live on `digital.gov`,
|
|
25
|
+
`plainlanguage.gov` (the redirect target), or `whitehouse.gov` (the OMB PDF)
|
|
26
|
+
as of 2026-07-30.
|
|
27
|
+
|
|
28
|
+
## Method
|
|
29
|
+
|
|
30
|
+
`curl -sL` (redirects followed) fetched every page; a small local Python 3
|
|
31
|
+
script (`extract.py`, regex-based tag stripping + `html.unescape`, no
|
|
32
|
+
summarizing tool) parsed the result, preserving block structure as line
|
|
33
|
+
breaks; tables were re-parsed directly from raw HTML `<tr>/<td>` structure.
|
|
34
|
+
The one PDF (OMB Memo M-11-15) was read directly via a native PDF reader, not
|
|
35
|
+
summarized. **No `WebFetch` or other summarizing tool was used at any
|
|
36
|
+
point** — the same discipline this phase's provenance work requires
|
|
37
|
+
everywhere else, after the fabrication incident that motivated it.
|
|
38
|
+
|
|
39
|
+
## `sources.json` normalization
|
|
40
|
+
|
|
41
|
+
`sources.json` records one hash per source page as drift detection for a
|
|
42
|
+
future re-check: re-fetch a page later, and a changed digest means the
|
|
43
|
+
guide's content changed. The version of this file that shipped before this
|
|
44
|
+
correction hashed the raw HTML response directly and claimed digital.gov's
|
|
45
|
+
plain-language pages are stable enough for that to work as reproducible
|
|
46
|
+
drift detection ("two consecutive fetches of the same URL are
|
|
47
|
+
byte-identical"). **That claim does not hold.** On independent re-fetch of
|
|
48
|
+
all 9 pages listed in `sources.json`, every recorded `bytes` (raw page
|
|
49
|
+
length) matched the live page exactly, but **none** of the 9 recorded raw-
|
|
50
|
+
HTML `sha256` values did — a 100% mismatch rate against a claim of
|
|
51
|
+
byte-for-byte reproducibility, which is the same shape of unearned
|
|
52
|
+
auditability claim already caught and fixed in `recheck/google`'s own
|
|
53
|
+
`sources.json` (its raw-HTML hashes failed to reproduce for a different
|
|
54
|
+
reason — see that file's own normalization section).
|
|
55
|
+
|
|
56
|
+
**Cause, found by diffing two raw fetches of the same URL:** unlike
|
|
57
|
+
Google's per-request analytics/nonce/feature-flag noise, digital.gov's
|
|
58
|
+
instability is not per-request — repeated fetches within one short session
|
|
59
|
+
are identical. It is Drupal build/deploy metadata embedded in every
|
|
60
|
+
response, outside the guide content: an anonymous-user `permissionsHash`
|
|
61
|
+
(a 64-hex-char token inside the inline `<script type="application/json"
|
|
62
|
+
data-drupal-selector="drupal-settings-json">` block), Drupal's
|
|
63
|
+
asset-aggregation CSS/JS filenames (`css_<hash>.css`, `js_<hash>.js` —
|
|
64
|
+
content-hashed per build), and an `ajaxPageState.libraries` deflate+base64
|
|
65
|
+
blob describing which asset libraries loaded. All of these regenerate
|
|
66
|
+
across Drupal deploys/cache-clears rather than every single request, and
|
|
67
|
+
each is a fixed-format token (a hash of a given length, a compressed list
|
|
68
|
+
of a given rough size) — so the page's overall byte count stays constant
|
|
69
|
+
across a deploy even when the exact bytes don't, which is exactly why the
|
|
70
|
+
`bytes` field alone looked reproducible while `sha256` wasn't.
|
|
71
|
+
|
|
72
|
+
**Fix**: hash the extracted `<main>...</main>` region instead of the full
|
|
73
|
+
page — the same fix `recheck/google` and `recheck/microsoft` already
|
|
74
|
+
applied for their own per-request/per-build noise. Every one of the
|
|
75
|
+
Drupal tokens above was confirmed to live before the opening `<main>` tag
|
|
76
|
+
(checked by scanning the extracted region of all 9 pages for any 16+
|
|
77
|
+
character hex/base64-like token — zero hits). Reproduction recipe: fetch
|
|
78
|
+
the page's HTML with `curl -sL` (redirects followed), take the first
|
|
79
|
+
`<main ...>...</main>` match (a non-greedy, dot-matches-newline regex
|
|
80
|
+
scan against `[\s\S]`; every page has exactly one), and sha256 the UTF-8
|
|
81
|
+
bytes of that substring.
|
|
82
|
+
|
|
83
|
+
**Reproducibility, verified rather than assumed**: all 9 pages in
|
|
84
|
+
`sources.json` were fetched TWICE each, ~80 seconds apart — past this
|
|
85
|
+
site's own `cache-control: max-age=60` CDN TTL, so the second fetch is not
|
|
86
|
+
guaranteed to be served from cache — and the extracted `<main>` region was
|
|
87
|
+
byte-identical (and therefore sha256-identical) both times, for every
|
|
88
|
+
page. `bytes` in `sources.json` now records the extracted region's length,
|
|
89
|
+
not the raw page's, matching the `recheck/google`/`recheck/microsoft`
|
|
90
|
+
convention — a future re-check with a matching `bytes` but a different
|
|
91
|
+
`sha256` (or vice versa) is a signal to check whether the extraction shape
|
|
92
|
+
itself changed before treating the result as real guide drift.
|
|
93
|
+
|
|
94
|
+
## THE NUMBER — why no `metric`/readability rule ships
|
|
95
|
+
|
|
96
|
+
**No live federal plain-language page states a grade level, a Flesch/
|
|
97
|
+
readability score, or any other scorable numeric target for prose.** Grepped
|
|
98
|
+
for `flesch`, `reading ease`, `readab`, `grade level`, `grade-level`, `grade
|
|
99
|
+
point`, `reading level`, `lexile` across all 21 fetched `digital.gov` pages
|
|
100
|
+
plus the OMB M-11-15 PDF text — zero numeric hits.
|
|
101
|
+
|
|
102
|
+
The one grade-level mention that exists is the OPPOSITE of a licensed
|
|
103
|
+
target. From `https://digital.gov/guides/plain-language/principles`
|
|
104
|
+
("Write for your audience"):
|
|
105
|
+
|
|
106
|
+
> "Don't write for an 8th-grade class if your readers are PhD candidates,
|
|
107
|
+
> small business owners, or working parents."
|
|
108
|
+
>
|
|
109
|
+
> "Only write for 8th graders if your audience is, in fact, an 8th-grade
|
|
110
|
+
> class."
|
|
111
|
+
|
|
112
|
+
Reporting this as a licensed "8th grade" number would be the exact
|
|
113
|
+
fabrication shape flagged elsewhere in this phase (a scorable threshold
|
|
114
|
+
attributed to a guide that never published one). The guidance's own testing
|
|
115
|
+
method (`https://digital.gov/guides/plain-language/test`) is user testing
|
|
116
|
+
(paraphrase testing, usability testing, comparative studies), not an
|
|
117
|
+
automated readability formula — there is no algorithmic substitute offered
|
|
118
|
+
anywhere on the site. **Verdict: `metric` stays a documented opt-in.** No
|
|
119
|
+
change to `DOCUMENTED_OPT_IN_ASSERTIONS` (`presets/index.ts`) or the
|
|
120
|
+
README's "Opt-in prose assertions" section.
|
|
121
|
+
|
|
122
|
+
## Sentence length — no stated number either
|
|
123
|
+
|
|
124
|
+
Only qualitative advice exists on the live site: "Express only one idea in
|
|
125
|
+
each sentence" / "Write short sentences"
|
|
126
|
+
(`https://digital.gov/guides/plain-language/writing/clear-short`). No word
|
|
127
|
+
count is given for sentences on any live page — no `length` rule ships for
|
|
128
|
+
sentences.
|
|
129
|
+
|
|
130
|
+
## Paragraph length — the one family with real numbers
|
|
131
|
+
|
|
132
|
+
From the same `clear-short` page:
|
|
133
|
+
|
|
134
|
+
| Claim | Live quote | Shipped as |
|
|
135
|
+
|---|---|---|
|
|
136
|
+
| Soft target (attributed to "writing experts", not the guide's own voice) | "Writing experts recommend paragraphs of no more than 150 words in three to eight sentences." | `plain-language/paragraph-sentence-count` — `length`, `unit: sentences`, `max: 8`, `severity: warn`. No `min`: a floor over-fires on ordinary, correct single-sentence paragraphs (a short lead-in to a code block, an image caption) — the identical reasoning `microsoft/paragraph-length` already documents for the same family. |
|
|
137
|
+
| Hard ceiling, stated in the guide's own unconditional voice | "Paragraphs should never be longer than 250 words." | `plain-language/paragraph-max-words` — `length`, `unit: words`, `max: 250`, `severity: error` (unconditional, guide-stated — matches the severity policy behind `google/sentence-length`). |
|
|
138
|
+
|
|
139
|
+
## Word/phrase families shipped
|
|
140
|
+
|
|
141
|
+
### Filler / wordy phrases
|
|
142
|
+
Source: `https://digital.gov/guides/plain-language/writing/style`
|
|
143
|
+
("Check your prepositions" table).
|
|
144
|
+
|
|
145
|
+
| avoid | prefer (shipped) | note |
|
|
146
|
+
|---|---|---|
|
|
147
|
+
| a number of | several, a few, or many | |
|
|
148
|
+
| a sufficient number of | enough | |
|
|
149
|
+
| at this point in time | now | |
|
|
150
|
+
| is able to | can | |
|
|
151
|
+
| on a monthly basis | monthly | |
|
|
152
|
+
| on the ground that | because | |
|
|
153
|
+
| in order to | to | the exact pair the original plan named, confirmed verbatim |
|
|
154
|
+
| an amount of X | X | templated (variable X) — ships separately as `plain-language/an-amount-of`, detection-only (`pattern`, no fixed replacement) |
|
|
155
|
+
|
|
156
|
+
**Deliberately NOT shipped: `be responsible for` → `must`.** Live, verbatim
|
|
157
|
+
on the same table, but this pairing is an odd 1:1 substitution that
|
|
158
|
+
misreads ordinary, correct accountability language ("the team is
|
|
159
|
+
responsible for the migration") as wordiness. Unlike the other pairs above,
|
|
160
|
+
there is no textual signal distinguishing the guide's intended sense
|
|
161
|
+
(padding) from the extremely common correct sense (genuine responsibility) —
|
|
162
|
+
excluded rather than shipped noisy.
|
|
163
|
+
|
|
164
|
+
### Excess intensifiers
|
|
165
|
+
Source: `https://digital.gov/guides/plain-language/principles/short-simple`
|
|
166
|
+
— a literal cut-list, not paired substitutions: "absolutely, actually,
|
|
167
|
+
completely, really, quite, totally, very." Shipped as
|
|
168
|
+
`plain-language/excess-intensifiers`, detection-only (`pattern`) — cutting
|
|
169
|
+
an intensifier is an editorial call, not a mechanical substitution.
|
|
170
|
+
|
|
171
|
+
### Complex words / simple substitutes
|
|
172
|
+
Source: `https://digital.gov/guides/writing-understanding/familiar-terms`
|
|
173
|
+
("Complex words and recommended terms to use instead").
|
|
174
|
+
|
|
175
|
+
| avoid | prefer (shipped) |
|
|
176
|
+
|---|---|
|
|
177
|
+
| addressee | you |
|
|
178
|
+
| assist, assistance | help |
|
|
179
|
+
| commence | begin |
|
|
180
|
+
| in order that | for |
|
|
181
|
+
| in the amount of | for |
|
|
182
|
+
| in the event of | if |
|
|
183
|
+
| promulgate | issue |
|
|
184
|
+
| utilize, utilization | use |
|
|
185
|
+
|
|
186
|
+
**Deliberately NOT shipped: `implement` → carry out, start.** Live,
|
|
187
|
+
verbatim on this table — but in software/API documentation, "implement an
|
|
188
|
+
interface," "implement this endpoint," "implement the spec" is ordinary,
|
|
189
|
+
correct technical vocabulary, not wordiness. Flagging it would misfire
|
|
190
|
+
across nearly every technical document Recheck targets.
|
|
191
|
+
|
|
192
|
+
**Deliberately NOT shipped: `this activity, command` → us, we.** This row is
|
|
193
|
+
itself a garbled/mismatched pairing on the live page (confirmed live, not an
|
|
194
|
+
extraction error, but reads as a stray editorial artifact rather than a
|
|
195
|
+
clean semantic pair) — and separately, "command" has a strong, unrelated,
|
|
196
|
+
extremely common technical sense (CLI command, terminal command) that is
|
|
197
|
+
core developer-docs vocabulary. Excluded on both grounds.
|
|
198
|
+
|
|
199
|
+
**`shall` never appears anywhere in this preset**, in any family — even
|
|
200
|
+
though the SAME `familiar-terms` page, immediately after the table above,
|
|
201
|
+
explicitly names it: *"Avoid 'shall' — Use 'must' not 'shall' to impose
|
|
202
|
+
requirements. 'Shall' is ambiguous... 'Shall' is an aggressive and outdated
|
|
203
|
+
word often used in legal style writing."* (verified verbatim, live,
|
|
204
|
+
2026-07-30). **SHALL is a defined RFC 2119 normative keyword** (alongside
|
|
205
|
+
MUST/SHOULD/MAY/MUST NOT) used throughout specifications and API/interface
|
|
206
|
+
documentation — exactly Recheck's target content. A rule flagging it would
|
|
207
|
+
be actively wrong for that whole document class: RFC 2119 usage is a
|
|
208
|
+
different, correct register the federal guidance never anticipated, not an
|
|
209
|
+
exception it carves out. This is the single highest-risk exclusion in this
|
|
210
|
+
preset, named explicitly in the task's own domain-hazard callout alongside
|
|
211
|
+
`implement`
|
|
212
|
+
and `command`.
|
|
213
|
+
|
|
214
|
+
### Redundant pairs (doublets)
|
|
215
|
+
Source:
|
|
216
|
+
`https://digital.gov/guides/plain-language/principles/short-simple`
|
|
217
|
+
("Avoid doublets and triplets... Examples of doublets and recommended
|
|
218
|
+
alternatives").
|
|
219
|
+
|
|
220
|
+
| avoid | prefer (shipped) |
|
|
221
|
+
|---|---|
|
|
222
|
+
| Due and payable | Due |
|
|
223
|
+
| Cease and desist | Stop |
|
|
224
|
+
| Knowledge and information | Knowledge or information |
|
|
225
|
+
|
|
226
|
+
**Note: "each and every," "null and void," "true and correct," "first and
|
|
227
|
+
foremost," "any and all," and "full and complete" do NOT appear anywhere on
|
|
228
|
+
the live site** (grepped explicitly, zero hits) — only the three doublets
|
|
229
|
+
above are actually live. Do not cite the others as guide-derived if a future
|
|
230
|
+
edit touches this family.
|
|
231
|
+
|
|
232
|
+
**Cease and desist** is also a fixed legal term of art / the name of a
|
|
233
|
+
document type ("a cease-and-desist letter"). Shipped anyway (detection-only,
|
|
234
|
+
`warn` severity, matching the same risk tolerance `google/black-white-box-
|
|
235
|
+
testing` and similar entries already accept for phrase-level matches with a
|
|
236
|
+
documented ambiguity) — flagged here rather than silently excluded.
|
|
237
|
+
|
|
238
|
+
**"Due"** alone is never matched — the swap key is the full phrase "due and
|
|
239
|
+
payable", so ordinary uses of bare "due" (due date, due diligence, past due)
|
|
240
|
+
are unaffected.
|
|
241
|
+
|
|
242
|
+
### Double negatives
|
|
243
|
+
Source: `https://digital.gov/guides/plain-language/writing/style`
|
|
244
|
+
("Examples of recommended alternative terms for double negatives").
|
|
245
|
+
|
|
246
|
+
| avoid | prefer (shipped) | mechanism |
|
|
247
|
+
|---|---|---|
|
|
248
|
+
| has not yet attained | is under | `swap` (fixed phrase) |
|
|
249
|
+
| no fewer than | at least | `swap` (fixed phrase) |
|
|
250
|
+
| may not … until | may only … when | `pattern` (variable text between the two halves in the guide's own quote — can't be a literal-phrase swap) |
|
|
251
|
+
| is not … unless | only if | `pattern` (same reason) |
|
|
252
|
+
|
|
253
|
+
### Jargon → everyday language
|
|
254
|
+
Source: `https://digital.gov/guides/plain-language/principles/avoid-jargon`
|
|
255
|
+
("Consider the following pairs").
|
|
256
|
+
|
|
257
|
+
| avoid | prefer (shipped) |
|
|
258
|
+
|---|---|
|
|
259
|
+
| Riverine avifauna | River birds |
|
|
260
|
+
| Involuntarily undomiciled | Unhoused |
|
|
261
|
+
|
|
262
|
+
## Families considered and NOT shipped (abstract advice, not concrete pairs)
|
|
263
|
+
|
|
264
|
+
- **Nominalizations ("hidden verbs")** — the live page
|
|
265
|
+
(`https://digital.gov/guides/plain-language/writing`) gives only two
|
|
266
|
+
full-sentence before/after examples ("We conduct an analysis of the
|
|
267
|
+
data." → "We analyze data."; "We are responsible for management of the
|
|
268
|
+
program." → "We manage the program.") plus a morphological pattern
|
|
269
|
+
(suffixes `-ment`, `-tion`, `-sion`, `-ance` combined with link verbs
|
|
270
|
+
achieve/effect/give/have/make/reach/take). That pattern is not safely
|
|
271
|
+
concrete: ordinary, entirely correct nouns sharing those suffixes
|
|
272
|
+
("chance", "moment", "information", "attention", "decision" used plainly,
|
|
273
|
+
"assurance", "distance") would false-positive constantly under any
|
|
274
|
+
verb+suffix pattern rule — a materially worse hit rate than the excluded
|
|
275
|
+
word-level pairs above. Omitted rather than shipped noisy.
|
|
276
|
+
- **Sentence-length numeric rule** — no word count is stated anywhere on
|
|
277
|
+
the live site; see above.
|
|
278
|
+
- **Grade-level/readability `metric` rule** — no number is stated anywhere
|
|
279
|
+
on the live site; see above.
|
|
280
|
+
- **Abbreviation count per document** ("Limit the number of abbreviations
|
|
281
|
+
you use in one document to no more than three, preferably two" —
|
|
282
|
+
`https://digital.gov/guides/plain-language/writing/style`). A real,
|
|
283
|
+
quotable number — but it counts DISTINCT abbreviation TYPES per document,
|
|
284
|
+
not total occurrences. Neither `occurrence` nor `length` can express
|
|
285
|
+
"count of distinct matching values" (both count total matches/size), so
|
|
286
|
+
faithfully enforcing this specific number is an engine gap, not a
|
|
287
|
+
judgment call — out of scope for this preset.
|
|
288
|
+
- **Paraphrase-testing sample size, testing iteration count** — both are
|
|
289
|
+
user-testing METHODOLOGY recommendations, not document content; not
|
|
290
|
+
something a markdown/prose linter can ever evaluate from text alone.
|
|
291
|
+
|
|
292
|
+
## Duplicate-finding audit
|
|
293
|
+
|
|
294
|
+
A composable preset that duplicates a flagship's own findings on the same
|
|
295
|
+
span is noise, not value — measured directly with `lintContent` over this
|
|
296
|
+
preset's own violations fixture, stacked onto each flagship in turn (see
|
|
297
|
+
`preset-composition.test.ts`'s "duplicate findings" describe block for the
|
|
298
|
+
live, asserted counts).
|
|
299
|
+
|
|
300
|
+
Stacking `recheck/plain-language` onto `recheck/google` originally produced
|
|
301
|
+
**6** duplicate positions (same file/line/column, 2+ distinct rule names);
|
|
302
|
+
onto `recheck/microsoft`, **5**. Two pairs accounted for 3 of those on each
|
|
303
|
+
side and are REMOVED as a result:
|
|
304
|
+
|
|
305
|
+
| Removed pair | Was in | Already shipped, identically, by |
|
|
306
|
+
|---|---|---|
|
|
307
|
+
| `in order to` → `to` | `plain-language/filler-phrases` | `google/in-order-to` AND `microsoft/simple-words` |
|
|
308
|
+
| `utilize`/`utilization` → `use` | `plain-language/complex-words` | `google/utilize` AND `microsoft/simple-words` |
|
|
309
|
+
|
|
310
|
+
Both are removed outright, not merely documented as an accepted overlap:
|
|
311
|
+
they add zero coverage for anyone already running either flagship, and a
|
|
312
|
+
user running neither flagship loses nothing meaningful by their absence —
|
|
313
|
+
these are common enough words that a project without either flagship
|
|
314
|
+
almost certainly has its own opinion, or none, either way. This is the
|
|
315
|
+
general rule of thumb for this class of overlap: prefer removal when the
|
|
316
|
+
flagship's coverage is genuinely equivalent (same phrase, same
|
|
317
|
+
replacement), which both of these are.
|
|
318
|
+
|
|
319
|
+
**3** duplicate positions remain against each flagship (google+plain-
|
|
320
|
+
language: 3 of 35 total problems on the violations fixture;
|
|
321
|
+
microsoft+plain-language: 3 of 35). These are KEPT, not removed, because
|
|
322
|
+
they are not content-equivalence — each is either:
|
|
323
|
+
|
|
324
|
+
1. **The accepted paragraph-length overlap** — `plain-language/paragraph-
|
|
325
|
+
max-words` and `plain-language/paragraph-sentence-count` always co-fire
|
|
326
|
+
on the same long paragraph (that's two independently-sourced numbers,
|
|
327
|
+
words vs. sentences, both real); against `recheck/microsoft`
|
|
328
|
+
specifically, `microsoft/paragraph-length` (a DIFFERENT number, 7
|
|
329
|
+
sentences vs. this preset's 8, sourced from Microsoft's own distinct
|
|
330
|
+
"3-7 lines" proxy) joins that overlap too. See plain-language.ts's file
|
|
331
|
+
header for why this one is a deliberate keep, not an oversight.
|
|
332
|
+
2. **A coincidental substring collision with `use-contractions`** — this
|
|
333
|
+
preset's own `has not yet attained`/`is not … unless` double-negative
|
|
334
|
+
content happens to contain the literal substrings "has not"/"is not",
|
|
335
|
+
which both flagships' own `use-contractions` rule ALSO flags (toward
|
|
336
|
+
"hasn't"/"isn't") for a completely unrelated reason (contraction
|
|
337
|
+
preference, not double-negative wordiness). This is not a design
|
|
338
|
+
overlap between the two presets' actual TERM LISTS — it is two
|
|
339
|
+
independently-motivated rules that happen to have an opinion about the
|
|
340
|
+
same span of text. Keeping both is correct: removing the double-
|
|
341
|
+
negative content would lose real, unrelated value, and there is no way
|
|
342
|
+
to narrow it to avoid every phrase containing "has not"/"is not"
|
|
343
|
+
without gutting the family.
|
|
344
|
+
|
|
345
|
+
## Fetch log (2026-07-30, `curl -sL`)
|
|
346
|
+
|
|
347
|
+
| URL | Result |
|
|
348
|
+
|---|---|
|
|
349
|
+
| `https://www.plainlanguage.gov/` | 301 → `https://digital.gov/guides/plain-language` |
|
|
350
|
+
| `https://www.plainlanguage.gov/guidelines/words/simple-words-phrases/` | 301 → same target |
|
|
351
|
+
| `https://www.plainlanguage.gov/guidelines/sentences/` | 301 → same target |
|
|
352
|
+
| `https://www.plainlanguage.gov/guidelines/paragraphs/` | 301 → same target |
|
|
353
|
+
| `https://www.plainlanguage.gov/media/FederalPlainLanguageGuidelines.pdf` | 301 → same target |
|
|
354
|
+
| `https://digital.gov/guides/plain-language` | 200 |
|
|
355
|
+
| `https://digital.gov/guides/plain-language/principles` (+ 4 subpages) | 200 |
|
|
356
|
+
| `https://digital.gov/guides/plain-language/writing` (+ 4 subpages) | 200 |
|
|
357
|
+
| `https://digital.gov/guides/writing-understanding/familiar-terms` | 200 |
|
|
358
|
+
| `https://digital.gov/guides/plain-language/design` (+ 5 subpages) | 200 |
|
|
359
|
+
| `https://digital.gov/guides/plain-language/test` (+ 3 subpages) | 200 |
|
|
360
|
+
| `https://digital.gov/resources/plain-writing-act` | 200 |
|
|
361
|
+
| `https://www.whitehouse.gov/wp-content/uploads/legacy_drupal_files/omb/memoranda/2011/m11-15.pdf` (OMB Memo M-11-15) | 200, read natively as PDF |
|
|
362
|
+
|
|
363
|
+
**Not fetched, and not used as a source**: the PlainLanguage.gov GitHub
|
|
364
|
+
archive repository — off-domain, out of scope per the `.gov`-only rule.
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
{
|
|
2
|
+
"normalization": {
|
|
3
|
+
"method": "main-region-sha256",
|
|
4
|
+
"description": "Each digest is sha256 over the UTF-8 bytes of the first <main>...</main> region extracted from the raw HTML response -- NOT the full page. Correction (2026-07-30): a prior version of this file hashed the raw HTML directly and claimed digital.gov's plain-language pages are static enough for that to be reproducible ('two consecutive fetches ... byte-identical'). That claim does not hold: on independent re-fetch of all 9 pages below, every recorded `bytes` (raw page length) matched exactly, but NONE of the recorded raw-HTML `sha256` values did. Cause, found by diffing two raw fetches: digital.gov runs on Drupal, and every response embeds Drupal-generated metadata OUTSIDE the guide content -- an anonymous-user `permissionsHash` (a 64-hex-char token in the inline `drupal-settings-json` <script>), aggregated CSS/JS asset filenames (`css_<hash>.css`, `js_<hash>.js`, content-hashed per Drupal's asset-aggregation build), and an `ajaxPageState.libraries` deflate+base64 blob describing loaded asset libraries. These change across Drupal deploys/cache-clears (not on every single request -- repeated fetches within one test session are identical) but are each a fixed-format token, so the overall page BYTE LENGTH stays constant even when the exact bytes differ -- a length-preserving drift raw-HTML hashing cannot catch as anything but total mismatch. All of this metadata lives before the opening <main> tag; none of it was found inside <main>...</main> (checked by scanning the extracted region for any 16+ char hex/base64-like token -- zero hits across all 9 pages).",
|
|
5
|
+
"extractionPattern": "<main[\\s\\S]*?</main>",
|
|
6
|
+
"extractionFlags": "first match, dot-matches-newline via [\\s\\S]",
|
|
7
|
+
"hashedBytesField": "bytes -- the byte length of the EXTRACTED <main> region (UTF-8), not the raw page. A future re-check with a matching bytes but different sha256 (or vice versa) signals the extraction may have changed shape rather than the content, and should be triaged before treating it as drift.",
|
|
8
|
+
"fetchMethod": "curl -sL (redirects followed), matching the method recorded in .superpowers/sdd/task-11-verify-plain-language.md.",
|
|
9
|
+
"reproducibilityCheck": "All 9 pages below were fetched TWICE each, ~80 seconds apart (past this site's `cache-control: max-age=60` CDN TTL, so the second fetch is not guaranteed to be a cached copy of the first) -- the extracted <main> region was byte-identical (and therefore sha256-identical) both times for every page (see reproducible: true on every entry). Confirmed empirically, not assumed."
|
|
10
|
+
},
|
|
11
|
+
"deadSiteNote": "plainlanguage.gov itself is dead: every path under it 301-redirects to https://digital.gov/guides/plain-language. See PROVENANCE.md's 'plainlanguage.gov is dead' section. Redirect targets, not the plainlanguage.gov URLs themselves, are what's hashed below.",
|
|
12
|
+
"pages": [
|
|
13
|
+
{
|
|
14
|
+
"url": "https://digital.gov/guides/plain-language",
|
|
15
|
+
"fetchedAt": "2026-07-30",
|
|
16
|
+
"bytes": 5892,
|
|
17
|
+
"sha256": "91e2c32a9563e673d9227190534542a25f6a4500603f907d9ab4caf3b8fb0975",
|
|
18
|
+
"reproducible": true,
|
|
19
|
+
"coversTerms": [
|
|
20
|
+
"overview; establishes the plainlanguage.gov redirect and public-domain status"
|
|
21
|
+
]
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"url": "https://digital.gov/guides/plain-language/principles",
|
|
25
|
+
"fetchedAt": "2026-07-30",
|
|
26
|
+
"bytes": 10406,
|
|
27
|
+
"sha256": "afdbcd6f3a2752ff6e6e35bd46349429c4b3ec02d2f1b170cc739c820f1cf3d2",
|
|
28
|
+
"reproducible": true,
|
|
29
|
+
"coversTerms": [
|
|
30
|
+
"the '8th-grade' quote that argues AGAINST a fixed readability target -- why no metric rule ships"
|
|
31
|
+
]
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"url": "https://digital.gov/guides/plain-language/writing",
|
|
35
|
+
"fetchedAt": "2026-07-30",
|
|
36
|
+
"bytes": 15569,
|
|
37
|
+
"sha256": "abaaa5b42aafb0f4e1523d8059639165d854c18eb121247c48e484f85fed9a2a",
|
|
38
|
+
"reproducible": true,
|
|
39
|
+
"coversTerms": [
|
|
40
|
+
"nominalizations (hidden verbs) -- considered, not shipped; see PROVENANCE.md"
|
|
41
|
+
]
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"url": "https://digital.gov/guides/plain-language/writing/clear-short",
|
|
45
|
+
"fetchedAt": "2026-07-30",
|
|
46
|
+
"bytes": 12116,
|
|
47
|
+
"sha256": "cccdabde1fbd41322858568c29d46b246a4f7daef7e412354a7165e520fb737d",
|
|
48
|
+
"reproducible": true,
|
|
49
|
+
"coversTerms": [
|
|
50
|
+
"plain-language/paragraph-max-words",
|
|
51
|
+
"plain-language/paragraph-sentence-count"
|
|
52
|
+
]
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"url": "https://digital.gov/guides/plain-language/writing/style",
|
|
56
|
+
"fetchedAt": "2026-07-30",
|
|
57
|
+
"bytes": 22278,
|
|
58
|
+
"sha256": "df247d43335f57a7c861a7a5204828947dbe97412980b8cfafd72e6e809ae0ec",
|
|
59
|
+
"reproducible": true,
|
|
60
|
+
"coversTerms": [
|
|
61
|
+
"plain-language/filler-phrases",
|
|
62
|
+
"plain-language/an-amount-of",
|
|
63
|
+
"plain-language/double-negative-phrases",
|
|
64
|
+
"plain-language/double-negative-patterns"
|
|
65
|
+
]
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
"url": "https://digital.gov/guides/writing-understanding/familiar-terms",
|
|
69
|
+
"fetchedAt": "2026-07-30",
|
|
70
|
+
"bytes": 10597,
|
|
71
|
+
"sha256": "93eadf5196a121f3f23978b346af45a39c5efa089adb2e448d0a40a7836f6b4a",
|
|
72
|
+
"reproducible": true,
|
|
73
|
+
"coversTerms": ["plain-language/complex-words"]
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
"url": "https://digital.gov/guides/plain-language/principles/short-simple",
|
|
77
|
+
"fetchedAt": "2026-07-30",
|
|
78
|
+
"bytes": 12449,
|
|
79
|
+
"sha256": "aedc14e0f7b1eadc5f1674cf87132ace08f9846c9da7606fdfb6f53b4c5ad3d2",
|
|
80
|
+
"reproducible": true,
|
|
81
|
+
"coversTerms": ["plain-language/redundant-pairs", "plain-language/excess-intensifiers"]
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
"url": "https://digital.gov/guides/plain-language/principles/avoid-jargon",
|
|
85
|
+
"fetchedAt": "2026-07-30",
|
|
86
|
+
"bytes": 12356,
|
|
87
|
+
"sha256": "843427bb3d96e8accb832adba736877d2b9577ba5270808abceaa5bdd8f06eaf",
|
|
88
|
+
"reproducible": true,
|
|
89
|
+
"coversTerms": ["plain-language/jargon-terms"]
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
"url": "https://digital.gov/guides/plain-language/test",
|
|
93
|
+
"fetchedAt": "2026-07-30",
|
|
94
|
+
"bytes": 8161,
|
|
95
|
+
"sha256": "907f005e694966076904fd945bb186a29b6780ce0a78a5cc9a667ee4bfcd06a0",
|
|
96
|
+
"reproducible": true,
|
|
97
|
+
"coversTerms": [
|
|
98
|
+
"confirms testing method is user-testing-based, not an automated readability formula -- why no metric rule ships"
|
|
99
|
+
]
|
|
100
|
+
}
|
|
101
|
+
],
|
|
102
|
+
"notIndependentlyHashed": [
|
|
103
|
+
{
|
|
104
|
+
"url": "https://www.whitehouse.gov/wp-content/uploads/legacy_drupal_files/omb/memoranda/2011/m11-15.pdf",
|
|
105
|
+
"note": "OMB Memo M-11-15. Read natively as a PDF in task-11-verify-plain-language.md, not re-fetched or hashed here; defines 'plain writing' only in prose terms, no numeric target."
|
|
106
|
+
}
|
|
107
|
+
]
|
|
108
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bullet-style.d.ts","sourceRoot":"","sources":["../../src/assertions/bullet-style.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAW,MAAM,YAAY,CAAC;AAmE1D,eAAO,MAAM,WAAW,EAAE,cAIzB,CAAC"}
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
async function execute(rule, file, { content }) {
|
|
2
|
-
const problems = [];
|
|
3
|
-
const options = rule.assertions['bullet-style'];
|
|
4
|
-
const expectedStyle = options.style;
|
|
5
|
-
const lines = content.split('\n');
|
|
6
|
-
for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {
|
|
7
|
-
const lineText = lines[lineIndex];
|
|
8
|
-
const lineNumber = lineIndex + 1;
|
|
9
|
-
const bulletMatch = lineText.match(/^(\s*)([*-])\s+/);
|
|
10
|
-
if (bulletMatch) {
|
|
11
|
-
const actualStyle = bulletMatch[2];
|
|
12
|
-
if (actualStyle !== expectedStyle) {
|
|
13
|
-
problems.push({
|
|
14
|
-
file,
|
|
15
|
-
line: lineNumber,
|
|
16
|
-
column: bulletMatch[1].length + 1,
|
|
17
|
-
text: lineText,
|
|
18
|
-
match: actualStyle,
|
|
19
|
-
ruleName: rule.name,
|
|
20
|
-
severity: rule.severity,
|
|
21
|
-
message: rule.message,
|
|
22
|
-
});
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
return problems;
|
|
27
|
-
}
|
|
28
|
-
async function fix(rule, file, { content }) {
|
|
29
|
-
const fixes = [];
|
|
30
|
-
const options = rule.assertions['bullet-style'];
|
|
31
|
-
const expectedStyle = options.style;
|
|
32
|
-
const lines = content.split('\n');
|
|
33
|
-
for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {
|
|
34
|
-
const lineText = lines[lineIndex];
|
|
35
|
-
const lineNumber = lineIndex + 1;
|
|
36
|
-
const bulletMatch = lineText.match(/^(\s*)([*-])(\s+)/);
|
|
37
|
-
if (bulletMatch) {
|
|
38
|
-
const [fullMatch, indentation, actualStyle, spacing] = bulletMatch;
|
|
39
|
-
if (actualStyle !== expectedStyle) {
|
|
40
|
-
const newText = indentation + expectedStyle + spacing + lineText.substring(fullMatch.length);
|
|
41
|
-
fixes.push({
|
|
42
|
-
file,
|
|
43
|
-
line: lineNumber,
|
|
44
|
-
column: 1,
|
|
45
|
-
oldText: lineText,
|
|
46
|
-
newText,
|
|
47
|
-
ruleName: rule.name,
|
|
48
|
-
description: `Change bullet style from '${actualStyle}' to '${expectedStyle}'`,
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
return fixes;
|
|
54
|
-
}
|
|
55
|
-
export const bulletStyle = {
|
|
56
|
-
id: 'bullet-style',
|
|
57
|
-
execute,
|
|
58
|
-
fix,
|
|
59
|
-
};
|
|
60
|
-
//# sourceMappingURL=bullet-style.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bullet-style.js","sourceRoot":"","sources":["../../src/assertions/bullet-style.ts"],"names":[],"mappings":"AAGA,KAAK,UAAU,OAAO,CACpB,IAAoB,EACpB,IAAY,EACZ,EAAE,OAAO,EAAW;IAEpB,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,cAAc,CAAyB,CAAC;IACxE,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC;IAEpC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC;QAC9D,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;QAClC,MAAM,UAAU,GAAG,SAAS,GAAG,CAAC,CAAC;QACjC,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACtD,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YACnC,IAAI,WAAW,KAAK,aAAa,EAAE,CAAC;gBAClC,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI;oBACJ,IAAI,EAAE,UAAU;oBAChB,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC;oBACjC,IAAI,EAAE,QAAQ;oBACd,KAAK,EAAE,WAAW;oBAClB,QAAQ,EAAE,IAAI,CAAC,IAAI;oBACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,OAAO,EAAE,IAAI,CAAC,OAAO;iBACtB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,GAAG,CAAC,IAAoB,EAAE,IAAY,EAAE,EAAE,OAAO,EAAW;IACzE,MAAM,KAAK,GAAU,EAAE,CAAC;IACxB,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,cAAc,CAAyB,CAAC;IACxE,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC;IAEpC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC;QAC9D,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;QAClC,MAAM,UAAU,GAAG,SAAS,GAAG,CAAC,CAAC;QACjC,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACxD,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,CAAC,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,GAAG,WAAW,CAAC;YACnE,IAAI,WAAW,KAAK,aAAa,EAAE,CAAC;gBAClC,MAAM,OAAO,GACX,WAAW,GAAG,aAAa,GAAG,OAAO,GAAG,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;gBAC/E,KAAK,CAAC,IAAI,CAAC;oBACT,IAAI;oBACJ,IAAI,EAAE,UAAU;oBAChB,MAAM,EAAE,CAAC;oBACT,OAAO,EAAE,QAAQ;oBACjB,OAAO;oBACP,QAAQ,EAAE,IAAI,CAAC,IAAI;oBACnB,WAAW,EAAE,6BAA6B,WAAW,SAAS,aAAa,GAAG;iBAC/E,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAmB;IACzC,EAAE,EAAE,cAAc;IAClB,OAAO;IACP,GAAG;CACJ,CAAC"}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import type { NormalizedRule, Problem, Fix } from '../types/index.js';
|
|
2
|
-
import type { ScopedSegment } from '../core/scope-parser.js';
|
|
3
|
-
export interface Context {
|
|
4
|
-
content: string;
|
|
5
|
-
segments: ScopedSegment[];
|
|
6
|
-
fileMetadata?: {
|
|
7
|
-
images: Map<string, {
|
|
8
|
-
path: string;
|
|
9
|
-
size: number;
|
|
10
|
-
exists: boolean;
|
|
11
|
-
}>;
|
|
12
|
-
};
|
|
13
|
-
}
|
|
14
|
-
export interface RuleDefinition {
|
|
15
|
-
id: string;
|
|
16
|
-
execute: (rule: NormalizedRule, file: string, { content, segments }: Context) => Promise<Problem[]>;
|
|
17
|
-
fix?: (rule: NormalizedRule, file: string, { content, segments }: Context) => Promise<Fix[]>;
|
|
18
|
-
}
|
|
19
|
-
export declare const assertionRules: Record<string, RuleDefinition>;
|
|
20
|
-
export declare function getAssertion(id: string): RuleDefinition;
|
|
21
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/assertions/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAa7D,MAAM,WAAW,OAAO;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,YAAY,CAAC,EAAE;QACb,MAAM,EAAE,GAAG,CACT,MAAM,EACN;YACE,IAAI,EAAE,MAAM,CAAC;YACb,IAAI,EAAE,MAAM,CAAC;YACb,MAAM,EAAE,OAAO,CAAC;SACjB,CACF,CAAC;KACH,CAAC;CACH;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,CACP,IAAI,EAAE,cAAc,EACpB,IAAI,EAAE,MAAM,EACZ,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,OAAO,KAC3B,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACxB,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,OAAO,KAAK,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;CAC9F;AAED,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAWzD,CAAC;AAEF,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,CAMvD"}
|
package/dist/assertions/index.js
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import { bulletStyle } from './bullet-style.js';
|
|
2
|
-
import { maxImageSize } from './max-image-size.js';
|
|
3
|
-
import { maxLineLength } from './max-line-length.js';
|
|
4
|
-
import { noDuplicateHeadings } from './no-duplicate-headings.js';
|
|
5
|
-
import { noHardTabs } from './no-hard-tabs.js';
|
|
6
|
-
import { noTrailingSpaces } from './no-trailing-spaces.js';
|
|
7
|
-
import { noBrokenFragmentLinks } from './no-broken-fragment-links.js';
|
|
8
|
-
import { pattern } from './pattern.js';
|
|
9
|
-
import { semanticLineBreaks } from './semantic-line-breaks.js';
|
|
10
|
-
import { swap } from './swap.js';
|
|
11
|
-
export const assertionRules = {
|
|
12
|
-
'max-image-size': maxImageSize,
|
|
13
|
-
'max-line-length': maxLineLength,
|
|
14
|
-
'no-trailing-spaces': noTrailingSpaces,
|
|
15
|
-
'bullet-style': bulletStyle,
|
|
16
|
-
'semantic-line-breaks': semanticLineBreaks,
|
|
17
|
-
'no-hard-tabs': noHardTabs,
|
|
18
|
-
'no-duplicate-headings': noDuplicateHeadings,
|
|
19
|
-
'no-broken-fragment-links': noBrokenFragmentLinks,
|
|
20
|
-
swap,
|
|
21
|
-
pattern,
|
|
22
|
-
};
|
|
23
|
-
export function getAssertion(id) {
|
|
24
|
-
const assertion = assertionRules[id];
|
|
25
|
-
if (!assertion) {
|
|
26
|
-
throw new Error(`Assertion not found: ${id}`);
|
|
27
|
-
}
|
|
28
|
-
return assertion;
|
|
29
|
-
}
|
|
30
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/assertions/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AA2BjC,MAAM,CAAC,MAAM,cAAc,GAAmC;IAC5D,gBAAgB,EAAE,YAAY;IAC9B,iBAAiB,EAAE,aAAa;IAChC,oBAAoB,EAAE,gBAAgB;IACtC,cAAc,EAAE,WAAW;IAC3B,sBAAsB,EAAE,kBAAkB;IAC1C,cAAc,EAAE,UAAU;IAC1B,uBAAuB,EAAE,mBAAmB;IAC5C,0BAA0B,EAAE,qBAAqB;IACjD,IAAI;IACJ,OAAO;CACR,CAAC;AAEF,MAAM,UAAU,YAAY,CAAC,EAAU;IACrC,MAAM,SAAS,GAAG,cAAc,CAAC,EAAE,CAAC,CAAC;IACrC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"max-image-size.d.ts","sourceRoot":"","sources":["../../src/assertions/max-image-size.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAW,MAAM,YAAY,CAAC;AAoG1D,eAAO,MAAM,YAAY,EAAE,cAI1B,CAAC"}
|