diff --git a/.agents/skills/create-lab-guide/SKILL.md b/.agents/skills/create-lab-guide/SKILL.md index 047a5276d120..a1d559a026b5 100644 --- a/.agents/skills/create-lab-guide/SKILL.md +++ b/.agents/skills/create-lab-guide/SKILL.md @@ -108,9 +108,8 @@ Use contractions ("it's", "you're", "don't"). ## Step 5: Validate 1. Confirm frontmatter has `title`, `description`, `keywords`, and `params.tags` including `labs`. -2. Run `npx prettier --write ` to format. +2. Run `npx --no-install rumdl fmt ` to format. 3. Run `docker buildx bake lint vale` and fix any errors. 4. Re-read the file and verify: correct shortcode syntax, objectives match source content, modules match `labspace.yaml`, no vendored paths edited. Do not proceed to commit until validation passes. - diff --git a/.agents/skills/testcontainers-guides-migrator/SKILL.md b/.agents/skills/testcontainers-guides-migrator/SKILL.md index 2be7e74daad4..b934d1af4d7d 100644 --- a/.agents/skills/testcontainers-guides-migrator/SKILL.md +++ b/.agents/skills/testcontainers-guides-migrator/SKILL.md @@ -350,8 +350,8 @@ If any test fails, debug and fix the code in both the temporary project AND the **IMPORTANT**: Run ALL validation locally before committing. Vale checks run on CI and will block the PR if they fail — fixing after push wastes CI cycles and review time. -1. `npx prettier --write content/guides/testcontainers-{LANG}-{GUIDE_ID}/` -2. `npx prettier --write content/manuals/testcontainers.md` +1. `npx --no-install rumdl fmt content/guides/testcontainers-{LANG}-{GUIDE_ID}/` +2. `npx --no-install rumdl fmt content/manuals/testcontainers.md` 3. `docker buildx bake lint` — must pass with no errors 4. `docker buildx bake vale` — then check for errors in the new files: ```bash diff --git a/.agents/skills/write/SKILL.md b/.agents/skills/write/SKILL.md index 672a6ce0f43e..1b6879aa7d84 100644 --- a/.agents/skills/write/SKILL.md +++ b/.agents/skills/write/SKILL.md @@ -41,14 +41,14 @@ front matter. If any are missing from a file you touch, add them. ## 4. Validate -Prettier runs automatically after each edit via the PostToolUse hook. +rumdl runs automatically after each edit via the PostToolUse hook. Run lint manually after all edits are complete: ```bash scripts/lint.sh ``` -The lint script runs markdownlint and vale on only the files you pass it, +The lint script runs rumdl and Vale on only the files you pass it, so the output is scoped to your changes. Fix any errors it reports. ## 5. Self-review diff --git a/.agents/skills/write/scripts/post-edit.sh b/.agents/skills/write/scripts/post-edit.sh index d5cb809554f9..73ac30611824 100755 --- a/.agents/skills/write/scripts/post-edit.sh +++ b/.agents/skills/write/scripts/post-edit.sh @@ -1,6 +1,6 @@ #!/bin/bash # PostToolUse hook for Edit/Write in the write skill. -# Auto-formats Markdown files with prettier after each edit. +# Auto-formats Markdown files with rumdl after each edit. set -euo pipefail input=$(cat) @@ -9,4 +9,4 @@ file_path=$(echo "$input" | jq -r '.tool_input.file_path // empty') [ -z "$file_path" ] && exit 0 [[ "$file_path" != *.md ]] && exit 0 -npx prettier --write "$file_path" 2>/dev/null +npx --no-install rumdl fmt "$file_path" 2>/dev/null diff --git a/.github/agents/docs-scanner.yaml b/.github/agents/docs-scanner.yaml index 08731db9a610..88b660f64b4e 100644 --- a/.github/agents/docs-scanner.yaml +++ b/.github/agents/docs-scanner.yaml @@ -100,7 +100,7 @@ agents: - Broken or missing links → htmltest catches these; do not file - Time-relative words ("currently", "recently", "still", "yet", "new") with no broader context problem → Vale catches these - - Formatting or style problems → markdownlint/Vale catch these + - Formatting or style problems → rumdl/Vale catch these 4. Is this a legitimate product feature gate? "Limited Access", "Contact your Docker account team to request access", "available on paid plans", "coming soon for Business subscribers" are product decisions, not stale @@ -121,7 +121,7 @@ agents: - **Vague verification tasks** — "verify this diagram is up to date", "check these links are still valid" — if you cannot identify the specific problem from reading the file, don't file - - **Style and formatting** — Vale and markdownlint handle these + - **Style and formatting** — Vale and rumdl handle these - **Suspicions without evidence** — you must quote the specific wrong text ## Filing issues diff --git a/.github/labeler.yml b/.github/labeler.yml index 24fd85545405..d7a4a910758e 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -32,7 +32,7 @@ area/tests: - changed-files: - any-glob-to-any-file: - .htmltest.yml - - .markdownlint.json + - .rumdl.toml - .vale.ini - _vale/** - hack/test/* diff --git a/.markdownlint.json b/.markdownlint.json deleted file mode 100644 index eecf08fddf6b..000000000000 --- a/.markdownlint.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "default": false, - "blanks-around-headings": true, - "hr-style": true, - "heading-start-left": true, - "single-h1": true, - "no-trailing-punctuation": true, - "no-missing-space-atx": true, - "no-multiple-space-atx": true, - "no-missing-space-closed-atx": true, - "no-multiple-space-closed-atx": true, - "no-space-in-emphasis": true, - "no-space-in-code": true, - "no-space-in-links": true, - "no-empty-links": true, - "ol-prefix": { "style": "one_or_ordered" }, - "no-reversed-links": true, - "reference-links-images": { - "shortcut_syntax": false - }, - "fenced-code-language": true, - "table-pipe-style": true, - "table-column-count": true, - "descriptive-link-text": { "prohibited_texts": ["click here","here","link","more","learn more","find out more"]} -} diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 000000000000..de056073aff3 --- /dev/null +++ b/.prettierignore @@ -0,0 +1 @@ +**/*.md diff --git a/.rumdl.toml b/.rumdl.toml new file mode 100644 index 000000000000..9ad17f216170 --- /dev/null +++ b/.rumdl.toml @@ -0,0 +1,44 @@ +[global] +flavor = "hugo" +enable = [ + "MD011", + "MD018", + "MD019", + "MD020", + "MD021", + "MD022", + "MD023", + "MD025", + "MD026", + "MD029", + "MD035", + "MD037", + "MD038", + "MD039", + "MD040", + "MD042", + "MD052", + "MD055", + "MD056", + "MD059", +] +exclude = [ + "content/manuals/desktop/previous-versions/*.md", + "content/manuals/engine/release-notes/*.md", +] + +[MD029] +style = "one_or_ordered" + +[MD052] +shortcut-syntax = false + +[MD059] +prohibited-texts = [ + "click here", + "here", + "link", + "more", + "learn more", + "find out more", +] diff --git a/AGENTS.md b/AGENTS.md index 4280af7bf7e7..e28d4883b913 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -5,7 +5,7 @@ This site builds https://docs.docker.com/ using Hugo. ## Project structure -``` +```text content/ # Documentation source (Markdown + Hugo front matter) ├── manuals/ # Product docs (Engine, Desktop, Hub, etc.) ├── guides/ # Task-oriented guides @@ -119,7 +119,7 @@ Every content page under `content/` requires: - `title:` — page title - `description:` — short description for SEO/previews -- `keywords:` — list of search keywords (omitting this fails markdownlint) +- `keywords:` — list of search keywords Additional common fields: @@ -135,8 +135,9 @@ produces broken HTML — always check COMPONENTS.md for correct syntax. ## Commands ```sh -npx prettier --write # Format before committing -scripts/lint.sh ... # Lint specific files (markdownlint + vale) +npx --no-install rumdl fmt # Format Markdown before committing +npx prettier --write # Format non-Markdown files +scripts/lint.sh ... # Lint specific files (rumdl + Vale) docker buildx bake validate # Run all validation checks docker buildx bake lint # Markdown linting only docker buildx bake vale # Style guide checks only @@ -157,7 +158,7 @@ and `validate-vendor` targets run correctly in CI. ## Verification loop 1. Make changes -2. Format with prettier: `npx prettier --write ` +2. Format Markdown with rumdl: `npx --no-install rumdl fmt ` 3. Lint the changed files: `scripts/lint.sh ...` 4. Run a full build with `docker buildx bake` (optional for small changes) diff --git a/Dockerfile b/Dockerfile index 117b22f872d9..3e755934e319 100644 --- a/Dockerfile +++ b/Dockerfile @@ -61,12 +61,8 @@ RUN --mount=type=cache,target=/tmp/hugo_cache \ RUN ./hack/flatten-and-resolve.js public # lint lints markdown files -FROM ghcr.io/igorshubovych/markdownlint-cli:v0.45.0 AS lint -RUN --mount=type=bind,target=. \ - markdownlint \ - "content/**/*.md" \ - --ignore "content/manuals/engine/release-notes/*.md" \ - --ignore "content/manuals/desktop/previous-versions/*.md" +FROM ghcr.io/rvben/rumdl:0.2.49-alpine AS lint +RUN --mount=type=bind,target=. rumdl check content # test validates HTML output and checks for broken links FROM wjdp/htmltest:v${HTMLTEST_VERSION} AS test diff --git a/content/get-started/docker-concepts/the-basics/what-is-a-container.md b/content/get-started/docker-concepts/the-basics/what-is-a-container.md index 625e376b5e99..8279e3387e65 100644 --- a/content/get-started/docker-concepts/the-basics/what-is-a-container.md +++ b/content/get-started/docker-concepts/the-basics/what-is-a-container.md @@ -57,7 +57,7 @@ Use the following instructions to run a container. 2. Specify `welcome-to-docker` in the search input and then select the **Pull** button. - ![A screenshot of the Docker Desktop Dashboard showing the search result for welcome-to-docker Docker image ](images/search-the-docker-image.webp?border=true&w=1000&h=700) + ![A screenshot of the Docker Desktop Dashboard showing the search result for welcome-to-docker Docker image](images/search-the-docker-image.webp?border=true&w=1000&h=700) 3. Once the image is successfully pulled, select the **Run** button. diff --git a/content/guides/java.md b/content/guides/java.md index 32aae81be09d..b2958a107410 100644 --- a/content/guides/java.md +++ b/content/guides/java.md @@ -597,7 +597,7 @@ To start your debug session, select the **Run** menu and then **Debug _NameOfYou You should now see the connection in the logs of your Compose application. -![Compose log file ](images/java-compose-logs.webp) +![Compose log file](images/java-compose-logs.webp) You can now call the server endpoint. diff --git a/content/guides/localstack.md b/content/guides/localstack.md index 4f7a0995947e..15a55bd1c9a8 100644 --- a/content/guides/localstack.md +++ b/content/guides/localstack.md @@ -65,11 +65,11 @@ Launch a quick demo of LocalStack by using the following steps: This Compose file also includes specifications for a required Mongo database. You can verify the services are up and running by visiting the Docker Desktop Dashboard. - ![Diagram showing the LocalStack and Mongo container up and running on Docker Desktop ](./images/launch-localstack.webp) + ![Diagram showing the LocalStack and Mongo container up and running on Docker Desktop](./images/launch-localstack.webp) 3. Verify that LocalStack is up and running by selecting the container and checking the logs. - ![Diagram showing the logs of LocalStack container ](./images/localstack-logs.webp) + ![Diagram showing the logs of LocalStack container](./images/localstack-logs.webp) 4. Creating a Local Amazon S3 Bucket @@ -91,7 +91,7 @@ Launch a quick demo of LocalStack by using the following steps: You can verify if the S3 bucket gets created or not by selecting the LocalStack container on the Docker Desktop Dashboard and viewing the logs. The logs indicates that your LocalStack environment is configured correctly and you can now use the `mysamplebucket` for storing and retrieving objects. - ![Diagram showing the logs of LocalStack that highlights the S3 bucket being created successfully ](./images/localstack-s3put.webp) + ![Diagram showing the logs of LocalStack that highlights the S3 bucket being created successfully](./images/localstack-s3put.webp) ## Using LocalStack in development @@ -102,7 +102,7 @@ Now that you've familiarized yourself with LocalStack, it's time to see it in ac - MongoDB: A database to store all the to-do list data - LocalStack: Emulates the Amazon S3 service and stores and retrieve images. -![Diagram showing the tech stack of the sample todo-list application that includes LocalStack, frontend and backend services ](images/localstack-arch.webp) +![Diagram showing the tech stack of the sample todo-list application that includes LocalStack, frontend and backend services](images/localstack-arch.webp) ## Connecting to LocalStack from a non-containerized app diff --git a/content/guides/ruby.md b/content/guides/ruby.md index b8248fa632b4..dd0be6677306 100644 --- a/content/guides/ruby.md +++ b/content/guides/ruby.md @@ -506,12 +506,12 @@ $ docker exec -it docker-ruby-on-rails-web-1 rake db:migrate RAILS_ENV=test You will see a similar message like this: -`console +```console == 20240710193146 CreateWhales: migrating ===================================== -- create_table(:whales) -> 0.0126s == 20240710193146 CreateWhales: migrated (0.0127s) ============================ -` +``` Refresh in your browser and add the whales. diff --git a/content/guides/wiremock.md b/content/guides/wiremock.md index d6cc63eea425..394caf39f205 100644 --- a/content/guides/wiremock.md +++ b/content/guides/wiremock.md @@ -57,12 +57,12 @@ Launch a quick demo of WireMock by using the following steps: After a moment, the application will be up and running. - ![Diagram showing the WireMock container running on Docker Desktop ](./images/wiremock-using-docker.webp) + ![Diagram showing the WireMock container running on Docker Desktop](./images/wiremock-using-docker.webp) You can check the logs by selecting the `wiremock-node-docker` container: - ![Diagram showing the logs of WireMock container running on Docker Desktop ](./images/wiremock-logs-docker-desktop.webp) + ![Diagram showing the logs of WireMock container running on Docker Desktop](./images/wiremock-logs-docker-desktop.webp) 4. Test the Mock API. @@ -93,7 +93,7 @@ Now that you have tried WireMock, let’s use it in development and testing. In - External AccuWeather API: The real API from which live weather data is fetched. - WireMock: The mock server that simulates the API responses during testing. It runs as a Docker container. - ![Diagram showing the architecture of WireMock in development ](./images/wiremock-arch.webp) + ![Diagram showing the architecture of WireMock in development](./images/wiremock-arch.webp) - In development, the Node.js backend sends a request to WireMock instead of the actual AccuWeather API. - In production, it connects directly to the live AccuWeather API for real data. diff --git a/content/manuals/engine/swarm/how-swarm-mode-works/services.md b/content/manuals/engine/swarm/how-swarm-mode-works/services.md index 3536a2886794..9983832e6c63 100644 --- a/content/manuals/engine/swarm/how-swarm-mode-works/services.md +++ b/content/manuals/engine/swarm/how-swarm-mode-works/services.md @@ -32,7 +32,7 @@ For example, imagine you want to load balance between three instances of an HTTP listener. The diagram below shows an HTTP listener service with three replicas. Each of the three instances of the listener is a task in the swarm. -![ HTTP listener service with three replicas](../images/services-diagram.webp?w=550) +![HTTP listener service with three replicas](../images/services-diagram.webp?w=550) A container is an isolated process. In the Swarm mode model, each task invokes exactly one container. A task is analogous to a “slot” where the scheduler diff --git a/docs_engineer.yml b/docs_engineer.yml index 1d17737da912..e3105c574ada 100644 --- a/docs_engineer.yml +++ b/docs_engineer.yml @@ -122,7 +122,7 @@ agents: - Use the validate tool to verify your changes - Check specific targets: lint, vale, test, unused-media - - Fix markdownlint errors in content files + - Fix rumdl errors in content files - Fix htmltest errors (broken links, missing alt text) - Validate redirects with test-go-redirects diff --git a/hack/sbx-release-notes.py b/hack/sbx-release-notes.py index ade89ad17ddb..90f47218c3fa 100755 --- a/hack/sbx-release-notes.py +++ b/hack/sbx-release-notes.py @@ -135,7 +135,7 @@ def shift_headings(body: str) -> str: def normalize_body(body: str) -> str: - """Fix markdownlint issues in release body content: + """Fix Markdown lint issues in release body content: - Ensure a blank line follows each heading (MD022). - Add 'console' language tag to fenced code blocks that have none (MD040). Safe to run on content that already complies — no double blank lines are added.""" @@ -203,7 +203,7 @@ def main() -> None: generated = TEMPLATE.render(releases=releases) splice(file, generated) if shutil.which("npx"): - subprocess.run(["npx", "--no-install", "prettier", "--write", str(file)], check=False) + subprocess.run(["npx", "--no-install", "rumdl", "fmt", str(file)], check=False) print(f"Wrote {len(releases)} releases (latest {args.minor_releases} minor releases) to {file}") diff --git a/layouts/_shortcodes/file.html b/layouts/_shortcodes/file.html index 3df6a6cdb949..9e62391bc013 100644 --- a/layouts/_shortcodes/file.html +++ b/layouts/_shortcodes/file.html @@ -3,7 +3,7 @@ The body must be a fenced code block. The fence's info string is used as the syntax-highlighting language. Wrapping the body in a fence keeps - markdownlint and Vale happy (they treat fence content as code and skip + rumdl and Vale happy (they treat fence content as code and skip lint rules that would otherwise fire on `#` comment lines). Usage: diff --git a/package-lock.json b/package-lock.json index 7433b2f416f3..bd39c8b94840 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,10 +24,10 @@ "tailwindcss": "4.2.1" }, "devDependencies": { - "markdownlint": "0.40.0", "prettier": "3.8.1", "prettier-plugin-go-template": "0.0.15", - "prettier-plugin-tailwindcss": "0.7.2" + "prettier-plugin-tailwindcss": "0.7.2", + "rumdl": "0.2.49" } }, "node_modules/@alpinejs/collapse": { @@ -508,6 +508,118 @@ "url": "https://opencollective.com/parcel" } }, + "node_modules/@rumdl/cli-darwin-arm64": { + "version": "0.2.49", + "resolved": "https://registry.npmjs.org/@rumdl/cli-darwin-arm64/-/cli-darwin-arm64-0.2.49.tgz", + "integrity": "sha512-NuMdcOWyZRzzcgcWtGCxQkevvAbQ6h8Fs5utanWhrP9ncES1231ptj8jnD6LkBwZfG4D8sv2MwNfRzSm3b+sjw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@rumdl/cli-darwin-x64": { + "version": "0.2.49", + "resolved": "https://registry.npmjs.org/@rumdl/cli-darwin-x64/-/cli-darwin-x64-0.2.49.tgz", + "integrity": "sha512-KzX9tj29f2GxEigsU6YPRhJIuhm5IhI9l5r2GiKzFUG4TRRewVHv4ZuL6DpG8rdPg2bPEauEWv5tRroKUdogvQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@rumdl/cli-linux-arm64": { + "version": "0.2.49", + "resolved": "https://registry.npmjs.org/@rumdl/cli-linux-arm64/-/cli-linux-arm64-0.2.49.tgz", + "integrity": "sha512-HOmc3M//I0G2EVx8MxObVTT/gm2LXCMrIpEdbB+8y1kvzxNjg8j+gk7BZIrOVOBnXQaIo+KBdvXSx1999hVv/g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@rumdl/cli-linux-arm64-musl": { + "version": "0.2.49", + "resolved": "https://registry.npmjs.org/@rumdl/cli-linux-arm64-musl/-/cli-linux-arm64-musl-0.2.49.tgz", + "integrity": "sha512-bNKWWtkXVgqNUZRV7F3Bt/SKg1sNLopbVK4k2Cqr0rEVQz6wH5hG+conx2RsmUDUytcrf6g55DSufzcGObT1Qg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@rumdl/cli-linux-x64": { + "version": "0.2.49", + "resolved": "https://registry.npmjs.org/@rumdl/cli-linux-x64/-/cli-linux-x64-0.2.49.tgz", + "integrity": "sha512-1xr+rj5UwwYeAD3kfCM0ImX1AC3P+zums0J6xBENEqFv6Tgo5qbdkVw1RxtvTRzA5lt7Jw/A3WUwpteg58nlCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@rumdl/cli-linux-x64-musl": { + "version": "0.2.49", + "resolved": "https://registry.npmjs.org/@rumdl/cli-linux-x64-musl/-/cli-linux-x64-musl-0.2.49.tgz", + "integrity": "sha512-eBLx7p6/nGM9KS0iaYig4QmwyzrEw7Z+nCUYiGLGtFJ77Db2+FAFr4vjCPPrcV0WtlSjFFQKLhcwct998uTT3w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@rumdl/cli-win32-x64": { + "version": "0.2.49", + "resolved": "https://registry.npmjs.org/@rumdl/cli-win32-x64/-/cli-win32-x64-0.2.49.tgz", + "integrity": "sha512-P3VkUqmdBXNLp0JA+dfNKdt/POiqXeEdcHVObh0X/HEvUCJb3ZPW4G8+8OPJJTbEqH3aXMMiRbn6/eY+ONrkJQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@tailwindcss/cli": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/@tailwindcss/cli/-/cli-4.2.1.tgz", @@ -1061,48 +1173,17 @@ "@types/d3-selection": "*" } }, - "node_modules/@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/ms": "*" - } - }, "node_modules/@types/geojson": { "version": "7946.0.16", "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==" }, - "node_modules/@types/katex": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.7.tgz", - "integrity": "sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/trusted-types": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", "optional": true }, - "node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", - "dev": true, - "license": "MIT" - }, "node_modules/@upsetjs/venn.js": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@upsetjs/venn.js/-/venn.js-2.0.0.tgz", @@ -1136,19 +1217,6 @@ "@vue/reactivity": "~3.1.1" } }, - "node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, "node_modules/braces": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", @@ -1161,39 +1229,6 @@ "node": ">=8" } }, - "node_modules/character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-legacy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", - "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-reference-invalid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", - "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/commander": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", @@ -1693,38 +1728,6 @@ "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.21.tgz", "integrity": "sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==" }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decode-named-character-reference": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz", - "integrity": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "character-entities": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/delaunator": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.1.0.tgz", @@ -1733,16 +1736,6 @@ "robust-predicates": "^3.0.2" } }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/detect-libc": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", @@ -1755,20 +1748,6 @@ "node": ">=0.10" } }, - "node_modules/devlop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", - "dev": true, - "license": "MIT", - "dependencies": { - "dequal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/dompurify": { "version": "3.4.6", "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.6.tgz", @@ -1816,19 +1795,6 @@ "tabbable": "^5.3.3" } }, - "node_modules/get-east-asian-width": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz", - "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -1887,43 +1853,6 @@ "node": ">=12" } }, - "node_modules/is-alphabetical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", - "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-alphanumerical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", - "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-alphabetical": "^2.0.0", - "is-decimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-decimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", - "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "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", @@ -1945,17 +1874,6 @@ "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", - "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "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", @@ -2272,30 +2190,6 @@ "@jridgewell/sourcemap-codec": "^1.5.5" } }, - "node_modules/markdownlint": { - "version": "0.40.0", - "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.40.0.tgz", - "integrity": "sha512-UKybllYNheWac61Ia7T6fzuQNDZimFIpCg2w6hHjgV1Qu0w1TV0LlSgryUGzM0bkKQCBhy2FDhEELB73Kb0kAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "micromark": "4.0.2", - "micromark-core-commonmark": "2.0.3", - "micromark-extension-directive": "4.0.0", - "micromark-extension-gfm-autolink-literal": "2.1.0", - "micromark-extension-gfm-footnote": "2.1.0", - "micromark-extension-gfm-table": "2.1.1", - "micromark-extension-math": "3.1.0", - "micromark-util-types": "2.0.2", - "string-width": "8.1.0" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/DavidAnson" - } - }, "node_modules/marked": { "version": "17.0.4", "resolved": "https://registry.npmjs.org/marked/-/marked-17.0.4.tgz", @@ -2347,542 +2241,6 @@ "node": ">= 20" } }, - "node_modules/micromark": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", - "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-core-commonmark": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", - "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-destination": "^2.0.0", - "micromark-factory-label": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-title": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-html-tag-name": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-directive": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-4.0.0.tgz", - "integrity": "sha512-/C2nqVmXXmiseSSuCdItCMho7ybwwop6RrrRPk0KbOHW21JKoCldC+8rFOaundDoRBUWBnJJcxeA/Kvi34WQXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "parse-entities": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-autolink-literal": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", - "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", - "dev": true, - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-footnote": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", - "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", - "dev": true, - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-table": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", - "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", - "dev": true, - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-math": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-math/-/micromark-extension-math-3.1.0.tgz", - "integrity": "sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/katex": "^0.16.0", - "devlop": "^1.0.0", - "katex": "^0.16.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-factory-destination": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", - "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-label": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", - "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-space": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-title": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", - "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-whitespace": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", - "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-chunked": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", - "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-classify-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", - "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-combine-extensions": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", - "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-chunked": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-numeric-character-reference": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", - "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-encode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", - "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-html-tag-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", - "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-normalize-identifier": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", - "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-resolve-all": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", - "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-sanitize-uri": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", - "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-subtokenize": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", - "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", - "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", @@ -2905,13 +2263,6 @@ "node": ">=4" } }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, "node_modules/node-addon-api": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", @@ -2923,26 +2274,6 @@ "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.6.0.tgz", "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==" }, - "node_modules/parse-entities": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", - "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "character-entities-legacy": "^3.0.0", - "character-reference-invalid": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "is-alphanumerical": "^2.0.0", - "is-decimal": "^2.0.0", - "is-hexadecimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/path-data-parser": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/path-data-parser/-/path-data-parser-0.1.0.tgz", @@ -3120,6 +2451,27 @@ "points-on-path": "^0.2.1" } }, + "node_modules/rumdl": { + "version": "0.2.49", + "resolved": "https://registry.npmjs.org/rumdl/-/rumdl-0.2.49.tgz", + "integrity": "sha512-pV6Ks5jr/wu4s7rBCaY5HJek3ZhG7W2knznRAhiw8AFc1DGgyuceirdH5S0k3XpSc6Ee92Ex4fyRTrZsHMIyHA==", + "dev": true, + "bin": { + "rumdl": "bin/rumdl" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "@rumdl/cli-darwin-arm64": "0.2.49", + "@rumdl/cli-darwin-x64": "0.2.49", + "@rumdl/cli-linux-arm64": "0.2.49", + "@rumdl/cli-linux-arm64-musl": "0.2.49", + "@rumdl/cli-linux-x64": "0.2.49", + "@rumdl/cli-linux-x64-musl": "0.2.49", + "@rumdl/cli-win32-x64": "0.2.49" + } + }, "node_modules/rw": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", @@ -3139,39 +2491,6 @@ "node": ">=0.10.0" } }, - "node_modules/string-width": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.0.tgz", - "integrity": "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-east-asian-width": "^1.3.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.2.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/stylis": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.4.0.tgz", diff --git a/package.json b/package.json index cda468ef20a6..8cc4272493ba 100644 --- a/package.json +++ b/package.json @@ -29,9 +29,9 @@ "tailwindcss": "4.2.1" }, "devDependencies": { - "markdownlint": "0.40.0", "prettier": "3.8.1", "prettier-plugin-go-template": "0.0.15", - "prettier-plugin-tailwindcss": "0.7.2" + "prettier-plugin-tailwindcss": "0.7.2", + "rumdl": "0.2.49" } } diff --git a/scripts/lint.sh b/scripts/lint.sh index ab49f01be4e7..23a29bdd4742 100755 --- a/scripts/lint.sh +++ b/scripts/lint.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Run markdownlint and vale on specific files. +# Run rumdl and Vale on specific files. # Usage: scripts/lint.sh [file...] # # Scoped output — no repo-wide noise. For full repo validation, use: @@ -13,8 +13,8 @@ fi exit_code=0 -echo "=== markdownlint ===" -if ! npx markdownlint-cli "$@" 2>&1; then +echo "=== rumdl ===" +if ! npx --no-install rumdl check "$@" 2>&1; then exit_code=1 fi diff --git a/tech_writer.yml b/tech_writer.yml index b21bcd7b8902..6450a6903a3e 100644 --- a/tech_writer.yml +++ b/tech_writer.yml @@ -18,7 +18,7 @@ agents: - Content in content/ directory - Front matter required for all pages - Style guide enforced by Vale - - Markdown linting enforced by markdownlint + - Markdown linting enforced by rumdl URL structure: The /manuals prefix is removed from published URLs. So @@ -242,7 +242,7 @@ agents: You work on the Docker documentation repository (https://docs.docker.com/). Your role: - - Fix formatting (line wrapping, prettier) + - Fix Markdown formatting with rumdl - Remove AI-isms and style violations (per STYLE.md) - Ensure correct Hugo syntax (per COMPONENTS.md) - Validate and fix until checks pass @@ -254,7 +254,7 @@ agents: files) 2. Review diff for issues against STYLE.md and COMPONENTS.md 3. If issues found: Read file and fix them - 4. Run prettier: npx prettier --write + 4. Run rumdl: npx --no-install rumdl fmt 5. Run validate tool 6. Read .validation.log (first 2000 lines, use offset/limit if needed) 7. If validation passes: Report success @@ -269,7 +269,7 @@ agents: - Apply COMPONENTS.md: Correct syntax for shortcodes, front matter, callouts - Line wrapping: 80 characters - - Run prettier after editing + - Run rumdl after editing - Fix all local issues; identify upstream issues but don't block on them @@ -285,7 +285,7 @@ agents: - Validation passes (validate tool), OR - Only upstream issues remain (cannot be fixed locally) - - Properly formatted (80 char wrap, prettier run) + - Properly formatted (80 char wrap, rumdl run) - Compliant with STYLE.md and COMPONENTS.md @@ -303,7 +303,7 @@ agents: validate: cmd: "docker buildx bake validate > .validation.log 2>&1" description: | - Run documentation validation checks (markdownlint, HTML validation, link checking, structural checks) + Run documentation validation checks (rumdl, HTML validation, link checking, structural checks) Output written to .validation.log - read this file to see results Note: Vale (prose linting) runs separately in CI and is not included