Implement the three missing architectural components of the Output Rendering
Framework as specified in issue #917:
1. RendererRegistry (spec §27249-27350): Central registry for format
(MaterializationStrategy, ElementRenderer) pairs with register(),
resolve(), available_formats(), is_registered() methods and a
FormatRegistration model. Built-in formats pre-registered in
default_registry. Replaces hardcoded if/elif chains for format
resolution.
2. ElementRenderer Protocol (spec §26557-26654): Per-element render
methods (render_panel, render_table, render_tree, etc.) plus
serialize() and can_render(). Six concrete implementations:
PlainElementRenderer, ColorElementRenderer, TableElementRenderer,
RichElementRenderer, JsonElementRenderer, YamlElementRenderer.
Each format now has a paired (Strategy, Renderer).
3. TerminalCapabilities (spec §27264-27301): Extended from 4 fields to
all 11 spec-defined fields: width, height, supports_256_color,
supports_truecolor, supports_unicode, supports_alternate_screen,
no_color, plus renames supports_cursor → supports_cursor_movement,
term → term_program. Backward-compatible properties preserved.
Additional fixes:
- ColumnDef serialises column type as 'type' (not 'col_type') per spec
§26199, with alias for backward compatibility
- YAML output uses sort_keys=True per spec §27168
- Progress elements omitted from JSON/YAML per spec §26936
- MaterializationStrategy.bind(renderer, terminal_caps) method added
to protocol and all strategy implementations (SD-19 resolved)
- Updated SD documentation in __init__.py
ISSUES CLOSED: #917