From 7d515807ec8c6e97a60725f5f4347a83a3d501aa Mon Sep 17 00:00:00 2001 From: Victor Hargrave Date: Fri, 29 May 2026 11:45:47 +0200 Subject: [PATCH 1/4] feat(snowflake): add Milo substrate flavor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Snowflake's EDS substrate replaces head.html + scripts/scripts.js, which on a Milo repo rips out the Milo runtime that loads the live global-navigation + footer from gnav-source/footer-source metadata. The captured gnav then renders as a static, fully-expanded blob. Add a Milo flavor: - assets/substrate-milo/: minimal manifest + blocks/snowflake overlay block (reuses the EDS overlay logic as a Milo block) + VERSION. Installs ONLY the block; Milo keeps head.html/scripts.js/styles.css. - install-substrate.mjs: auto-detect Milo (milolibs/setLibs) or --milo/--flavor; stamp substrateFlavor in .snowflake/config.json. - phases 0/1/3/4: Milo deltas — skip header/footer fragment capture, preserve chrome metadata, emit a Milo DA page (metadata block + one snowflake block). Milo owns the chrome; the snowflake block draws the body from /templates/.html. Verified: real install leaves Milo files byte-identical; headless overlay-block test passes 10/10. Co-Authored-By: Claude Opus 4.8 --- .../assets/substrate-milo/MANIFEST.json | 50 +++++ .../snowflake/assets/substrate-milo/VERSION | 1 + .../blocks/snowflake/snowflake.css | 14 ++ .../blocks/snowflake/snowflake.js | 205 ++++++++++++++++++ .../skills/snowflake/phases/0-prereq.md | 24 ++ .../skills/snowflake/phases/1-capture.md | 24 ++ .../skills/snowflake/phases/3-generate.md | 54 +++++ .../skills/snowflake/phases/4-wire.md | 22 ++ .../snowflake/scripts/install-substrate.mjs | 36 ++- 9 files changed, 428 insertions(+), 2 deletions(-) create mode 100644 plugins/aem/edge-delivery-services/skills/snowflake/assets/substrate-milo/MANIFEST.json create mode 100644 plugins/aem/edge-delivery-services/skills/snowflake/assets/substrate-milo/VERSION create mode 100644 plugins/aem/edge-delivery-services/skills/snowflake/assets/substrate-milo/blocks/snowflake/snowflake.css create mode 100644 plugins/aem/edge-delivery-services/skills/snowflake/assets/substrate-milo/blocks/snowflake/snowflake.js diff --git a/plugins/aem/edge-delivery-services/skills/snowflake/assets/substrate-milo/MANIFEST.json b/plugins/aem/edge-delivery-services/skills/snowflake/assets/substrate-milo/MANIFEST.json new file mode 100644 index 00000000..eb3b88a2 --- /dev/null +++ b/plugins/aem/edge-delivery-services/skills/snowflake/assets/substrate-milo/MANIFEST.json @@ -0,0 +1,50 @@ +{ + "substrateVersion": "1.0.0-milo.1", + "flavor": "milo", + "_comment": "Milo-flavor substrate. Unlike the EDS flavor it does NOT replace head.html / scripts/scripts.js / styles/styles.css / header+footer blocks — that would rip out Milo's runtime, which is what loads the live global-navigation + footer from page metadata. It only ADDS a project-local overlay block (blocks/snowflake) that Milo loads from codeRoot. Chrome is owned by Milo; the body is drawn by the block from /templates/