FrontmatterExtractor
Phase-2a one-shot extractor (in-app-docs-decoupling §IM-3a).
Declared in src/libs/libhelpbuild/helpbuild/FrontmatterExtractor.hpp.
Detailed description
For every .md file under the input root, parses leading YAML frontmatter via libyaml, splits each key into the website: / in_app: / global: sub-map per BucketTable, writes a <page>.meta.yaml sidecar alongside the markdown, and rewrites the body back to <page>.md frontmatter-stripped (and with /static/ prefixes rewritten to /).
The Jinja authoring subset ({ \c }, # \c #) is preserved verbatim in the body — this is part of the spec contract.
Read-only by default. apply = true is required to write either sidecars or modified .md files; otherwise the run is a dry-run that surfaces what would change via the result counters and the unrecognised-keys CSV (if requested).
Idempotent: a second run over the migrated tree is a no-op (no leading fence to strip, no /static/ to rewrite).