handson-md-link-checker
Version:
高性能並列処理マークダウンリンクチェッカー - Markdown文書内の壊れたリンク(404/410エラー)を検出
209 lines (165 loc) • 6.93 kB
Markdown
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with the handson-md-link-checker npm package.
## Overview
handson-md-link-checker is a sophisticated npm package designed to detect broken links (404/410 errors) in markdown documentation. The system is optimized for accuracy, avoiding false positives from placeholder URLs, access restrictions, and temporary network issues.
## Key Files
### Core Scripts
- `check-links.js` - Main link checker class with Worker Threads support
- `link-checker-worker.js` - Worker thread implementation for parallel processing
- `cli.js` - Command-line interface entry point
- `index.js` - Programmatic API entry point
### Execution Methods
```bash
# CLI usage (after npm install -g handson-md-link-checker)
md-link-checker [directory] # Check directory or file
md-link-checker ./docs # Check docs folder
md-link-checker --help # Show help
# npx usage (one-time execution)
npx handson-md-link-checker ./docs
# Programmatic usage
const LinkChecker = require('handson-md-link-checker');
const checker = new LinkChecker();
await checker.run('./docs');
```
## Architecture
### High-Performance Design
- **Worker Threads**: Uses multiple workers for parallel processing (up to 8 workers)
- **Batch Processing**: Processes 20 URLs concurrently per worker
- **Smart Scaling**: Automatically switches between single-thread and multi-thread based on URL count
- **Retry Logic**: Up to 3 attempts per URL with exponential backoff
- **Connection Pooling**: Optimized HTTP connections for better performance
### URL Extraction Patterns
The system detects URLs from multiple formats:
1. **Markdown Links**: `[text](url)`
2. **Broken Markdown**: `[text](url](url)` - common writing mistakes
3. **HTML Images**: `<img src="url">`
4. **HTML Anchors**: `<a href="url">`
5. **Direct URLs**: `https://example.com`
### Advanced URL Cleaning
Removes various contaminations:
- HTML tag remnants: `url"><img` → `url`
- Markdown size specifications: `url =200x` → `url`
- Image titles: `url "screenshot"` → `url`
- Broken markdown syntax: `url](other` → `url`
- Quotes, backticks, and trailing punctuation
### Strict Error Detection
**Only reports actual broken links:**
- ✅ `404 Not Found` - Page doesn't exist
- ✅ `410 Gone` - Page permanently removed
- ✅ `DNS_ERROR` - Domain doesn't exist
- ✅ `CONNECTION_REFUSED` - Server down
**Ignores temporary/access issues:**
- ❌ `403 Forbidden` - Access restricted but link valid
- ❌ `405 Method Not Allowed` - HEAD request blocked
- ❌ `429 Too Many Requests` - Rate limiting
- ❌ `503 Service Unavailable` - Temporary downtime
- ❌ Timeout/network errors - Temporary issues
### Comprehensive Exclusion Patterns
Automatically skips placeholder/sample URLs:
```javascript
// Japanese placeholders
/GitHubユーザー名/, /ユーザー名\.github\.io/, /<ココ>/
// English placeholders
/xxxx\.github\.io/, /hoge\.com/, /APP_PATH/
// Service placeholders
/hook\.us1\.make\.com\/xxxxx/, /your-[\w-]+/
// General patterns
/example\.com/, /localhost/, /\{.*\}/
```
## Output and Reporting
### Console Output
- Real-time progress indicators
- Retry attempts logging
- Final summary with broken link count
### JSON Report (`link-check-report.json`)
```json
{
"timestamp": "2025-08-07T10:14:14.457Z",
"totalBrokenLinks": 32,
"brokenLinks": [
{
"url": "https://example.com/broken-page",
"status": 404,
"file": "articles/example.md",
"line": 26
}
]
}
```
## Performance Characteristics
### Optimized for Large Repositories
- **1000+ URLs**: ~30-45 seconds execution time
- **Memory efficient**: Worker threads with controlled batch sizes
- **Network friendly**: Rate limiting and retry logic
- **CI/CD optimized**: Minimal resource usage
### Scalability Features
- Automatic worker count based on CPU cores (max 8)
- Dynamic batch sizing based on dataset size
- Progress reporting for long-running checks
- Artifact generation for CI systems
## GitHub Actions Integration
### Automated Scheduling
```yaml
schedule:
- cron: '0 0 */3 * *' # Every 3 days at 9 AM JST
```
### Smart Issue Management
- Creates GitHub Issues for broken links
- Groups results by file for readability
- Updates existing issues instead of creating duplicates
- Adds `broken-links` and `maintenance` labels
### Workflow Features
- Runs on push/PR for immediate feedback
- Uploads reports as artifacts (30-day retention)
- Comments on PRs with broken link details
- Supports manual execution via `workflow_dispatch`
## Common Use Cases
### Development Workflow
```bash
# Before committing changes
md-link-checker ./docs
# Check specific file
md-link-checker ./path/to/file.md
# Using npx for one-time check
npx handson-md-link-checker ./docs
# Programmatic usage
node -e "const LinkChecker = require('handson-md-link-checker'); new LinkChecker().run('./docs')"
```
### Troubleshooting False Positives
1. **Add to exclusion patterns** in both `check-links.js` and `link-checker-worker.js`
2. **Check URL cleaning logic** - may need regex adjustment
3. **Verify extraction patterns** - ensure proper URL detection
### Performance Tuning
- **Increase batch size** for faster processing (risk: network errors)
- **Reduce worker count** for limited resources
- **Adjust retry count** for unreliable networks
- **Modify timeout** for slow websites
## Error Handling
### Graceful Degradation
- Worker failures don't crash entire process
- Network errors trigger automatic retries
- Malformed URLs are safely cleaned or skipped
- Progress continues even with individual failures
### Debugging Features
- Detailed console logging with timestamps
- Worker thread status reporting
- Batch processing progress indicators
- Error categorization in reports
## Maintenance Notes
### Regular Updates Needed
- **Exclusion patterns**: Add new placeholder patterns as they appear
- **Timeout values**: Adjust based on network conditions
- **Batch sizes**: Optimize based on performance testing
- **Worker counts**: Scale with infrastructure changes
### Code Organization
- **Main logic**: `check-links.js` (LinkChecker class + coordination)
- **Worker logic**: `link-checker-worker.js` (parallel processing)
- **CLI interface**: `cli.js` (command-line entry point)
- **Programmatic API**: `index.js` (npm package exports)
- **Configuration**: Exclusion patterns and settings in constructors
### Package Structure
- **npm package**: `handson-md-link-checker`
- **CLI command**: `md-link-checker`
- **GitHub repository**: https://github.com/n0bisuke/linkchecker
- **npm registry**: https://www.npmjs.com/package/handson-md-link-checker
This system prioritizes accuracy over speed, ensuring that only genuine maintenance issues are reported while avoiding noise from temporary problems or documentation placeholders.