content-driven-development
adobe/skills
Content-first workflow for AEM Edge Delivery Services development—design content models before writing code.
What is content-driven-development?
Content Driven Development (CDD) is a workflow for AEM Edge Delivery Services that prioritizes identifying or creating real test content before writing code. Use it for any block creation, modification, CSS styling, bug fixes, or JavaScript/CSS work that affects how authors create content.
- Orchestrates a structured 8-step workflow: dev server setup, analysis & planning, content model design, test content creation, implementation, linting & testing, validation, and deployment
- Guides you to design author-friendly content models before coding, ensuring code is built against real content
- Provides task-specific analysis and acceptance criteria definition via the analyze-and-plan skill
- Helps design table-based content structures validated against best practices via the content-modeling skill
- Supports multiple test content strategies: CMS-authored content, local HTML files, or existing block content discovery
How to install content-driven-development
npx skills add https://github.com/adobe/skills --skill content-driven-development- AEM CLI installed globally (npm install -g @adobe/aem-cli) or npx available
- Local AEM project repository cloned and configured
- Port 3000 available for dev server
- Access to CMS (Google Drive, SharePoint, Document Authoring, or Universal Editor) for creating test content
How to use content-driven-development
- 1.Create a todo list with the 8 CDD workflow tasks using TodoWrite tool
- 2.Start the dev server with 'aem up --no-open --forward-browser-logs' and verify it returns HTTP 200 at localhost:3000
- 3.Invoke the analyze-and-plan skill with your task description and any design files or reference URLs
- 4.Invoke the content-modeling skill to design the table structure and content model for your block
- 5.Identify or create test content: use existing content URLs, ask the user to author in their CMS, or create temporary local HTML files in drafts/tmp/
- 6.Implement your code changes (blocks, CSS, JavaScript) against the test content
- 7.Run linting and tests to ensure all checks pass
- 8.Perform final validation against acceptance criteria, then create a PR with preview link
Use cases
- Creating a new block for AEM EDS with a defined content model and test scenarios
- Modifying an existing block's structure or functionality while validating against real author content
- Fixing bugs in block decoration or core functionality (scripts.js, styles.js) with comprehensive test coverage
- Styling changes to blocks that require validation across multiple viewports and content variants
- Building CSS or JavaScript features that affect how content authors structure or input data
- AEM Edge Delivery Services (EDS/Franklin/Helix) developers
- Full-stack developers building custom blocks for AEM
- Frontend engineers implementing author-friendly content models
- Teams adopting content-first development practices
content-driven-development FAQ
Do not use CDD for documentation-only changes or configuration changes that do not affect how authors create or structure content.
For new blocks, ask the user to create content in their CMS using the content model from Step 3, or create temporary local HTML files in drafts/tmp/ following the html-structure.md reference. User must create CMS content before the PR.
Invoke the find-test-content skill with the block name and dev server URL. It will search for and report all existing content pages containing that block with variant information.
Yes, for temporary testing. Create files in drafts/tmp/{block-name}.plain.html, restart the dev server with --html-folder drafts, and validate at localhost:3000/drafts/tmp/{block-name}. However, user must create CMS content before the PR is merged.
It guides you through task-specific analysis, helps define acceptance criteria, and optionally analyzes visual designs or mockups you provide. It documents the analysis for reference throughout development.
Full instructions (SKILL.md)
Source of truth, from adobe/skills.
name: content-driven-development description: Use this when making any AEM Edge Delivery Services (EDS, Franklin, Helix) code change — new blocks, block modifications, CSS styling, bug fixes, core functionality (scripts.js, styles, delayed.js), or any JavaScript/CSS work that needs validation. Covers the Content Driven Development process — identifying or creating real test content before writing code, designing an author-friendly content model, and validating against that content throughout development. Do not use for documentation-only changes or configuration changes that do not affect authoring. license: Apache-2.0 metadata: version: "2.0.1"
Content Driven Development (CDD)
Orchestrate the Content Driven Development workflow for AEM Edge Delivery Services. This workflow ensures code is built against real content with author-friendly content models.
CRITICAL: Never start writing or modifying code without first identifying or creating the content you will use to test your changes.
When to Use This Skill
Use CDD for ALL AEM development tasks:
- ✅ Creating new blocks
- ✅ Modifying existing blocks (structural or functional changes)
- ✅ Changes to core decoration functionality
- ✅ Bug fixes that require validation
- ✅ Any code that affects how authors create or structure content
Do NOT use for:
- Documentation-only changes
- Configuration changes that don't affect authoring
- Research tasks that don't require making any code changes yet
Philosophy
Content Driven Development prioritizes creating or identifying test content before writing code. This ensures:
- Code is built against real content
- Author-friendly content models
- Validation throughout development
Optional: Understanding CDD Principles
Read references/cdd-philosophy.md if:
- User asks "why" questions about content-first approach
- You need to understand reasoning behind CDD decisions
- You're unsure whether to prioritize author vs developer experience
Otherwise: Follow the workflow steps below
Step 0: Create TodoList
FIRST STEP: Use the TodoWrite tool to create a todo list with the following 8 tasks:
-
Start dev server (if not running)
- Success: Dev server running, can access http://localhost:3000
-
Analyze & plan
- Success: Clear understanding documented + acceptance criteria defined
-
Design content model
- Success: Content structure documented and validated
-
Identify/create test content
- Success: Test content accessible covering all scenarios
-
Implement
- Success: Functionality works across all viewports
-
Lint & test
- Success: All checks pass
-
Final validation
- Success: All acceptance criteria met, everything works
-
Ship it
- Success: PR created with preview link for validation
Mark todo complete when: Todo list created with all 8 tasks
Step 1: Start Dev Server
Check if dev server is running:
curl -s -o /dev/null -w "%{http_code}" http://localhost:3000
Expected: 200 (server running) or connection error (server not running)
If not running, start it:
aem up --no-open --forward-browser-logs
Notes:
- Run in background if possible (dev server needs to stay running)
- Requires AEM CLI installed globally:
npm install -g @adobe/aem-cli - Alternative:
npx -y @adobe/aem-cli up --no-open --forward-browser-logs
IMPORTANT: Check the command output for errors. Common issues:
- Port 3000 already in use
- AEM CLI not installed
- Configuration errors
After starting, verify it's running:
curl -s -o /dev/null -w "%{http_code}" http://localhost:3000
Expected: 200
Success criteria:
- ✅ Dev server running
- ✅ http://localhost:3000 returns 200
- ✅ No errors in server startup output
Mark todo complete when: Dev server confirmed running and accessible
Step 2: Analyze & Plan
Invoke: analyze-and-plan skill
Provide:
- Task description from user
- Screenshots, design files, or existing URLs to match design from (if available)
The analyze-and-plan skill will:
- Guide you through task-specific analysis
- Help define acceptance criteria
- Optionally analyze visual designs/mockups if provided
- Create documented analysis for reference
Success criteria:
- ✅ Requirements analyzed
- ✅ Acceptance criteria defined
- ✅ Analysis documented to file for later steps
Mark todo complete when: Analysis documented and acceptance criteria defined
Step 3: Design Content Model
Skip if: CSS-only changes that don't affect content structure
Invoke: content-modeling skill
Provide:
- Analysis from Step 2 (content requirements, author inputs)
- Block name and purpose
The content-modeling skill will:
- Design table structure (rows, columns, semantic formatting)
- Validate against best practices (4 cells/row, semantic formatting)
- Document content model for authors
Success criteria:
- ✅ Content model designed (table structure defined)
- ✅ Validated against best practices
- ✅ Content model documented
Mark todo complete when: Content model designed and documented
Step 4: Identify/Create Test Content
Goal: End this step with accessible test content URL(s) covering all test scenarios
Choose the best path based on your situation:
Option A: User Provided Test URL(s)
When to use: User already has content and provided URL(s)
What to do:
- Validate URL loads:
curl -s -o /dev/null -w "%{http_code}" http://localhost:3000/path - Expected:
200status - Document URL(s)
- Mark complete
Option B: New Block (No Existing Content)
When to use: Building a brand new block that doesn't exist yet
What to do:
- Skip search (nothing exists yet to find)
- Create test content using one of these approaches:
Approach 1: CMS Content (Recommended)
- Ask user to create content in their CMS (Google Drive/SharePoint/DA/Universal Editor)
- Provide content model from Step 3 as reference
- Wait for user to provide URL(s)
- Validate:
curl -s -o /dev/null -w "%{http_code}" http://localhost:3000/path - Expected:
200status
Using DA: If you need to push HTML content programmatically to DA (rather than asking the user to author it), invoke the da-auth skill first to obtain a valid
DA_TOKEN, then use the DA Admin API (POST https://admin.da.live/source/{org}/{repo}/{path}) to push the content and trigger a preview.
Approach 2: Local HTML (Temporary)
- Create HTML file in
drafts/tmp/{block-name}.plain.html - Follow structure from Step 3 content model
- Read references/html-structure.md for local HTML file format guidance
- Restart dev server:
aem up --html-folder drafts --no-open --forward-browser-logs - Validate:
curl -s -o /dev/null -w "%{http_code}" http://localhost:3000/drafts/tmp/{block-name} - Expected:
200status - Note: User must create CMS content before PR (required for preview link)
Option C: Existing Block
When to use: Modifying, fixing, or styling an existing block
What to do:
First: Search for existing content
- Invoke find-test-content skill
- Provide: block name, dev server URL (optional, defaults to localhost:3000)
What find-test-content will do:
- Search for existing content pages containing the block
- Automatically detect and report all variants found
- Report: URLs with instance counts and variant info
Then: Assess search results
If sufficient content found:
- Document URL(s)
- Validate URLs load:
curl -s -o /dev/null -w "%{http_code}" http://localhost:3000/path - Expected:
200status - Mark complete
If no content found OR insufficient coverage:
- Create additional test content using approaches from Option B
- Validate URLs load
- Mark complete
Success criteria:
- ✅ Test content accessible at known URL(s)
- ✅ Content covers all test scenarios (variants, edge cases)
- ✅ URLs validated (return 200)
Mark todo complete when: Test content identified/created and validated
Step 5: Implement
Invoke: building-blocks skill
Provide:
- Content model from Step 3 (if applicable)
- Test content URL(s) from Step 4
- Analysis/requirements from Step 2
- Type of changes: new block, existing block modification, CSS-only, etc.
The building-blocks skill will:
- Guide implementation approach based on change type
- Handle JavaScript decoration (if needed)
- Handle CSS styling (mobile-first, responsive)
- Ensure iterative testing in browser throughout development
Success criteria:
- ✅ Code implementation complete
- ✅ Functionality works across all viewports (mobile, tablet, desktop)
- ✅ No console errors
Mark todo complete when: building-blocks skill reports implementation complete and working across viewports
Step 6: Lint & Test
What to do:
npm run lint
If lint errors:
- Fix issues (use
npm run lint:fixfor auto-fixable problems) - Re-run lint until clean
Run existing tests:
npm test
Note: Unit tests are optional and only needed for logic-heavy utilities. The testing-blocks skill (invoked by building-blocks in Step 5) handles browser testing. This step catches any remaining lint issues and runs the project's test suite.
Success criteria:
- ✅
npm run lintpasses with no errors - ✅
npm testpasses (if tests exist)
Mark todo complete when: All lint and test checks pass
Step 7: Final Validation
What to do:
-
Review acceptance criteria from Step 2
- Read the analysis document created in Step 2
- Check each acceptance criterion is met
-
Final browser sanity check
- Load test content URL(s) in browser
- Check mobile, tablet, and desktop viewports
- Verify no console errors
- Confirm no visual regressions
-
Verify no regressions
- If modifying existing block: test existing variants still work
- If modifying core functionality: spot-check a few pages
Success criteria:
- ✅ All acceptance criteria from Step 2 met
- ✅ Works across all viewports
- ✅ No console errors
- ✅ No regressions on existing functionality
Mark todo complete when: All acceptance criteria verified and no regressions found
Step 8: Ship It
What to do:
-
Create feature branch (if not already on one):
git checkout -b block-name -
Stage specific files only:
git add blocks/{block-name}/{block-name}.js blocks/{block-name}/{block-name}.css # Add only files you worked on - NEVER use `git add .` -
Commit with conventional commit format:
git commit -m "feat(block-name): add new block"Include relevant details in commit message and agent attribution in footer (agent adds
Co-authored-by: cursor <noreply@cursor.com>) -
Push to feature branch:
git push origin HEAD -
Create PR with preview link:
- Branch preview URL format:
https://{branch}--{repo}--{owner}.aem.page/{path} - Example:
https://carousel--aem-skills-demo--shsteimer.aem.page/ - REQUIRED: Include preview link in PR description (used for automated PSI checks)
- Add multiple preview links if needed (e.g., different variants, edge cases)
Determining if you need a draft PR:
Create a draft PR when:
- ✅ Only local test content exists for NEW functionality/variants
- ✅ Test content demonstrates new features not yet in CMS
- ✅ You need user to create CMS content before final validation
Create a regular PR when:
- ✅ All test content exists in CMS and is previewable
- ✅ Changes only affect existing content (regressions can be tested with existing CMS content)
Workflow for draft PRs:
- Create the PR as a draft using
gh pr create --draft - Include existing content preview links (for regression testing if applicable)
- Include next steps in PR description (see template below):
- Describe the test content used locally and what scenarios it covered
- Suggest that same/similar content be created and previewed, and links added to PR
- Keep steps brief but actionable for any reviewer
- Instruct the user to create CMS content following the steps:
- Open local test content in browser:
http://localhost:3000/drafts/tmp/[test-file] - Right-click AEM Sidekick extension
- Click "View document source" option
- Use the copy button to copy the document content
- Paste into Word/Google Docs/Document Authoring (for UE: use as guide, copy/paste won't work directly)
- Preview the CMS content
- Open local test content in browser:
- User adds preview URL(s) to PR description and marks PR ready for review (or agent does with user's input)
- Branch preview URL format:
PR Description Template:
Use this template for all PRs, including all relevant preview links and adapting as needed:
## Description
Brief description of changes
[If an issue exists]
Fix #<gh-issue-id>
Test URLs:
[Repeat for all relevant test urls]
- Before: https://main--{repo}--{owner}.aem.page/{path}
- After: https://{branch}--{repo}--{owner}.aem.page/{path}
[If only local test content (draft PR):]
This PR is currently a **draft** pending creation of CMS test content.
### Next Steps to Complete PR:
[add relevant steps here]
Success criteria:
- ✅ Changes committed with proper message format and attribution
- ✅ Pushed to feature branch (not main)
- ✅ PR created with preview link in description
Mark todo complete when: PR created and ready for review
Related Skills
- analyze-and-plan: Invoked in Step 2 for requirements analysis and acceptance criteria
- content-modeling: Invoked in Step 3 for designing content models
- da-auth: Obtain a valid Adobe IMS token before pushing content to DA or triggering DA previews programmatically — invoke at the start of Step 4 when using DA
- find-test-content: Invoked in Step 4, Option C for finding existing content
- building-blocks: Invoked in Step 5 for implementation
- testing-blocks: Invoked by building-blocks for browser testing
- block-collection-and-party: Used to find similar blocks and reference implementations
Anti-Patterns to Avoid
Common mistakes that violate CDD principles:
- ❌ Starting with code before understanding the content model
- ❌ Making assumptions about content structure without seeing real examples
- ❌ Creating developer-friendly but author-hostile content models
- ❌ Skipping content creation "to save time" (costs more time later)
Resources
- Philosophy: references/cdd-philosophy.md - Why content-first matters
- HTML Structure: references/html-structure.md - Guide for creating local HTML test files
Related skills
More from adobe/skills and the wider catalog.

content-modeling
Design content models for AEM Edge Delivery Services blocks that authors can easily work with.

create-site
Set up a brand-new AEM Edge Delivery site from scratch with GitHub repo, DA content, and live preview.

development
Generate comprehensive technical documentation for developers taking over an AEM Edge Delivery Services project. Analyzes codebase structure, custom implementations, design tokens, and produces a complete developer guide.

docs-search
Search AEM Edge Delivery Services documentation to find relevant guides, code examples, and deprecation warnings.

find-test-content
Find existing pages using a specific block in AEM Edge Delivery Services projects.

generate-import-html
Generate structured HTML with block tables and metadata for AEM Edge Delivery Services page imports.