Skip to content

feat(aem-eds): add snowflake and da-content skills#154

Merged
catalan-adobe merged 10 commits into
mainfrom
feat/eds-snowflake-da-content
May 29, 2026
Merged

feat(aem-eds): add snowflake and da-content skills#154
catalan-adobe merged 10 commits into
mainfrom
feat/eds-snowflake-da-content

Conversation

@catalan-adobe
Copy link
Copy Markdown
Contributor

Summary

Imports two new skills into plugins/aem/edge-delivery-services from the upstream aemcoder/skills lab and wires them into the plugin's release machinery.

  • da-content (renamed from eds-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 by da-auth, generate-import-html, page-import, and snowflake.
  • 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 to page-import for 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 dense references/*.md files + empirical asset-boundary fixtures + release wiring (package.json, .releaserc.json)
  • skills/snowflake/ — 7-phase methodology (phases/0-prereq.md6-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 lists snowflake (consumes $DA_TOKEN) and da-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 to snowflake for DOM-preservation use cases
  • README.mdsnowflake added to Migrating Content; new Content & Platform Reference subsection lists da-content

Evals 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 HTML
  • snowflake-overlay-vs-page-import-selection/ — 7-item checklist on description-driven skill disambiguation given DOM-preservation vocabulary

Why two skills, this PR

snowflake cites da-content for the DA HTML and admin API rules — they ship as a pair. Importing them separately would land snowflake with broken cross-references.

Validation

  • npm run validate (skills-ref) passes on all 94 skills.
  • All new JSON parses clean.
  • All eds-da-content references inside snowflake updated to da-content (8 files).
  • All .hlx/.da-token.json paths in bash examples migrated to $DA_TOKEN (consumed from da-auth). References that document specific Adobe CLI tool behaviors (@adobe/aem-cli content clone, aem content) keep their factual .hlx/.da-token.json mentions, annotated with both paths for clarity.

Compatibility note

snowflake's Phase 0 installs an overlay substrate that replaces scripts/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 sharpened page-import description make this explicit so the skill picker chooses correctly.

Test plan

  • npm run validate — all 94 skills pass
  • JSON files parse clean (tile.json, both package.json, both .releaserc.json, both criteria.json)
  • No leftover eds-da-content references
  • No stray .hlx/.da-token.json paths in bash examples
  • Manual: run da-auth then snowflake against a sample static page to confirm end-to-end
  • Manual: confirm skill picker selects snowflake vs page-import correctly on the eval prompts

🤖 Generated with Claude Code

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>
@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 26, 2026

Tessl Skill Lint

⚠️ edge-delivery-services — 1 warning(s)
⚠ Skill 'code-review': SKILL.md is approximately 10315 tokens (recommended maximum: 5000). Consider moving detailed content to separate reference files.

Context Cost

Skills
  - analyze-and-plan: 120 front-loaded, 1.6k-4.4k on-demand tokens
  - create-site: 79 front-loaded, 2.7k on-demand tokens
  - da-content: 174 front-loaded, 3k-29.3k on-demand tokens
  - authoring-analysis: 52 front-loaded, 3.2k on-demand tokens
  - block-collection-and-party: 71 front-loaded, 4.8k on-demand tokens
  - block-inventory: 60 front-loaded, 2.2k on-demand tokens
  - building-blocks: 75 front-loaded, 2.3k-6.7k on-demand tokens
  - code-review: 60 front-loaded, 10.3k-13.1k on-demand tokens
  - content-driven-development: 74 front-loaded, 3.7k-8.6k on-demand tokens
  - content-modeling: 61 front-loaded, 2.4k-9.1k on-demand tokens
  - da-auth: 94 front-loaded, 1.2k on-demand tokens
  - docs-search: 75 front-loaded, 1.8k on-demand tokens
  - find-test-content: 52 front-loaded, 1.7k on-demand tokens
  - generate-import-html: 49 front-loaded, 2.3k-11k on-demand tokens
  - identify-page-structure: 59 front-loaded, 1.6k on-demand tokens
  - page-decomposition: 58 front-loaded, 2.1k on-demand tokens
  - page-import: 119 front-loaded, 1.8k on-demand tokens
  - preview-import: 46 front-loaded, 1.2k-4.9k on-demand tokens
  - scrape-webpage: 54 front-loaded, 1.3k-3.9k on-demand tokens
  - slicc-handoff: 111 front-loaded, 1.2k on-demand tokens
  - snowflake: 189 front-loaded, 2.8k-50.1k on-demand tokens
  - testing-blocks: 86 front-loaded, 2.5k-8.2k on-demand tokens
  - ue-component-model: 186 front-loaded, 2.4k-11.1k on-demand tokens

Total: 2k front-loaded, 60k-184.9k on-demand tokens

✔ Tile adobe/aem-edge-delivery-services@0.1.0 is valid

✅ All 1 tile(s) lint passed with 1 warning(s) total.

Updated by tessl-lint for commit 5bf00fb.

- 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>
@catalan-adobe
Copy link
Copy Markdown
Contributor Author

catalan-adobe commented May 26, 2026

Example of EDS page generated using this snowflake skill in Slicc:

@catalan-adobe catalan-adobe requested a review from paolomoz May 26, 2026 10:00
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>
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>
@catalan-adobe catalan-adobe merged commit 2dae80c into main May 29, 2026
9 checks passed
@catalan-adobe catalan-adobe deleted the feat/eds-snowflake-da-content branch May 29, 2026 06:39
@github-actions
Copy link
Copy Markdown

🎉 This PR is included in version 1.1.0 🎉

The release is available on:

Your semantic-release bot 📦🚀

@github-actions
Copy link
Copy Markdown

🎉 This PR is included in version 1.0.0 🎉

The release is available on:

Your semantic-release bot 📦🚀

@github-actions
Copy link
Copy Markdown

🎉 This PR is included in version 1.1.0 🎉

The release is available on:

Your semantic-release bot 📦🚀

@github-actions
Copy link
Copy Markdown

🎉 This PR is included in version 1.0.0 🎉

The release is available on:

Your semantic-release bot 📦🚀

@github-actions
Copy link
Copy Markdown

🎉 This PR is included in version 2.0.1 🎉

The release is available on:

Your semantic-release bot 📦🚀

@github-actions
Copy link
Copy Markdown

🎉 This PR is included in version 1.0.0 🎉

The release is available on:

Your semantic-release bot 📦🚀

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants