feat(aem-eds): add snowflake and da-content skills#154
Merged
Conversation
Imports two skills from aemcoder/skills and wires them into the plugin's release machinery. - da-content (renamed from source eds-da-content): reference for DA + EDS content rules — block HTML format, metadata, media handling, DA Source API contract, IMS auth, and the 11 silent-failure rules. Trimmed description from 922 → 709 chars and added a Related Skills section pointing at da-auth, generate-import-html, page-import, snowflake. - snowflake: static-to-EDS overlay conversion that preserves the original DOM byte-for-byte while making text and image content authorable in DA. Description leads with the DOM-preservation property and explicitly defers canonical block-rewrite migrations to page-import. All internal references updated from eds-da-content to da-content. SKILL_DIR resolution table rewritten for Claude Code plugin distribution. DA token reads now consume $DA_TOKEN (set by da-auth) with ~/.aem/da-token.json fallback. Cross-skill integration: - da-auth Related Skills now lists snowflake + da-content - page-import description disambiguates against snowflake; "Do NOT use" list points to snowflake for DOM-preservation use cases - tile.json registers both new skills - README.md adds a snowflake row to Migrating Content and a new Content & Platform Reference subsection for da-content - Each new skill ships package.json + .releaserc.json for semantic-release Evals: - da-content-block-html-generation: 10-item weighted checklist on silent-failure rule compliance when generating block HTML - snowflake-overlay-vs-page-import-selection: 7-item checklist on description-driven skill disambiguation given DOM-preservation vocabulary skills-ref validates all 94 skills in the repo. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Tessl Skill Lint
|
- Move snowflake/substrate/* → snowflake/assets/substrate/* and snowflake/install-substrate.mjs → snowflake/scripts/install-substrate.mjs so the bundle layout matches Tessl's expected spec dirs (references/, assets/, scripts/). Updates the installer's path resolution accordingly (SUBSTRATE_DIR derived via dirname(SCRIPT_DIR)). - Move da-content/fixtures/* → da-content/references/fixtures/* for the same reason. - Add explicit markdown links in snowflake/SKILL.md to phases/*.md, knowledge/*.md, HOST-NOTES.md, README.md, examples/README.md so Tessl's orphan check finds them all. da-content/SKILL.md links to references/fixtures/README.md. - Rename plugin's .tileignore → .tesslignore (legacy filename deprecated). Updates every path mention in SKILL.md, HOST-NOTES.md, README.md, phases/0-prereq.md to reflect the new layout. Smoke-tested the installer against a vanilla temp repo — substrate self-locates correctly. The remaining "code-review SKILL.md too large" warning is on a pre-existing skill not touched by this branch. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
After moving fixtures/ → references/fixtures/, the link to references/media.md needs to be ../media.md, not ../references/media.md. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Tessl deterministic validation rejects literal XML tags in the description field. Reword `<div class="…">` and `<table>` as "div-class" and "table" — the body of SKILL.md still uses the literal tags in code-fenced examples, where they belong. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
.claude/worktrees/issue-147 is session-local agent infrastructure and should not be tracked. Got picked up by an earlier git add. Untracking it from the index here. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Addresses Tessl review feedback (Content score 55% → targeting 90%+): - conciseness 1/3: SKILL.md was 333 lines of host adapter details, path resolution mechanics, config schemas, and directory conventions that belong in HOST-NOTES.md. Cut to 156 lines. - actionability 2/3: entry point had no copy-paste-ready commands. Added a Quick start section with the Phase 0 substrate-install invocation and the phase walk-through pattern. Moves to HOST-NOTES.md (in addition to what was already there): - "Resolving paths inside this bundle" — per-host SKILL_DIR mapping Removes from SKILL.md (was duplicative of HOST-NOTES.md or maintainer- only): - "How to invoke (host adapters)" section - "Bundle assets" file tree (now just prose in Quick start) - "The .snowflake/ directory convention" full section + JSON schema - "Host-portable constraints (for skill maintainers)" — already in HOST-NOTES.md - "Loading knowledge in each phase" — collapsed into a 3-line note on the seven-phases section Preserves all 14 markdown links (orphan check stays green). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Tessl review feedback after the trim: actionability stayed at 2/3 because the Quick start showed how to read phase files, not the actual conversion shape. Replaces it with a single compressed end-to-end example walking all seven phases with real bash commands (playwright-cli, curl to admin.da.live, curl to admin.hlx.page, git push to the snowflake-NNN branch). Also collapses "What this skill does NOT do" from 8 lines to 1. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Contributor
Author
|
Example of EDS page generated using this
|
Integrates upstream changes from the snowflake-demos test worktree. Adds a second conversion level alongside the original page-level (overlay) path. SKILL.md: - Two modes documented: page-level (overlay template + [data-slot] markers) and block-level (each section becomes an independent EDS block with its own decorate() + CSS). - New `level` parameter: auto | check | block | page. - auto: feasibility runs, recommendation surfaced, user confirms - check: feasibility scan only, stops before Phase 3 (batch scan) - block / page: explicit override, analysis runs as validation - Description updated to mention both modes; trigger terms expanded. - Version bump 1.0.0 → 1.1.0. phases/2-analyze.md: - Adds block-level feasibility assessment (5 checks per section: structure, CSS scope, content model, JS independence, visual independence). - decisions.json gains levelParam, conversionLevel, feasibility fields with per-section pass/fail tables. - Level-driven transition rules at the end (auto/check/block/page). knowledge/block-level-feasibility.md (new): - 301-line reference: the 5 checks in detail, hybrid option, source signals (BEM/section-scoped → block; Tailwind/utility-first → page), worked Frescopa example showing all 9 sections passing. phases/3-generate.md: - Adds a "Note on conversionLevel" callout explaining that this phase currently implements only the page-level path. block-level and hybrid are documented in SKILL.md and block-level-feasibility.md but Phase 3 generation for them is a future enhancement. Until then, fall back to page-level and surface a note to the user rather than silently producing wrong output. skills-ref validates clean. No XML tags in description. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The .claude/worktrees/issue-147 submodule entry keeps getting picked up because the directory exists on disk and the staged entry from earlier sessions never fully cleared. Untracking again. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
paolomoz
approved these changes
May 27, 2026
Replaces the "block-level is future work" placeholder added in the previous commit with the real two-branch Phase 3 implementation. phases/3-generate.md: - Branch by decisions.json.conversionLevel at the top (page-level | block-level | hybrid). - Page-level path: unchanged (preserves the existing overlay flow). - Block-level path: 9 concrete steps (B.1-B.9) covering global styles extraction, fonts in head.html, asset vendoring, header/ footer fragments, per-section content blocks (decorator pattern + section-scoped CSS), scripts.js modifications, drafts test page, DA-source body, self-checks. - Each branch sets state.conversionLevel; block-level records blockCount + fragmentCount. knowledge/block-level-conversion.md (new, 360 lines): - Comparison table: page-level vs block-level (main content, header/ footer, DA content, CSS, runtime, substrate). - Output layout for block-level (standard EDS paths, no output/ subfolder). - Global styles two-bucket split (boilerplate skeleton + source tokens + base typography + shared components vs per-block). - Header/footer fragment pattern, content model design, decorator pattern, hybrid conversion fallbacks. SKILL.md: - Reading order adds block-level-conversion.md after the feasibility reference. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
🎉 This PR is included in version 1.1.0 🎉 The release is available on:
Your semantic-release bot 📦🚀 |
|
🎉 This PR is included in version 1.0.0 🎉 The release is available on:
Your semantic-release bot 📦🚀 |
|
🎉 This PR is included in version 1.1.0 🎉 The release is available on:
Your semantic-release bot 📦🚀 |
|
🎉 This PR is included in version 1.0.0 🎉 The release is available on:
Your semantic-release bot 📦🚀 |
|
🎉 This PR is included in version 2.0.1 🎉 The release is available on:
Your semantic-release bot 📦🚀 |
|
🎉 This PR is included in version 1.0.0 🎉 The release is available on:
Your semantic-release bot 📦🚀 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Imports two new skills into
plugins/aem/edge-delivery-servicesfrom the upstreamaemcoder/skillslab and wires them into the plugin's release machinery.da-content(renamed fromeds-da-content) — reference for DA + EDS content rules: block HTML format, metadata, media handling, the DA Source API contract, IMS auth, and the 11 silent-failure rules. Used byda-auth,generate-import-html,page-import, andsnowflake.snowflake— static-to-EDS overlay conversion that preserves the original DOM byte-for-byte while making text and image content authorable in DA. Alternative path topage-importfor AI-generated/static pages where the user wants to keep the source design intact.What's in the diff
New skills (registered in
tile.json):skills/da-content/— SKILL.md + 3 densereferences/*.mdfiles + empirical asset-boundary fixtures + release wiring (package.json,.releaserc.json)skills/snowflake/— 7-phase methodology (phases/0-prereq.md…6-reflect.md), bundled knowledge (architecture, methodology, learnings, EDS pipeline mechanics), Node scripts (substrate installer, DA media upload, DOM equality check), and the overlay substrate (scripts/scripts.js, header/footer blocks, lifecycle CSS)Cross-skill integration (so the new skills don't sit on top of the existing ones):
skills/da-auth/SKILL.md— Related Skills now listssnowflake(consumes$DA_TOKEN) andda-content(the reference for what to do with it)skills/page-import/SKILL.md— description sharpened to lead with "canonical EDS block format"; "Do NOT use" list points tosnowflakefor DOM-preservation use casesREADME.md—snowflakeadded to Migrating Content; new Content & Platform Reference subsection listsda-contentEvals under
plugins/aem/edge-delivery-services/evals/:da-content-block-html-generation/— 10-item weighted checklist on silent-failure rule compliance when generating DA-uploadable block HTMLsnowflake-overlay-vs-page-import-selection/— 7-item checklist on description-driven skill disambiguation given DOM-preservation vocabularyWhy two skills, this PR
snowflakecitesda-contentfor the DA HTML and admin API rules — they ship as a pair. Importing them separately would landsnowflakewith broken cross-references.Validation
npm run validate(skills-ref) passes on all 94 skills.eds-da-contentreferences insidesnowflakeupdated toda-content(8 files)..hlx/.da-token.jsonpaths in bash examples migrated to$DA_TOKEN(consumed fromda-auth). References that document specific Adobe CLI tool behaviors (@adobe/aem-cli content clone,aem content) keep their factual.hlx/.da-token.jsonmentions, annotated with both paths for clarity.Compatibility note
snowflake's Phase 0 installs an overlay substrate that replacesscripts/scripts.js,styles/styles.css,head.html, and the header/footer blocks. This is intentional — the overlay pattern is mutually exclusive with the canonical block-rewrite path (page-import/building-blocks) on the same repo. The skill's "What this skill does NOT do" section and the sharpenedpage-importdescription make this explicit so the skill picker chooses correctly.Test plan
npm run validate— all 94 skills passtile.json, bothpackage.json, both.releaserc.json, bothcriteria.json)eds-da-contentreferences.hlx/.da-token.jsonpaths in bash examplesda-auththensnowflakeagainst a sample static page to confirm end-to-endsnowflakevspage-importcorrectly on the eval prompts🤖 Generated with Claude Code