Author high-quality Markdown documentation with deterministic structure, lint compliance, and CI integration. Use when writing README files, creating docs pages, fixing markdownlint failures, defining style rules, or wiring markdown checks into pre-commit and pipelines. Keywords: markdown, markdownlint, readme, docs, headings, lists, code fences, links, images, lint config, ci, documentation style.
Overall
score
100%
Does it follow best practices?
Validation for skill structure
# markdownlint-cli2 (recommended)
npm install -D markdownlint-cli2
# Original markdownlint-cli
npm install -D markdownlint-cli# Lint all markdown files
markdownlint-cli2 "**/*.md"
# Lint specific files
markdownlint-cli2 README.md CONTRIBUTING.md
# Lint with pattern
markdownlint-cli2 "docs/**/*.md"# Fix all auto-fixable issues
markdownlint-cli2 --fix "**/*.md"
# Fix specific files
markdownlint-cli2 --fix README.md# Ignore node_modules and dist
markdownlint-cli2 "**/*.md" "#node_modules" "#dist"
# Multiple ignore patterns
markdownlint-cli2 "**/*.md" "#node_modules" "#**/vendor/**" "#CHANGELOG.md"# Uses .markdownlint-cli2.jsonc if present
markdownlint-cli2 "**/*.md"
# Specify config file
markdownlint-cli2 --config custom-config.json "**/*.md"# Show help
markdownlint-cli2 --help
# Show version
markdownlint-cli2 --version
# Fix issues
markdownlint-cli2 --fix "**/*.md"
# Custom config
markdownlint-cli2 --config .markdownlint.json "**/*.md"
# No config (use defaults)
markdownlint-cli2 --no-config "**/*.md"markdownlint-cli2 "**/*.md"
# Output:
# README.md:23 MD013/line-length Line length [Expected: 80; Actual: 125]
# docs/api.md:45 MD040/fenced-code-language Fenced code blocks should have a language specifiedmarkdownlint-cli2 --config .markdownlint-cli2.jsonc "**/*.md".markdownlint-cli2.jsonc:
{
"outputFormatters": [
["markdownlint-cli2-formatter-json"]
]
}# Summary at end
markdownlint-cli2 "**/*.md"
# Output includes:
# Found 15 error(s) in 5 file(s)0 - No errors found1 - Errors found2 - Invalid command-line argumentsUse in CI/CD:
#!/bin/bash
markdownlint-cli2 "**/*.md"
exit_code=$?
if [ $exit_code -ne 0 ]; then
echo "Markdown linting failed!"
exit 1
fi{
"scripts": {
"lint:md": "markdownlint-cli2 \"**/*.md\" \"#node_modules\"",
"lint:md:fix": "markdownlint-cli2 --fix \"**/*.md\" \"#node_modules\"",
"lint": "npm run lint:md && npm run lint:js",
"format:md": "markdownlint-cli2 --fix \"**/*.md\" \"#node_modules\""
}
}Usage:
npm run lint:md
npm run lint:md:fixname: Lint Markdown
on: [push, pull_request]
jobs:
markdown-lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install dependencies
run: npm ci
- name: Lint markdown
run: npm run lint:mdmarkdown-lint:
image: node:20
stage: test
script:
- npm ci
- npm run lint:md
only:
- merge_requests
- mainUsing Husky + lint-staged:
package.json:
{
"lint-staged": {
"*.md": "markdownlint-cli2 --fix"
}
}.husky/pre-commit:
#!/bin/sh
npx lint-stagedmarkdownlint-cli2 "**/*.md" "#node_modules" "#dist" "#coverage" "#.next"markdownlint-cli2 "docs/**/*.md" "README.md" "CONTRIBUTING.md"markdownlint-cli2 --fix "**/*.md" "#node_modules" || trueThe || true prevents the script from failing in CI if there are non-fixable errors.
# In pre-commit hook
git diff --cached --name-only --diff-filter=ACMR "*.md" | xargs markdownlint-cli2 --fix.markdownlint-cli2.jsonc:
{
"globs": [
"**/*.md"
],
"ignores": [
"**/node_modules/**",
"**/dist/**",
"packages/*/CHANGELOG.md"
],
"config": {
"default": true,
"MD013": { "line_length": 120 }
}
}package.json (root):
{
"scripts": {
"lint:md": "markdownlint-cli2",
"lint:md:fix": "markdownlint-cli2 --fix"
}
}packages/app/package.json:
{
"scripts": {
"lint:md": "markdownlint-cli2 \"**/*.md\" \"#node_modules\""
}
}# Issue: Pattern doesn't match
markdownlint-cli2 "*.md" # Only matches current directory
# Solution: Use recursive pattern
markdownlint-cli2 "**/*.md"# Issue: Config file not detected
markdownlint-cli2 "**/*.md"
# Solution: Specify config explicitly
markdownlint-cli2 --config .markdownlint.json "**/*.md"# Issue: Argument list too long
markdownlint-cli2 $(find . -name "*.md")
# Solution: Use glob pattern
markdownlint-cli2 "**/*.md"# Issue: Slow on large repos
# Solution: Limit scope
markdownlint-cli2 "src/**/*.md" "docs/**/*.md"
# Or: Exclude large directories
markdownlint-cli2 "**/*.md" "#vendor" "#node_modules" "#.git".markdownlint-cli2.jsonc--fix in developmentnode_modules, dist, etc.|| true in CI pipelines"**/*.md" not *.md"**/*.md"node_modules--fix in CI, only in developmentInstall with Tessl CLI
npx tessl i pantheon-ai/markdown-authoring@0.1.1