pub fn detect_heading_level(text: &str) -> Option<u8>
Check if text starts with a heading marker using pulldown-cmark
This is more robust than string matching and handles edge cases correctly