markdown-code
v0.6.1
Published
Keep code examples in Markdown synchronized with actual source files
Maintainers
Readme
markdown-code
Stop copy-pasting code into documentation. Keep your markdown examples automatically synchronized with real source files.
The Problem
Your documentation has code examples, but they get outdated:
- You update your source code but forget to update the docs
- Code examples in README/docs become stale and misleading
- Copy-paste errors introduce bugs in documentation
- Code examples can't be validated, linted, or tested like real source code
- Maintaining multiple copies of the same code is painful
The Solution
markdown-code keeps your documentation in sync automatically:
- Single source of truth: Code examples come from real files
- Always accurate: Documentation updates when code changes
- Validated code: Snippets can be linted, type-checked, and tested like any source file
- Zero maintenance: Sync happens automatically in CI/CD
- Extract existing: Migrate current docs with one command
Example
Before: Manual copy-paste (gets outdated)
```js
function greet(name) {
return 'Hello ' + name; // Oops, code changed but docs didn't!
}
```After: Automatic sync from real files
```js snippet=src/utils/greet.js
function greet(name) {
return `Hello, ${name}! Welcome to our app.`; // Always current!
}
```Result: Your documentation stays accurate as your code evolves.
Installation
No installation required - use it directly:
npx markdown-code --help
npx markdown-code init --extractOr install once, then use the shorter md-code command:
npm install -g markdown-codeNow you can use the convenient md-code binary:
md-code --help
md-code init --extractNote: All examples in this README show both
npx markdown-codeandmd-codevariants.
How It Works
Snippet Syntax
Use the snippet= directive in your fenced code blocks:
```ts snippet=path/to/file.ts
// This content will be replaced
```
```ts snippet=path/to/file.ts#L10-L20
// This will include lines 10-20 only
```
```ts snippet=path/to/file.ts#L5
// This will include from line 5 to end of file
```Usage
markdown-code provides two powerful workflows for keeping your documentation in sync with your code:
- Extract from existing docs - Convert unmanaged code blocks into manageable snippets
- Reference source files - Keep documentation in sync with your actual codebase
Workflows
Workflow 1: Extract from Existing Documentation
Perfect for projects with existing markdown documentation that contains code blocks.
Use this when:
- You have markdown files with unmanaged code blocks
- You want to extract code examples into separate files
- You need to start managing existing documentation
How it works:
- Run
npx markdown-code check(ormd-code check) to discover manageable code blocks - Run
npx markdown-code init --extract(ormd-code init --extract) to extract them into snippet files - Your markdown is updated to reference the new snippet files
- Future changes to snippets automatically sync to documentation
Workflow 2: Reference Existing Source Files
Perfect for keeping documentation in sync with your actual project source code.
Use this when:
- You want documentation to reference your actual source files
- You need line-range extraction from existing code
- You want living documentation that stays current with code changes
How it works:
- Add snippet directives to reference source files with line ranges
- Run
npx markdown-code sync(ormd-code sync) to populate markdown with current source content - When source files change,
npx markdown-code check(ormd-code check) detects drift - Run
npx markdown-code sync(ormd-code sync) to update documentation with latest changes
Features
- Automatic Sync: Replace fenced code blocks with contents from real files
- Extract Mode: Create snippet files from existing code blocks in markdown
- Line Range Support: Extract specific line ranges using
#Lx-Lysyntax - Check Mode: Verify documentation is in sync without making changes
- Multi-language: Support for any programming language
- Configurable: Flexible configuration via
.markdown-coderc.json
Commands
| Command | Description | Example |
| ------------------------------------------------------------- | ---------------------------------------------- | -------------------------------------------------------------- |
| npx markdown-code / md-code | Update markdown with snippet content (default) | npx markdown-code or md-code |
| npx markdown-code sync / md-code sync | Same as above, explicit | npx markdown-code sync or md-code sync |
| npx markdown-code check / md-code check | Verify files are in sync (CI-friendly) | npx markdown-code check or md-code check |
| npx markdown-code init / md-code init | Create config and snippets directory | npx markdown-code init or md-code init |
| npx markdown-code extract / md-code extract | Extract code blocks to snippet files | npx markdown-code extract or md-code extract |
| npx markdown-code init --extract / md-code init --extract | Setup + extract in one step | npx markdown-code init --extract or md-code init --extract |
Global Options
| Option | Description | Example |
| ---------------------- | ------------------------------ | ------------------------------------------------------------------------------------------------------------------ |
| --config | Custom configuration file | npx markdown-code --config custom.json or md-code --config custom.json |
| --snippet-root | Override snippet directory | npx markdown-code --snippet-root ./src or md-code --snippet-root ./src |
| --markdown-glob | Override markdown file pattern | npx markdown-code --markdown-glob "docs/**/*.md" or md-code --markdown-glob "docs/**/*.md" |
| --exclude-glob | Override exclusion patterns | npx markdown-code --exclude-glob "node_modules/**,dist/**" or md-code --exclude-glob "node_modules/**,dist/**" |
| --include-extensions | Override file extensions | npx markdown-code --include-extensions .ts,.js,.py or md-code --include-extensions .ts,.js,.py |
Configuration
Create a .markdown-coderc.json file in your project root:
{
"snippetRoot": "./snippets",
"markdownGlob": "**/*.md",
"excludeGlob": [
"node_modules/**",
".git/**",
"dist/**",
"build/**",
"coverage/**",
".next/**",
".nuxt/**",
"out/**",
"target/**",
"vendor/**"
],
"includeExtensions": [
".ts",
".js",
".py",
".java",
".cpp",
".c",
".go",
".rs",
".php",
".rb",
".swift",
".kt"
]
}Configuration Options
| Option | Description | Default |
| --------------------- | ------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| snippetRoot | Base directory for resolving snippet paths | "." |
| markdownGlob | Glob pattern to find Markdown files | "**/*.md" |
| excludeGlob | Array of glob patterns to exclude from processing | Common build/dependency directories |
| includeExtensions | File extensions to consider for snippets and extraction | [".ts", ".js", ".tsx", ".jsx", ".py", ".rb", ".go", ".rs", ".java", ".cpp", ".c", ".cs", ".php", ".sh", ".bash", ".zsh", ".fish", ".json", ".yaml", ".yml", ".toml", ".xml", ".html", ".css", ".scss", ".less", ".sql", ".md", ".txt"] |
Contributing
See CONTRIBUTING.md for development setup and contribution guidelines.
License
MIT License - see the LICENSE file for details.
