Appendix D Repository and Module Map
This appendix records the exact repository and physical-module boundary used for this edition. It is intentionally narrower than an organization-wide project directory: every listed sibling has a pinned revision and a defined role in dependency, verification, examples, or consumption. All sibling trees were read-only during the book audit.
The revisions below are immutable edition pins, not a promise that every sibling’s branch head will remain there. For example, the local cna-template next branch advanced to 4d0a2c8a after this audit; this edition continues to cite and reason from 1d86681, which remains available in that repository.
D.1 Pinned repository set
| Repository | Pin | Role in this edition |
|---|---|---|
| cna | 1bb2145d | Primary C++23 XNA-style framework at v0.1.0-alpha.1; source, build, renderer, platform and verification subject of the book. |
| sharp-runtime | f827a6c5 | .NET-shaped C++ foundation consumed by CNA; object/type, collections, IO, threading/task and compatibility evidence. |
| easy-gl | 0b46d35 | Shared implementation beneath five public EasyGL renderer identities; owns portable GL objects and draw machinery. |
| meta-gl | 571d3a6 | Lower-level typed OpenGL wrapper consumed by easy-gl; not a separate CNA renderer identity. |
| free-direct | 934f72f | SDL3-based DirectDraw/DirectSound/DirectPlay compatibility layer used by CNA’s FREEDIRECT renderer and the Blupi case study. |
| free-api | 53d7a31 | Minimal Win32-style support layer consumed by free-direct; a second-level dependency, not a direct CNA module. |
| xna4-spec | 8f61207 | Converted XNA documentation corpus: 544 indexed XML type files across 19 documented namespaces; useful inventory, not a live CNA gate. |
| cna-samples | 149a19f | Official-sample translation catalog: 63 completed ports, 23 tracked placeholders, and 67 explicitly ignored source-archive entries at the pin. |
| cna-examples | fa0b49a | One CNA-native catalog application with 13 areas, 79 categories, and 249 mechanically checked demo screens. |
| cna-template | 1d86681 | Minimal consumer skeleton; evidence for how a new application composes the framework rather than for framework correctness. |
| cna-craft | 7d7f186 | Larger game consumer with desktop/Web pressure; useful integration evidence, not part of CNA’s own test suite. |
| cna-extended | 2ff3cff | Extension-library consumer modeled after MonoGame.Extended; outside the core API but relevant to package/composition boundaries. |
The CNA tag also records sharp-runtime 625476d5b5fff5fa89f392c3c9af8638ff237692 as the revision used for release verification. That is release evidence, not a dependency lock: CNA’s CMake consumes a caller- supplied SHARP_RUNTIME_ROOT and does not enforce the recorded SHA. The older f827a6c5 pin in the table is retained as this book’s bounded sharp-runtime technical audit source; alpha.1 claims that depend on sharp-runtime were checked against the release record separately.
The dependency arrows are not all equivalent:
cna ---> sharp-runtime |----> easy-gl ---> meta-gl (selected GL family) ‘----> free-direct ---> free-api (selected FREEDIRECT family) xna4-spec, cna-samples, cna-examples evidence/catalog peers cna-template, cna-craft, cna-extended downstream consumers
Renderer-specific third parties fetched or discovered by CNA are not promoted to sibling repositories in this diagram. They remain dependencies of their owning renderer module, with their platform and acquisition gates recorded in Part IV.
D.2 Physical CNA framework modules
The root modules/CMakeLists.txt composes fifteen framework/extension modules when Net is enabled, plus the renderer tree; the experimental C adapter is a separate optional module. Directory location is source ownership: production code belongs under the owner’s src/, public and public-internal contracts under its include/, and its tests/examples alongside them. A configure-time validator rejects translation units outside a declared module tree.
| Physical module | Primary ownership |
|---|---|
| core | CNA helper/marker surface and root framework primitives |
| math | vectors, matrices, geometry, curves and packed math values |
| platform | host/window/event abstraction and the selected SDL3, SDL2, headless or POSIX-terminal implementation |
| graphics | device facade, resources, effects, model runtime and shared renderer contract |
| input | keyboard, mouse, gamepad, touch and SDL input extensions |
| audio | SoundEffect/XACT-facing audio objects and SDL3_mixer integration |
| media | Song/MediaPlayer/Video and FFmpeg-conditioned paths |
| content | ContentManager, XNB, CNJ, loose readers and glTF import core |
| storage | StorageDevice/StorageContainer and local-filesystem behavior |
| runtime | Game, GameWindow, components, services and timing/lifecycle composition |
| devices | Microsoft/XNA-shaped device and sensor surface |
| devices-ext | CNA-native camera/dialog/system/clipboard-style host services |
| graphics-ext | CNA graphics extensions, including the former extension-layer library |
| gamer-services | local gamer identity, guide, achievements and leaderboards; conditional on networking enablement |
| net | sessions, gamers, packets and ENet-backed delivery/discovery; conditional |
| c-api | optional C17 shared-library adapter over the C++ aggregate; separate experimental ABI, enabled by CNA_BUILD_C_API |
The interface target CNA composes the framework modules, extension umbrellas, shared build flags, sharp-runtime closure, and the selected renderer target set. In a singular build the set has one family; CNA_GRAPHICS_RENDERERS can compose several compatible families and a configured default. Individual module aliases support narrower link-closure probes. CNA::CnaExt composes graphics-ext and devices-ext; it is distinct from the empty CNAEXT declaration marker and from the CNA_CNAEXT build option that enables selected extension products.
D.3 Renderer module tree
modules/renderers/ contains one common-contract area plus 46 implementation families. Only EasyGL maps multiple public identities to one family.
| Cluster | Physical family directories |
|---|---|
| OpenGL | easygl, opengles1, opengl1, opengl2, opengl4, portablegl, tinygl |
| Native modern | vulkan, webgpu, sdl-gpu, metal |
| Abstraction layers | bgfx, magnum, llgl, diligent, sokol, wicked, fna3d, igl |
| DirectX / retro | directx1, directx2, directx3, directx5, directx6, directx7, directx8, directx9, directx10, directx11, directx12, glide, freedirect |
| 2D / vector / Windows | sdl-renderer, skia, blend2d, openvg, nanovg, direct2d, gdi |
| Web DOM | canvas, html-dom, svg-dom, pixijs |
| Diagnostic / CPU | headless, software, stub |
The physical tree alone does not establish a public selector, platform admissibility, resource factory, or semantic parity. Appendix B joins directory families to all 50 public identities and their narrow implementation behavior.
D.4 How to extend this map without making it stale
For a later edition, pin every repository before counting it; derive module and renderer sets from CMake/source rather than an organization README; distinguish direct dependency, transitive dependency, evidence peer and downstream consumer; and record the command/query behind every count. A local worktree of cna is not a sibling project, and an organization repository with no dependency or evidence edge is outside this bounded map.