🏗️ feat(kebab-app): external module — _external dir + frontmatter inject (fb-31)
Pure-fn helpers for the `_external/` workspace subdirectory:
- `ensure_external_dir(workspace_root)` — mkdir if absent
- `ensure_kebabignore_entry(workspace_root)` — append `_external/` line
to .kebabignore if missing (idempotent)
- `copy_to_external(ext_dir, bytes, ext)` — write to
`<ext_dir>/<blake3-12>.<ext>`, idempotent on same content
- `inject_frontmatter(body, title, source_uri?)` — prepend YAML block
with strict double-quote escaping; errors if body already starts
with `---`
- `yaml_quote(s)` — defensive escaping for agent-supplied strings
14 unit tests cover happy + idempotency + edge (CRLF frontmatter
detection, YAML escape).
ingest_file / ingest_stdin facades (Tasks 2-5) compose these.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>