v0.7.0
New facts
- Markdown extractor — markdown.first_heading and deduped markdown.github_repos[]
- file.basename / file.stem emitted whenever a path is supplied
- Wheel outer-filename parsing: whl.filename.{name_prefix,version,build,python_tag,abi_tag,platform_tag} from the PEP 427 basename
- PDB derived names — pe.debug.pdb.basename and pe.debug.pdb.stem
Hardening
- Tree-sitter scanner audit. Per-grammar ScannerAudit table re-verified against locked crate sources;
- Python now models the actual combined delimiter + indent byte
- Mach-O fat-binary panic fix — misclassified CAFEBABE Java .class no longer slices OOB on bogus arch.offset.
- Mach-O code-signature caps — Requirement-expression depth 32, plist depth 64, entitlement XML 1 MiB.
- CHM bounds arithmetic — directory / namelist / system walks converted to checked_add / checked_mul.
- bytes_at::{u16,u32,u64}_{le,be} helpers replace unchecked try_into().unwrap() reads.
- CLI — --help / --version no longer process::exit; readdir errors surface per-entry
Breaking API
- unsafe_code = "deny" (was warn).
- FileId fields private — use file_type(), source(), extension_mismatch(). #[non_exhaustive].
- ParseError.kind/.stage are now ErrorKind / Stage enums (JSON wire form unchanged).
- ArchiveMember regrouped into ArchiveCompression / ArchiveOwnership / ArchiveOffsets sub-structs.
- VBA sentinel flattened to filefacts::VBA_NON_LITERAL_SENTINEL; rizin module no longer a re-export façade.
- ParsedFile is #[must_use]; ParsedFile::strings() renamed to text().
- Sections::from_iter_sections removed in favour of standard FromIterator.