Skip to content

Commit 586c6f1

Browse files
author
merge-queue-bot
committed
Merge PR #429: Plan 218: Finish MD054 link-image-style coverage in MDS068
2 parents a79e848 + be1ccd8 commit 586c6f1

26 files changed

Lines changed: 1090 additions & 96 deletions

.github/copilot-instructions.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ row: "- [{summary}](../{filename})"
9090
- [User guides for mdsmith directives, structure enforcement, and migration.](../docs/guides/index.md)
9191
- [Every channel that ships the mdsmith binary, the VS Code extension, or the Claude Code plugin — npm, PyPI, asdf, mise, the GitHub release, the Visual Studio Marketplace plus Open VSX, and the in-repository Claude Code marketplace — and which channel to pick for which workflow.](../docs/guides/install.md)
9292
- [Trade-offs and threshold guidance for readability, structure, length, and token budgets.](../docs/guides/metrics-tradeoffs.md)
93-
- [Move a project from markdownlint-cli or markdownlint-cli2 to mdsmith — the rule mapping, the config rewrite, and the markdownlint rules mdsmith does not implement yet.](../docs/guides/migrate-from-markdownlint.md)
93+
- [Move a project from markdownlint-cli or markdownlint-cli2 to mdsmith — the rule mapping, the config rewrite, and the markdownlint-to-mdsmith rule correspondence.](../docs/guides/migrate-from-markdownlint.md)
9494
- [Use `<?catalog?>` with a per-file `summary` front matter field to emit a one-line index of a directory, so AI coding agents read a few thousand tokens of metadata up front and only `Read` the files a task actually touches.](../docs/guides/progressive-disclosure.md)
9595
- [Declare a document-structure schema inline on a kind or in a proto.md file, validate headings and front matter, and tighten rule config per section.](../docs/guides/schemas.md)
9696
- [CLI commands, flags, exit codes, and output format.](../docs/reference/cli.md)

AGENTS.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ row: "- [{summary}]({filename})"
9696
- [User guides for mdsmith directives, structure enforcement, and migration.](docs/guides/index.md)
9797
- [Every channel that ships the mdsmith binary, the VS Code extension, or the Claude Code plugin — npm, PyPI, asdf, mise, the GitHub release, the Visual Studio Marketplace plus Open VSX, and the in-repository Claude Code marketplace — and which channel to pick for which workflow.](docs/guides/install.md)
9898
- [Trade-offs and threshold guidance for readability, structure, length, and token budgets.](docs/guides/metrics-tradeoffs.md)
99-
- [Move a project from markdownlint-cli or markdownlint-cli2 to mdsmith — the rule mapping, the config rewrite, and the markdownlint rules mdsmith does not implement yet.](docs/guides/migrate-from-markdownlint.md)
99+
- [Move a project from markdownlint-cli or markdownlint-cli2 to mdsmith — the rule mapping, the config rewrite, and the markdownlint-to-mdsmith rule correspondence.](docs/guides/migrate-from-markdownlint.md)
100100
- [Use `<?catalog?>` with a per-file `summary` front matter field to emit a one-line index of a directory, so AI coding agents read a few thousand tokens of metadata up front and only `Read` the files a task actually touches.](docs/guides/progressive-disclosure.md)
101101
- [Declare a document-structure schema inline on a kind or in a proto.md file, validate headings and front matter, and tighten rule config per section.](docs/guides/schemas.md)
102102
- [CLI commands, flags, exit codes, and output format.](docs/reference/cli.md)

CLAUDE.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ row: "- [{summary}]({filename})"
8282
- [User guides for mdsmith directives, structure enforcement, and migration.](docs/guides/index.md)
8383
- [Every channel that ships the mdsmith binary, the VS Code extension, or the Claude Code plugin — npm, PyPI, asdf, mise, the GitHub release, the Visual Studio Marketplace plus Open VSX, and the in-repository Claude Code marketplace — and which channel to pick for which workflow.](docs/guides/install.md)
8484
- [Trade-offs and threshold guidance for readability, structure, length, and token budgets.](docs/guides/metrics-tradeoffs.md)
85-
- [Move a project from markdownlint-cli or markdownlint-cli2 to mdsmith — the rule mapping, the config rewrite, and the markdownlint rules mdsmith does not implement yet.](docs/guides/migrate-from-markdownlint.md)
85+
- [Move a project from markdownlint-cli or markdownlint-cli2 to mdsmith — the rule mapping, the config rewrite, and the markdownlint-to-mdsmith rule correspondence.](docs/guides/migrate-from-markdownlint.md)
8686
- [Use `<?catalog?>` with a per-file `summary` front matter field to emit a one-line index of a directory, so AI coding agents read a few thousand tokens of metadata up front and only `Read` the files a task actually touches.](docs/guides/progressive-disclosure.md)
8787
- [Declare a document-structure schema inline on a kind or in a proto.md file, validate headings and front matter, and tighten rule config per section.](docs/guides/schemas.md)
8888
- [CLI commands, flags, exit codes, and output format.](docs/reference/cli.md)

PLAN.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,6 @@ footer: |
145145
| 215 || opus | [Audit AST-walking rules and rewrite the ones that only need f.Lines](plan/215_lines-only-rule-audit.md) |
146146
| 216 || opus | [Per-document parse cache for the LSP, keyed by version](plan/216_lsp-parse-cache.md) |
147147
| 217 | 🔲 | opus | [Obsidian plugin (WASM runtime)](plan/217_obsidian-plugin.md) |
148-
| 218 | 🔲 | sonnet | [Finish MD054 link-image-style coverage in MDS068](plan/218_finish-md054-link-image-style.md) |
148+
| 218 | | sonnet | [Finish MD054 link-image-style coverage in MDS068](plan/218_finish-md054-link-image-style.md) |
149149
| 219 | 🔲 | opus | [Multiplexed AST walk to close the parity gap to mado](plan/219_multiplexed-ast-walk.md) |
150150
<?/catalog?>

docs/background/markdown-linters.md

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -486,9 +486,8 @@ the broadest set. The full rule-by-rule mapping lives in the
486486
[markdownlint coverage matrix][mdcov]: every markdownlint
487487
`MDxxx`, the mdsmith rule that covers it or the plan that
488488
schedules it, and the mdsmith-only rules. As of 2026-05
489-
mdsmith implements 51 of 52 active markdownlint rules (49
490-
fully, 2 partial); the only outstanding rule is MD054,
491-
scheduled in plan 172.
489+
mdsmith implements all 52 active markdownlint rules (50
490+
fully, 2 partial).
492491

493492
### Rust Markdown linters (rumdl, mado, panache)
494493

@@ -903,14 +902,16 @@ items most relevant to this comparison are:
903902
lifecycle hooks. This will close part of the gap
904903
with Hugo: deriving artifacts from Markdown sources
905904
without leaving the linter.
906-
- **Closing rule gaps with markdownlint** — only MD054
907-
remains unimplemented, scheduled in
908-
[plan 172](../../plan/172_link-style-rule-and-config.md).
909-
MDS025 (`table-format`) covers MD055, MD056, and MD058
910-
(MD056 flag-only); MDS062 (`link-validity`) covers MD011 and
911-
MD042; MDS064 (`atx-heading-whitespace`) covers MD018-MD021
912-
and MD023; MDS063 (`descriptive-link-text`) covers MD059;
913-
MDS065 (`code-block-style`) covers MD046 and MDS066
905+
- **markdownlint rule coverage** — mdsmith now implements
906+
all 52 active markdownlint rules. MDS068 (`link-style`)
907+
covers MD054 (link-image-style) via the
908+
`links.style.link-image-style` six-toggle axis, completing
909+
coverage. MDS025 (`table-format`) covers MD055, MD056,
910+
and MD058 (MD056 flag-only); MDS062 (`link-validity`)
911+
covers MD011 and MD042; MDS064 (`atx-heading-whitespace`)
912+
covers MD018-MD021 and MD023; MDS063
913+
(`descriptive-link-text`) covers MD059; MDS065
914+
(`code-block-style`) covers MD046; MDS066
914915
(`commands-show-output`) covers MD014. The [coverage
915916
matrix][mdcov] tracks each.
916917
- **User-defined Markdown conventions**

docs/guides/index.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ row: "| [{title}]({filename}) | {summary} |"
2929
| [File Kinds](file-kinds.md) | How to declare file kinds, assign files to them, and read the merged rule config that results. |
3030
| [Generating Content with Directives](directives/generating-content.md) | How to use catalog and include directives to generate and embed content in Markdown files. |
3131
| [Installation](install.md) | Every channel that ships the mdsmith binary, the VS Code extension, or the Claude Code plugin — npm, PyPI, asdf, mise, the GitHub release, the Visual Studio Marketplace plus Open VSX, and the in-repository Claude Code marketplace — and which channel to pick for which workflow. |
32-
| [Migrating from markdownlint](migrate-from-markdownlint.md) | Move a project from markdownlint-cli or markdownlint-cli2 to mdsmith — the rule mapping, the config rewrite, and the markdownlint rules mdsmith does not implement yet. |
32+
| [Migrating from markdownlint](migrate-from-markdownlint.md) | Move a project from markdownlint-cli or markdownlint-cli2 to mdsmith — the rule mapping, the config rewrite, and the markdownlint-to-mdsmith rule correspondence. |
3333
| [Neovim Integration](editors/neovim.md) | Wire `mdsmith lsp` into Neovim's built-in LSP client so diagnostics, code actions, and navigation work inline with no extra plugin. |
3434
| [Progressive Disclosure for AI Agents](progressive-disclosure.md) | Use `<?catalog?>` with a per-file `summary` front matter field to emit a one-line index of a directory, so AI coding agents read a few thousand tokens of metadata up front and only `Read` the files a task actually touches. |
3535
| [Schemas](schemas.md) | Declare a document-structure schema inline on a kind or in a proto.md file, validate headings and front matter, and tighten rule config per section. |

docs/guides/migrate-from-markdownlint.md

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ title: Migrating from markdownlint
33
summary: >-
44
Move a project from markdownlint-cli or markdownlint-cli2
55
to mdsmith — the rule mapping, the config rewrite, and
6-
the markdownlint rules mdsmith does not implement yet.
6+
the markdownlint-to-mdsmith rule correspondence.
77
---
88
# Migrating from markdownlint
99

10-
mdsmith covers most of the markdownlint rule set under
10+
mdsmith covers all 52 active markdownlint rules under
1111
different IDs. The CLI shape is similar (`mdsmith check
1212
.` mirrors `markdownlint .`), the auto-fix story is
1313
strictly broader, and the config moves from
@@ -64,33 +64,33 @@ override.
6464

6565
## Rule mapping (high traffic)
6666

67-
| markdownlint | mdsmith | Notes |
68-
| ------------ | ------------------------------------ | ------------------------------ |
69-
| MD001 | `heading-increment` | Same semantics |
70-
| MD003 | `heading-style` | atx / setext discriminator |
71-
| MD004 | `list-marker-style` | `*` / `-` / `+` |
72-
| MD007 | `list-indent` | Spaces per nesting level |
73-
| MD009 | `no-trailing-spaces` | Same |
74-
| MD010 | `no-hard-tabs` | Same |
75-
| MD012 | `no-multiple-blanks` | `max:` argument |
76-
| MD013 | `line-length` | `max:` + exclusion lists |
77-
| MD018-MD020 | `atx-heading-whitespace` | Unified into one rule |
78-
| MD022 | `blank-line-around-headings` | Same |
79-
| MD024 | `no-duplicate-headings` | `siblings-only:` flag |
80-
| MD025 | `single-h1` | One top-level heading per file |
81-
| MD026 | `no-trailing-punctuation-in-heading` | Same |
82-
| MD031 | `blank-line-around-fenced-code` | Same |
83-
| MD032 | `blank-line-around-lists` | Same |
84-
| MD033 | `no-inline-html` | Allow-list argument |
85-
| MD034 | `no-bare-urls` | Same |
86-
| MD040 | `fenced-code-language` | Same |
87-
| MD041 | `first-line-heading` | `level:` argument |
88-
| MD046 | `fenced-code-style` | backtick / tilde |
89-
| MD047 | `single-trailing-newline` | Same |
67+
| markdownlint | mdsmith | Notes |
68+
| ------------ | ------------------------------------ | --------------------------------------------------------------------- |
69+
| MD001 | `heading-increment` | Same semantics |
70+
| MD003 | `heading-style` | atx / setext discriminator |
71+
| MD004 | `list-marker-style` | `*` / `-` / `+` |
72+
| MD007 | `list-indent` | Spaces per nesting level |
73+
| MD009 | `no-trailing-spaces` | Same |
74+
| MD010 | `no-hard-tabs` | Same |
75+
| MD012 | `no-multiple-blanks` | `max:` argument |
76+
| MD013 | `line-length` | `max:` + exclusion lists |
77+
| MD018-MD020 | `atx-heading-whitespace` | Unified into one rule |
78+
| MD022 | `blank-line-around-headings` | Same |
79+
| MD024 | `no-duplicate-headings` | `siblings-only:` flag |
80+
| MD025 | `single-h1` | One top-level heading per file |
81+
| MD026 | `no-trailing-punctuation-in-heading` | Same |
82+
| MD031 | `blank-line-around-fenced-code` | Same |
83+
| MD032 | `blank-line-around-lists` | Same |
84+
| MD033 | `no-inline-html` | Allow-list argument |
85+
| MD034 | `no-bare-urls` | Same |
86+
| MD040 | `fenced-code-language` | Same |
87+
| MD041 | `first-line-heading` | `level:` argument |
88+
| MD046 | `fenced-code-style` | backtick / tilde |
89+
| MD047 | `single-trailing-newline` | Same |
90+
| MD054 | `link-style` (opt-in) | `links.style.link-image-style` six-toggle map; all default to allowed |
9091

9192
See [linter comparison](../background/markdown-linters.md)
92-
for the full coverage table and the rules that have no
93-
mdsmith equivalent yet.
93+
for the full coverage table.
9494

9595
## Run both in parallel for one PR
9696

docs/research/markdownlint-coverage/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ Cell legend:
8282
| [MDS053](../../../internal/rules/MDS053-no-unused-link-definitions/README.md) no-unused-link-definitions | MD053 ✅ link-image-reference-definitions | MD053 ✅ link-image-definitions || duplicate-reference-labels ✅, unused-definitions ✅ ||
8383
| [MDS054](../../../internal/rules/MDS054-no-undefined-reference-labels/README.md) no-undefined-reference-labels | MD052 ✅ reference-links-images | MD052 ✅ reference-links-images || undefined-references ✅ ||
8484
| [MDS062](../../../internal/rules/MDS062-link-validity/README.md) link-validity | MD011 ✅ no-reversed-links, MD042 ✅ no-empty-links | MD011 ✅ reversed-link, MD042 ✅ no-empty-links ||||
85-
| [MDS068](../../../internal/rules/MDS068-link-style/README.md) link-style | MD054 ✅ link-image-style (partial) | MD054 ✅ link-image-style (partial) ||||
85+
| [MDS068](../../../internal/rules/MDS068-link-style/README.md) link-style | MD054 ✅ link-image-style | MD054 ✅ link-image-style ||||
8686

8787
## Tables
8888

internal/integration/testdata/rule_walk_audit.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -733,7 +733,7 @@
733733
"code_block_sensitive": false,
734734
"fired": true,
735735
"is_node_checker": false,
736-
"uses_ast_walk": false,
737-
"reads_file_ast": false
736+
"uses_ast_walk": true,
737+
"reads_file_ast": true
738738
}
739739
]

0 commit comments

Comments
 (0)