diff --git a/.github/linters/package-lock.json b/.github/linters/package-lock.json index fd9cb59f..c2d3cb4a 100644 --- a/.github/linters/package-lock.json +++ b/.github/linters/package-lock.json @@ -8,54 +8,7 @@ "name": "linters", "version": "1.0.0", "dependencies": { - "markdownlint-cli2": "0.23.3" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@sindresorhus/merge-streams": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", - "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "markdownlint-cli": "0.49.1" } }, "node_modules/@types/debug": { @@ -103,16 +56,23 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "license": "Python-2.0" }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "license": "MIT", + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/brace-expansion": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.12.tgz", + "integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==", "dependencies": { - "fill-range": "^7.1.1" + "balanced-match": "^4.0.2" }, "engines": { - "node": ">=8" + "node": "20 || >=22" } }, "node_modules/character-entities": { @@ -184,6 +144,14 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -218,43 +186,6 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fastq": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.3.tgz", - "integrity": "sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw==", - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/get-east-asian-width": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.7.0.tgz", @@ -267,39 +198,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globby": { - "version": "16.2.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-16.2.4.tgz", - "integrity": "sha512-c8B/VNLmxRcmqqenRA9t+9IyOjf9+V6lTxPaUJLqOCONdQkWZ0ETYgX0qbtJqPsgCNusT9MZ5Jeidw8Eb9tn2g==", - "license": "MIT", - "dependencies": { - "@sindresorhus/merge-streams": "^4.0.0", - "fast-glob": "^3.3.3", - "ignore": "^7.0.5", - "is-path-inside": "^4.0.0", - "micromatch": "^4.0.8", - "slash": "^5.1.0", - "unicorn-magic": "^0.4.0" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/ignore": { "version": "7.0.11", "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.11.tgz", @@ -309,6 +207,14 @@ "node": ">= 4" } }, + "node_modules/ini": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-7.0.0.tgz", + "integrity": "sha512-ifK0CgjALofS5bkrcTy4RaQ9Vx2Knf/eLeIO+NaswQEpH1UblrtTSCIvN71qQDMq0PeQ/SSPojvEJp9vvvfr+w==", + "engines": { + "node": "^22.22.2 || ^24.15.0 || >=26.0.0" + } + }, "node_modules/is-alphabetical": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", @@ -343,27 +249,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-hexadecimal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", @@ -374,27 +259,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-path-inside": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", - "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/js-yaml": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz", @@ -517,42 +381,37 @@ "url": "https://github.com/sponsors/DavidAnson" } }, - "node_modules/markdownlint-cli2": { - "version": "0.23.3", - "resolved": "https://registry.npmjs.org/markdownlint-cli2/-/markdownlint-cli2-0.23.3.tgz", - "integrity": "sha512-xAr5o/TGpC3v6lE6cKIW4b5eOFRrRX5u7Vtjae9ix3RALv8nNOd94XMkD/1OXXBtpMcJ4uQGbpSo3hv5UqS4uQ==", - "license": "MIT", + "node_modules/markdownlint-cli": { + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.49.1.tgz", + "integrity": "sha512-qpYqJbSYf3jv57bdnFmCaZ/Wlu6IYHp2b6SOKrKBJ7OnPrDHIKmx4NERWH49QH9viTI6yO6raVDDn5nrf60VQQ==", "dependencies": { - "globby": "16.2.4", - "js-yaml": "5.4.1", - "jsonc-parser": "3.3.1", - "jsonpointer": "5.0.1", - "markdown-it": "15.0.1", - "markdownlint": "0.41.1", - "markdownlint-cli2-formatter-default": "0.0.6", - "micromatch": "4.0.8", - "smol-toml": "1.8.0" + "commander": "~15.0.0", + "deep-extend": "~0.6.0", + "ignore": "~7.0.6", + "js-yaml": "~5.2.1", + "jsonc-parser": "~3.3.1", + "jsonpointer": "~5.0.1", + "markdown-it": "~14.3.0", + "markdownlint": "~0.41.1", + "minimatch": "~10.2.5", + "run-con": "~1.3.3", + "smol-toml": "~1.7.0", + "tinyglobby": "~0.2.17" }, "bin": { - "markdownlint-cli2": "markdownlint-cli2-bin.mjs" + "markdownlint": "markdownlint.js" }, "engines": { "node": ">=22" - }, - "funding": { - "url": "https://github.com/sponsors/DavidAnson" } }, - "node_modules/markdownlint-cli2-formatter-default": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/markdownlint-cli2-formatter-default/-/markdownlint-cli2-formatter-default-0.0.6.tgz", - "integrity": "sha512-VVDGKsq9sgzu378swJ0fcHfSicUnMxnL8gnLm/Q4J/xsNJ4e5bA6lvAz7PCzIl0/No0lHyaWdqVD2jotxOSFMQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/DavidAnson" - }, - "peerDependencies": { - "markdownlint-cli2": ">=0.0.4" + "node_modules/markdownlint-cli/node_modules/commander": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-15.0.0.tgz", + "integrity": "sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg==", + "engines": { + "node": ">=22.12.0" } }, "node_modules/mdurl": { @@ -561,15 +420,6 @@ "integrity": "sha512-1+HBaOx0zi/dQWht8rNv9MYf9qqpqL/kxI0hXImU6Y547zM6Sni8BQibt7ifgMcYtQg41ao3Ivd6cnSM86inpg==", "license": "MIT" }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, "node_modules/micromark": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", @@ -1081,17 +931,26 @@ ], "license": "MIT" }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "license": "MIT", + "node_modules/minimatch": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" + "brace-expansion": "^5.0.8" }, "engines": { - "node": ">=8.6" + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/ms": { @@ -1119,18 +978,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/punycode.js": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", @@ -1140,69 +987,18 @@ "node": ">=6" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", + "node_modules/run-con": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/run-con/-/run-con-1.3.3.tgz", + "integrity": "sha512-Lb7OKM9aaykzyoNiHGhSVCjZsvbyy6qDMp2vDXL+MoCfz3GfNJtHYH7uYsU3QNMyInBk++xx+EZ8xZ8Sxs5fNQ==", "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", - "license": "MIT", - "engines": { - "node": ">=14.16" + "deep-extend": "^0.6.0", + "ini": "~7.0.0", + "minimist": "^1.2.8", + "strip-json-comments": "~3.1.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "run-con": "cli.js" } }, "node_modules/smol-toml": { @@ -1248,16 +1044,57 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "license": "MIT", + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", "dependencies": { - "is-number": "^7.0.0" + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", "engines": { - "node": ">=8.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/uc.micro": { @@ -1265,18 +1102,6 @@ "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", "license": "MIT" - }, - "node_modules/unicorn-magic": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.4.1.tgz", - "integrity": "sha512-lzlXPoVB0Uy/FvTaUgX39RbixYiSKoc3JSoSf01+0c2B6FR3qdYIPN7Qjo/AV7n6sqLCk0509cT3LRj1oSZ1+A==", - "license": "MIT", - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } } } } diff --git a/.github/linters/package.json b/.github/linters/package.json index 798fd9f3..b05270bf 100644 --- a/.github/linters/package.json +++ b/.github/linters/package.json @@ -4,7 +4,7 @@ "description": "Pinned linter dependencies for CI supply chain security", "private": true, "dependencies": { - "markdownlint-cli2": "0.23.3" + "markdownlint-cli": "0.49.1" }, "overrides": { "js-yaml": "4.3.2", diff --git a/.github/workflows/markdown-quality.yml b/.github/workflows/markdown-quality.yml index e2015984..000390ea 100644 --- a/.github/workflows/markdown-quality.yml +++ b/.github/workflows/markdown-quality.yml @@ -4,7 +4,8 @@ on: pull_request: paths: - '**/*.md' - - '.markdownlint-cli2.yaml' + - '.markdownlint.jsonc' + - '.markdownlintignore' - '.markdown-link-check.json' - '.github/linters/package*.json' push: @@ -12,7 +13,8 @@ on: - main paths: - '**/*.md' - - '.markdownlint-cli2.yaml' + - '.markdownlint.jsonc' + - '.markdownlintignore' - '.markdown-link-check.json' - '.github/linters/package*.json' @@ -46,31 +48,39 @@ jobs: npm ci npm audit --audit-level=high - # No glob arguments: file selection comes from .markdownlint-cli2.yaml, the - # same source the pre-commit hook and `npm run lint:md` read, so none of the - # three can select a different set. The version comes from - # .github/linters/package-lock.json (installed above), so there is no second - # version pin to drift. - # A markdownlint-cli2 run that matched no files still exits 0, so assert the - # file count is non-zero from the same output instead of running the linter - # a second time. + # File selection comes from the same command used by `npm run lint:md` and + # pre-commit, so none of the three can select a different set. The version + # comes from .github/linters/package-lock.json (installed above), so there + # is no second version pin to drift. + # + # --dot is required: markdownlint's globber skips dot-directories by + # default, which silently excluded .github/**/*.md (e.g. + # .github/pull_request_template.md) from every invocation. - name: Run markdownlint shell: bash run: | set -euo pipefail - output="$(mktemp)" - set +e - npx --prefix .github/linters markdownlint-cli2 2>&1 | tee "$output" - lint_rc=${PIPESTATUS[0]} - set -e + .github/linters/node_modules/.bin/markdownlint --config .markdownlint.jsonc --ignore-path .markdownlintignore --dot "**/*.md" - count=$(sed -n 's/^Linting: \([0-9]\{1,\}\) file.*/\1/p' "$output") - echo "markdownlint linted ${count:-0} file(s)" - if [ "$lint_rc" -ne 0 ]; then - exit "$lint_rc" - fi - if [ "${count:-0}" -lt 1 ]; then - echo "::error::markdownlint matched no files - check globs in .markdownlint-cli2.yaml" >&2 + # A markdownlint run that matched no files can still exit 0, so assert the + # repository has tracked markdown files after applying .markdownlintignore. + # + # The ignore set is evaluated by GIT's gitignore engine via --exclude-from, + # not by hand-translating .markdownlintignore into `:!` pathspecs. Those are + # different matchers: a bare `test/vendor` pathspec matches only that exact + # path, so a naive translation left vendored files in the count and the + # assertion drifted above the set markdownlint actually linted. Reusing the + # same gitignore semantics markdownlint applies keeps them in agreement. + - name: Assert markdownlint actually linted files + shell: bash + run: | + set -euo pipefail + total=$(git ls-files -- '*.md' | wc -l | tr -d ' ') + ignored=$(git ls-files -c -i --exclude-from=.markdownlintignore -- '*.md' | wc -l | tr -d ' ') + count=$((total - ignored)) + echo "markdownlint linted ${count} file(s) (${total} tracked, ${ignored} ignored)" + if [ "${count}" -lt 1 ]; then + echo "::error::markdownlint matched no files - check .markdownlintignore" >&2 exit 1 fi diff --git a/.markdownlint-cli2.yaml b/.markdownlint-cli2.yaml index 2f696137..c2138d11 100644 --- a/.markdownlint-cli2.yaml +++ b/.markdownlint-cli2.yaml @@ -1,5 +1,5 @@ -# markdownlint-cli2 configuration -# Aligned with playbook standards for consistency +# Legacy markdownlint-cli2 configuration kept temporarily for branch compatibility. +# Active linting uses .markdownlint.jsonc plus .markdownlintignore. # See: https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md config: @@ -42,28 +42,21 @@ config: # MD060 - Table column style spacing MD060: false -# Scan these files -# Scan these files. This is the SINGLE source of truth for file selection: both -# the pre-commit hook and markdown-quality.yml invoke markdownlint-cli2 with no -# glob arguments, so neither can select a different set. Previously CI passed -# "**/*.md" plus exclusions on the command line (49 files) while these globs -# alone selected 9, so the commit-time hook checked 18% of what CI checked. +# Legacy file selection retained only for consumers still invoking +# markdownlint-cli2 directly. Active file selection is the explicit +# markdownlint command in package.json, pre-commit, and markdown-quality.yml plus +# .markdownlintignore. globs: - "**/*.md" -# Ignore files +# Legacy ignore files. Keep this aligned with .markdownlintignore until this file +# is deleted. ignores: - "node_modules" - ".github/linters/node_modules" - "deleteme" - "tmp" - "CHANGELOG.md" - # Vendored, SHA-pinned bats submodules (ADR-0025) -- third-party markdown we do - # not own and must not lint to our rules. markdown-quality.yml checks out - # WITHOUT submodules so it never saw these, but pre-commit.yml uses - # `submodules: true` for the bats hook, so the pre-commit run WOULD: measured - # 21 vendored .md files producing 235 issues in 13 files. Excluding them here - # preserves the existing effective coverage rather than widening it. - "test/vendor" # Support YAML frontmatter diff --git a/.markdownlint.jsonc b/.markdownlint.jsonc new file mode 100644 index 00000000..8f349540 --- /dev/null +++ b/.markdownlint.jsonc @@ -0,0 +1,22 @@ +{ + "MD003": false, + "MD004": false, + "MD007": false, + "MD013": false, + "MD022": false, + "MD024": false, + "MD025": false, + "MD026": false, + "MD031": false, + "MD032": false, + "MD033": false, + "MD034": false, + "MD036": false, + "MD040": false, + "MD041": false, + "MD051": false, + "MD056": false, + "MD058": false, + "MD060": false, + "frontMatter": "^---\\s*$[\\s\\S]*?^---\\s*$" +} diff --git a/.markdownlintignore b/.markdownlintignore new file mode 100644 index 00000000..d1270c36 --- /dev/null +++ b/.markdownlintignore @@ -0,0 +1,6 @@ +CHANGELOG.md +node_modules +.github/linters/node_modules +deleteme +tmp +test/vendor diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 245f1e92..c49200d8 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -34,26 +34,26 @@ repos: # .github/linters/package.json (+ package-lock.json, which also carries the # transitive overrides and is what `npm audit` gates in markdown-quality.yml). # This hook delegates to that install instead of pinning a second time via a - # remote rev, so the two can never drift. Configuration AND file selection both - # come from .markdownlint-cli2.yaml. Mirrors agentic-coding-patterns#451. + # remote rev, so the two can never drift. Configuration and file exclusions + # come from .markdownlint.jsonc and .markdownlintignore. # # Unlike patterns/playbook, this repo runs `pre-commit run --all-files` in CI # (.github/workflows/pre-commit.yml), so the DEFAULT hook must not rewrite # files: `--fix` would mutate the checkout and CI would fail on "files were # modified by this hook" instead of reporting the lint error. The default id is # therefore check-only, and the fixing form is opt-in via - # `pre-commit run markdownlint-cli2-fix --hook-stage manual`. + # `pre-commit run markdownlint-fix --hook-stage manual`. - repo: local hooks: - - id: markdownlint-cli2 - name: markdownlint-cli2 (npm-pinned, check only) - entry: npx --prefix .github/linters markdownlint-cli2 + - id: markdownlint + name: markdownlint (npm-pinned, check only) + entry: bash -c 'npm ci --prefix .github/linters --prefer-offline --no-audit --no-fund >/dev/null && npm --prefix .github/linters exec -- markdownlint --config .markdownlint.jsonc --ignore-path .markdownlintignore --dot "**/*.md"' -- language: system types: [markdown] pass_filenames: false - - id: markdownlint-cli2-fix - name: markdownlint-cli2 (npm-pinned, --fix) - entry: npx --prefix .github/linters markdownlint-cli2 --fix + - id: markdownlint-fix + name: markdownlint (npm-pinned, --fix) + entry: bash -c 'npm ci --prefix .github/linters --prefer-offline --no-audit --no-fund >/dev/null && npm --prefix .github/linters exec -- markdownlint --config .markdownlint.jsonc --ignore-path .markdownlintignore --dot --fix "**/*.md"' -- language: system types: [markdown] pass_filenames: false diff --git a/package.json b/package.json index 49900c4a..afa50897 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "acq.backends/" ], "scripts": { - "lint:md": "npx --prefix .github/linters markdownlint-cli2", + "lint:md": ".github/linters/node_modules/.bin/markdownlint --config .markdownlint.jsonc --ignore-path .markdownlintignore --dot \"**/*.md\"", "lint:secrets": "pre-commit run gitleaks --all-files", "lint": "npm run lint:md", "check": "pre-commit run --all-files"