skills/aem/project-management/skills/handover/SKILL.md
Generate project handover documentation for AEM Edge Delivery Services projects. Creates comprehensive guides for content authors, developers, and administrators. Use for "handover docs", "project documentation", "generate handover", "create guides".
npx skillsauth add adobe/skills handoverInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Generate comprehensive handover documentation for Edge Delivery Services projects. This skill orchestrates the creation of guides for different audiences.
| Guide | Audience | Skill |
|-------|----------|-------|
| Authoring Guide | Content authors and content managers | authoring |
| Developer Guide | Developers and technical team | development |
| Admin Guide | Site administrators and operations | admin |
CRITICAL: You MUST execute this cd command before anything else. Do NOT use absolute paths — actually change directory.
# Navigate to git project root (works from any subdirectory)
cd "$(git rev-parse --show-toplevel)"
# Verify it's an Edge Delivery Services project
ls scripts/aem.js
IMPORTANT:
cd command above using the Bash toolproject-root/project-guides/If scripts/aem.js does NOT exist, respond:
"This skill is designed for AEM Edge Delivery Services projects. The current directory does not appear to be an Edge Delivery Services project (
scripts/aem.jsnot found).Please navigate to an Edge Delivery Services project and try again."
STOP if check fails. Otherwise proceed — you are now at project root.
Remove any existing config to ensure fresh org and authentication for this project:
rm -f .claude-plugin/project-config.json
MANDATORY: Use the AskUserQuestion tool with EXACTLY these 4 options:
AskUserQuestion({
"questions": [{
"question": "Which type of handover documentation would you like me to generate?",
"header": "Guide Type",
"options": [
{"label": "All (Recommended)", "description": "Generate all three guides: Authoring, Developer, and Admin"},
{"label": "Authoring Guide", "description": "For content authors and managers - blocks, templates, publishing"},
{"label": "Developer Guide", "description": "For developers - codebase, implementations, design tokens"},
{"label": "Admin Guide", "description": "For site administrators - permissions, API operations, cache"}
],
"multiSelect": false
}]
})
DO NOT omit any option. All 4 options MUST be presented.
AFTER the user selects guide type(s), but BEFORE invoking any sub-skills, ensure the organization name is available.
# Check if org name is already saved
cat .claude-plugin/project-config.json 2>/dev/null | grep -o '"org"[[:space:]]*:[[:space:]]*"[^"]*"' | head -1
If no org name is saved, you MUST pause and ask the user directly:
"What is your Config Service organization name? This is the
{org}part of your Edge Delivery Services URLs (e.g.,https://main--site--{org}.aem.page). The org name may differ from your GitHub organization."
IMPORTANT RULES:
AskUserQuestion with predefined options — ask as a plain text questionOnce you have the org name, save it so sub-skills can use it:
# Create config directory if needed
mkdir -p .claude-plugin
# Ensure .claude-plugin is in .gitignore (contains auth tokens)
grep -qxF '.claude-plugin/' .gitignore 2>/dev/null || echo '.claude-plugin/' >> .gitignore
# Save org name to config file
# If "All" was selected, include allGuides flag to skip step 0 in sub-skills
echo '{"org": "{ORG_NAME}"}' > .claude-plugin/project-config.json
# OR if "All (Recommended)" was selected:
echo '{"org": "{ORG_NAME}", "allGuides": true}' > .claude-plugin/project-config.json
Note: Include "allGuides": true ONLY when user selected "All (Recommended)". This signals sub-skills to skip step 0 validation (orchestrator already validated).
Replace {ORG_NAME} with the actual organization name provided by the user.
Why this matters: The organization name is required by the Helix Admin API to determine if the project is repoless (multi-site). By gathering it once in the orchestrator, sub-skills running in parallel don't each need to prompt the user separately.
AFTER saving the organization name, authenticate using Playwright browser automation.
AUTH_TOKEN=$(cat .claude-plugin/project-config.json 2>/dev/null | grep -o '"authToken"[[:space:]]*:[[:space:]]*"[^"]*"' | sed 's/"authToken"[[:space:]]*:[[:space:]]*"//' | sed 's/"$//')
If no auth token exists, use Playwright CLI:
npx playwright --version 2>/dev/null || npm install -g playwright
npx playwright install chromium 2>/dev/null || true
ORG=$(cat .claude-plugin/project-config.json | grep -o '"org"[[:space:]]*:[[:space:]]*"[^"]*"' | sed 's/"org"[[:space:]]*:[[:space:]]*"//' | sed 's/"$//')
SITE=$(curl -s "https://admin.hlx.page/config/${ORG}/sites.json" | grep -o '"name"[[:space:]]*:[[:space:]]*"[^"]*"' | head -1 | sed 's/"name"[[:space:]]*:[[:space:]]*"//' | sed 's/"$//')
Use AskUserQuestion to ensure user is ready:
AskUserQuestion({
"questions": [{
"question": "A browser window will open for authentication. After signing in, CLOSE THE BROWSER WINDOW to continue. Ready?",
"header": "Authentication Required",
"options": [
{"label": "Open Browser", "description": "I understand - open the browser for login"}
],
"multiSelect": false
}]
})
After user confirms, run:
mkdir -p .claude-plugin && npx playwright open --save-storage=.claude-plugin/auth-storage.json "https://admin.hlx.page/login/${ORG}/${SITE}/main"
After browser is closed, extract token from storage file:
echo "Browser closed. Extracting auth token..."
AUTH_TOKEN=$(node -e "
const fs = require('fs');
const data = JSON.parse(fs.readFileSync('.claude-plugin/auth-storage.json', 'utf8'));
const cookie = data.cookies.find(c => c.name === 'auth_token');
console.log(cookie ? cookie.value : '');
")
ORG=$(cat .claude-plugin/project-config.json | grep -o '"org"[[:space:]]*:[[:space:]]*"[^"]*"' | sed 's/"org"[[:space:]]*:[[:space:]]*"//' | sed 's/"$//')
echo "{\"org\": \"${ORG}\", \"authToken\": \"${AUTH_TOKEN}\"}" > .claude-plugin/project-config.json
rm -f .claude-plugin/auth-storage.json
echo "Auth token saved."
Why authenticate in orchestrator: By authenticating once here, all sub-skills running in parallel can use the saved token without each prompting for login separately.
Based on user selection:
| Selection | Action |
|-----------|--------|
| All | Invoke all three skills in parallel (see Step 3) |
| Authoring Guide | Skill({ skill: "project-management:authoring" }) |
| Developer Guide | Skill({ skill: "project-management:development" }) |
| Admin Guide | Skill({ skill: "project-management:admin" }) |
Execute all three guides in PARALLEL with streaming progress updates.
IMPORTANT: Provide immediate feedback to user before starting parallel execution:
"Starting parallel generation of all 3 handover guides:
📄 Authoring Guide - analyzing blocks, templates, configurations...
📄 Developer Guide - analyzing code, patterns, architecture...
📄 Admin Guide - analyzing deployment, security, operations...
You'll see progress updates as each guide moves through its phases."
Launch all three skills simultaneously using parallel Agent tool calls (foreground mode):
In a SINGLE message, invoke three Agent tools in parallel. Foreground agents have full tool permissions and run concurrently:
// All three in ONE message - runs in parallel with full permissions
Agent({
description: "Generate authoring guide",
prompt: "Invoke skill project-management:authoring to generate the authoring guide PDF. Show progress as you complete each phase."
})
Agent({
description: "Generate developer guide",
prompt: "Invoke skill project-management:development to generate the developer guide PDF. Show progress as you complete each phase."
})
Agent({
description: "Generate admin guide",
prompt: "Invoke skill project-management:admin to generate the admin guide PDF. Show progress as you complete each phase."
})
Why foreground agents:
When all three complete, report final summary:
"Handover documentation complete:
project-guides/
├── AUTHOR-GUIDE.pdf (full guide for content authors)
├── DEVELOPER-GUIDE.pdf (full guide for developers)
└── ADMIN-GUIDE.pdf (full guide for administrators)
All PDFs generated. Source files cleaned up."
Benefits of parallel execution:
| Selection | Output Files |
|-----------|--------------|
| All | project-guides/AUTHOR-GUIDE.pdf, project-guides/DEVELOPER-GUIDE.pdf, project-guides/ADMIN-GUIDE.pdf |
| Authoring Guide | project-guides/AUTHOR-GUIDE.pdf |
| Developer Guide | project-guides/DEVELOPER-GUIDE.pdf |
| Admin Guide | project-guides/ADMIN-GUIDE.pdf |
Note: Each sub-skill generates a PDF only. All source files (.md, .html, .plain.html) are cleaned up after PDF generation.
ALL FILES MUST BE SAVED TO project-guides/ FOLDER:
project-guides/AUTHOR-GUIDE.md
project-guides/DEVELOPER-GUIDE.md
project-guides/ADMIN-GUIDE.md
WHY THIS MATTERS: Files must be in project-guides/ for proper organization and PDF conversion.
BEFORE WRITING ANY FILE: Run mkdir -p project-guides first.
STRICTLY FORBIDDEN:
fstab.yaml — it does NOT exist in most projects and does NOT show all sites.plain.html filesconvert_markdown_to_html toolproject-guides/REQUIRED:
mkdir -p project-guides before writing any filesproject-guides/ folder (EXACT PATH)title and date fields in frontmatterproject-management:whitepaper to generate PDF immediately after saving markdown.pdf files ONLY in project-guides/ folderThis skill invokes:
project-management:authoring - Author/content manager guide (generates PDF immediately)project-management:development - Developer technical guide (generates PDF immediately)project-management:admin - Admin operations guide (generates PDF immediately)project-management:whitepaper - PDF generation (invoked by each sub-skill after saving markdown)tools
Use the run-workflow MCP to discover, compose, execute, publish, and save Adobe Firefly workflows. TRIGGER when: user asks what actions are available, what the MCP can do, how to process images/video/3D via workflow, wants to build/run/save/publish a workflow, OR pastes any workflow/batch/execution ID. BARE ID (UUID/workflowId/batchId) = INSPECT ONLY — call inspect_run, NEVER run_workflow_submit. ALWAYS call list_actions first for capability/discovery questions. DO NOT TRIGGER for direct Firefly API calls without MCP (use firefly-api-specs).
tools
Run predefined featured workflows via run-workflow MCP. TRIGGER when user names a featured workflow (retargeting, banners at scale, localization, packaging, banner advertising, etc.) or asks to run a known marketing/production workflow. Requires run-workflow MCP. ALWAYS call get_featured_workflow before compose_workflow. DO NOT TRIGGER for custom one-off workflows with no named template — use run-workflow skill.
tools
Migrate an Adobe Commerce App Builder project from the Integration Starter Kit or Checkout Starter Kit to the new App Management approach. Run from the root of the App Builder project to be migrated. Pass --auto to skip confirmation prompts (suitable for CI or batch use) — auto mode prints a summary of all Q&A questions answered with their defaults. Pass --doc-scan-only to scan README.md and env.dist for outdated content without modifying any files. Use when the user wants to migrate an App Builder project from the Integration Starter Kit or Checkout Starter Kit to the App Management approach, or mentions upgrading their Adobe Commerce extension architecture.
development
Add or modify webhook interceptors in an Adobe Commerce app. Use when the user wants to intercept Commerce operations to validate input, append data, or modify behavior — before or after execution. Requires a base app initialized with commerce-app-init.