aimevzulari's picture
Upload 19 files
bed5cc5 verified
"""
Cursor Rules Generator - MDC Formatter
This module handles the formatting of rules in MDC format.
"""
from typing import Dict, Any, Optional
class MDCFormatter:
"""Formatter for MDC (Markdown with Context) format."""
def format_to_mdc(
self,
rule_type: str,
content: str,
description: str,
parameters: Optional[Dict[str, Any]] = None
) -> str:
"""Format rule content to MDC format.
Args:
rule_type: The type of rule (Always, Auto Attached, Agent Requested, Manual)
content: The main content of the rule
description: A short description of the rule's purpose
parameters: Additional parameters for formatting
Returns:
str: The formatted rule in MDC format
"""
# Set default parameters if not provided
if parameters is None:
parameters = {}
# Extract parameters
globs = parameters.get('globs', '')
referenced_files = parameters.get('referenced_files', '')
# Create MDC format
mdc = '---\n'
mdc += f'description: {description}\n'
if rule_type == 'Auto Attached' and globs:
mdc += f'globs: {globs}\n'
if rule_type == 'Always':
mdc += 'alwaysApply: true\n'
else:
mdc += 'alwaysApply: false\n'
mdc += '---\n\n'
mdc += content + '\n'
# Add referenced files
if referenced_files:
mdc += '\n' + referenced_files
return mdc
def parse_mdc(self, mdc_content: str) -> Dict[str, Any]:
"""Parse MDC content into a structured format.
Args:
mdc_content: The MDC content to parse
Returns:
Dict[str, Any]: A dictionary containing the parsed MDC content
"""
result = {
'metadata': {},
'content': '',
'referenced_files': []
}
# Check if the content has metadata section
if mdc_content.startswith('---'):
# Split the content into metadata and body
parts = mdc_content.split('---', 2)
if len(parts) >= 3:
# Parse metadata
metadata_lines = parts[1].strip().split('\n')
for line in metadata_lines:
if ':' in line:
key, value = line.split(':', 1)
result['metadata'][key.strip()] = value.strip()
# Get content
content = parts[2].strip()
else:
# No proper metadata section, treat everything as content
content = mdc_content
else:
# No metadata section, treat everything as content
content = mdc_content
# Split content and referenced files
lines = content.split('\n')
content_lines = []
referenced_files = []
for line in lines:
if line.strip().startswith('@'):
referenced_files.append(line.strip())
else:
content_lines.append(line)
result['content'] = '\n'.join(content_lines).strip()
result['referenced_files'] = referenced_files
# Determine rule type
if result['metadata'].get('alwaysApply') == 'true':
result['rule_type'] = 'Always'
elif 'globs' in result['metadata']:
result['rule_type'] = 'Auto Attached'
else:
# Default to Manual if not specified
result['rule_type'] = 'Manual'
return result