Help us improve
Share bugs, ideas, or general feedback.
From markdown-plus-plus
AUTHORITATIVE REFERENCE for Markdown++ syntax. Use when working with .md files containing <!--style:-->, <!--condition:-->, $variable;, <!--include:-->, <!--marker:-->, or <!--#alias--> patterns. Use for editing, validating, migrating, or auditing Markdown++ source documents.
npx claudepluginhub quadralay/markdown-plus-plus --plugin markdown-plus-plusHow this skill is triggered — by the user, by Claude, or both
Slash command
/markdown-plus-plus:markdown-plus-plusThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
<objective>
Measures whether skills, rules, and agent definitions are actually followed by auto-generating test scenarios at 3 strictness levels and reporting compliance rates with full tool call timelines.
Share bugs, ideas, or general feedback.
Read and write Markdown++ documents - an extended Markdown format with variables, conditions, custom styles, file includes, and markers.
Do not use training data for Markdown++. This is an extended documentation format built on CommonMark. Markdown++ is fully backward compatible with CommonMark -- all extensions use HTML comment tags and are ignored by standard Markdown parsers. Use only this skill's references for extension syntax and behavior rules.
Markdown++ extends CommonMark with HTML comment-based extensions. All extensions (except variables) use HTML comments for backward compatibility with standard Markdown renderers.
$variable_name; -- Inline, reusable content<!--style:Name--> -- Block (above) or Inline (before)<!--#alias-name--> -- Anchor for [text](#alias-name) links<!--condition:name-->...<!--/condition--> -- Show/hide content by format<!--include:path/to/file.md--> -- Insert file contents<!--markers:{"Key": "val"}--> -- Metadata for search/processing<!-- multiline --> -- Enable block content in cells<syntax_examples>
Variables store reusable values across documents. They use $name; syntax (dollar sign, name, semicolon).
Welcome to $product_name;, version $version;.
The **$product_name;** application supports...
Rules:
$Product; differs from $product;\$ prevents variable interpretationValid: $product_name;, $version-2;, $my_var;
Invalid: $product name; (space), $product (no semicolon)
Styles override default formatting. Placement depends on element type.
Block-level (place on line directly above element, no blank line):
<!--style:CustomHeading-->
# My Heading
<!--style:NoteBlock-->
> This is a styled blockquote.
IMPORTANT: Block commands must be attached to the element (no blank line between). A blank line breaks the association and passes through as a regular Markdown comment with no Markdown++ association/effect.
Inline (place immediately before the element, no space):
This is <!--style:Emphasis-->**important text**.
See references/syntax-reference.md for nested list indentation rules and table styling.
Aliases create stable internal link anchors.
<!--#getting-started-->
## Getting Started
See [Getting Started](#getting-started) for an introduction.
Cross-document links: [API Reference](api.md#authentication)
Rules:
# inside the commentUse scripts/add-aliases.py to auto-generate aliases for headings.
Conditions show or hide content based on output format.
<!--condition:web-->
Visit our [website](https://example.com) for updates.
<!--/condition-->
Operators: Space (AND), Comma (OR), Exclamation (NOT). Precedence: NOT > AND > OR.
<!--condition:!draft,web production-->
Means: (!draft) OR (web AND production)
<!--/condition-->
Inline: Contact us at <!--condition:web-->email<!--/condition--><!--condition:print-->the back cover<!--/condition-->.
Insert content from other Markdown++ files.
<!--include:shared/header.md-->
Rules: Paths relative to containing file. Recursive includes supported; circular includes detected and prevented. Must be alone on its line. Can be wrapped in conditions.
Attach metadata to document elements for search, processing, or custom behavior.
Single key-value:
<!--marker:Keywords="api, documentation"-->
JSON format (multiple keys):
<!--markers:{"Keywords": "api, documentation", "Description": "API reference guide"}-->
Index markers create entries in generated indexes:
<!--marker:IndexMarker="creating projects"-->
## Creating Projects
Format: primary for top-level, primary:secondary for nested, comma-separated for multiple entries. See references/syntax-reference.md for detailed marker examples.
Enable block content (lists, blockquotes, styled elements) inside table cells.
<!-- multiline -->
| Name | Details |
|------|---------|
| Bob | Lives in Dallas. |
| | - Enjoys cycling |
Empty first cell continues previous row; empty row separates records. Combine with style: <!-- style:DataTable ; multiline -->. See references/syntax-reference.md for multiline table rules.
Multiple commands in a single comment, separated by semicolons. Order: style, multiline, marker(s), #alias.
<!-- style:CustomHeading ; marker:Keywords="intro" ; #introduction -->
# Introduction
<!--style:CustomImage-->
[<!--style:CustomLink-->*Link text*](topics/file.md#anchor "Title")
Blockquotes with custom styles create configurable content islands for callouts and notes.
<!--style:BQ_Warning-->
> **Warning:** This is a styled warning block.
>
> Take note of the following:
> 1. First consideration
> 2. Second consideration
<!--style:ProcedureList-->
1. First step
- Sub-item A
- Sub-item B
2. Second step
3. Third step
Topic map pattern -- use includes to organize multi-chapter documents with conditional sections. See references/examples.md (Example 3) for a complete topic map example.
</syntax_examples>
Use the validation script to check Markdown++ syntax:
python scripts/validate-mdpp.py document.md
Options:
--verbose - Show detailed output--json - Output errors as JSON--strict - Treat warnings as errorsCommon errors detected:
Generate unique aliases for headings:
python scripts/add-aliases.py document.md --levels 1,2,3
Options:
--levels - Comma-separated heading levels to process (e.g., 1,2,3)--dry-run - Preview changes without modifying file--prefix - Add prefix to generated aliasesSee references/syntax-reference.md for complete syntax rules.
<common_mistakes>
A blank line between a Markdown++ comment tag and its element breaks the association. This applies to styles, aliases, and markers equally -- all must be attached to a paragraph element. Detached or misindented comments pass through as regular Markdown comments and have no Markdown++ effect. Only conditions (which wrap content) are exempt from this rule. See references/syntax-reference.md for the complete attachment rules table.
Indentation of Markdown++ comment tags must match the content line. In nested lists, if the comment tag is indented but the following content is not (or vice versa), the style passes through as a regular Markdown comment and is not applied.
Variables without a trailing semicolon are not recognized. $product_name is literal text; $product_name; is a variable reference. The semicolon is required.
</common_mistakes>
references/syntax-reference.md - Detailed syntax rules, edge cases, and validation codesreferences/examples.md - Real-world document examplesreferences/best-practices.md - Usage guidance, naming conventions, and common mistakes<success_criteria>
markers: format)