v0.27.0
External data & hosted content. Two threads that together let the pipeline ingest real data from outside the content tree and run without a local filesystem. The first feeds charts and sortable tables from actual data files; the second consolidates the remaining ad-hoc fs seams into one injectable interface so a hosted renderer (the GitHub-app product) can build a tenant's repo straight from the API.
Changes
- ProjectFiles seam (SPEC-113) — a virtual project filesystem for hosted and in-browser builds.
- Consolidates the ad-hoc
node:fsseams at the pipeline edges into one injectable, synchronousProjectFilesinterface (read/list/existsover normalized POSIX project-root-relative keys, with containment as part of the contract). ShipsfsProjectFiles,memoryProjectFiles, andrecordingProjectFilesproviders via@refrakt-md/types/project-files. - Sandbox, snippet, expand, file-ref, fileRoots, and the plan scan now read through the provider instead of calling
node:fsdirectly. The previously-unguarded sandboxsrcdirectory join inherits containment, closing a path-traversal gap. loadContentFromTreeacceptsprojectFilesandgitTimestamps, and the newContentTree.fromContentMapassembles a page corpus from a normalized key→content map — so a complete site can build from a pure in-memoryMapwith zero filesystem access (the hosted-renderer path).- Every consumer keeps an
fsfallback, so self-hosted builds are unchanged; the only behavioural change is containment on previously-unguarded paths. - Docs: a new "Hosted & In-Memory Builds" guide covers the contract and the fetch-then-build materialization pattern.