plugins/web/skills/page-tree/SKILL.md
Capture a spatial hierarchy of rendered DOM elements from any webpage. Injects a pre-built script via playwright-cli that walks the DOM, detects layout grids, extracts backgrounds, prunes invisible nodes, promotes elements rendered outside their DOM parent (overlays, fixed navs, modals), and tags overlay nodes with occlusion metadata. Returns three outputs: LLM-friendly indented text, structured JSON tree, and a nodeMap mapping positional IDs to CSS selectors with background and overlay data. Use before page decomposition, overlay detection, brand extraction, or any workflow that needs structured page analysis. Triggers on: visual tree, capture tree, page structure, page hierarchy, DOM tree, capture visual, page analysis, extract tree.
npx skillsauth add adobe/skills page-treeInstall 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.
Capture a spatial hierarchy of rendered DOM elements from any webpage via
playwright-cli. Returns three outputs for downstream consumption.
playwright-cli available (run playwright-cli --help to verify)if [[ -n "${CLAUDE_SKILL_DIR:-}" ]]; then
VT_BUNDLE="${CLAUDE_SKILL_DIR}/scripts/page-tree-bundle.js"
else
VT_BUNDLE="$(find ~/.claude \
-path "*/page-tree/scripts/page-tree-bundle.js" \
-type f 2>/dev/null | head -1)"
fi
Verify the path is non-empty before continuing.
| Parameter | Default | Description |
|-----------|---------|-------------|
| minWidth | 900 | Minimum element width in px. Elements narrower than this are excluded. position: fixed elements always pass regardless. Lower for more detail (e.g., 300 for mobile). |
Run the script location block above and store the path in VT_BUNDLE.
If the path is empty, report an error and stop.
Inject the bundle via initScript in the playwright-cli config, then
capture with a pure expression eval. Do NOT use inline $(cat) or IIFE
wrappers — playwright-cli eval only accepts pure expressions (it wraps
them as () => (EXPR) internally, so function bodies with statements
fail).
URL="<target URL>"
MINWIDTH=900 # or caller-specified value
# Build config with initScript — injects bundle before navigation
VT_CONFIG="/tmp/vt-config-$$.json"
echo "{\"browser\":{\"initScript\":[\"$VT_BUNDLE\"]}}" > "$VT_CONFIG"
# Open page (or use existing session) — bundle creates window.__visualTree
playwright-cli --config="$VT_CONFIG" open "$URL"
sleep 2
# Capture — pure expression, no IIFE
VT_RESULT=$(playwright-cli eval \
"JSON.stringify(window.__visualTree.captureVisualTree($MINWIDTH))")
rm -f "$VT_CONFIG"
Parse the returned JSON string.
Present three sections to the caller:
1. Visual Tree (text format)
The primary output for LLM consumers. Show in a code block:
r @0,0 1440x5667
rc1 [3x1] @0,0 1440x83 "Header text..."
rc2 @0,83 1440x5216
rc2c1 [bg:image] @0,83 1440x410 "Hero text..."
...
Format: ID [role] [CxR] [bg:type] @x,y wxh "text..."
2. Node Map
Positional ID to metadata lookup. Show as JSON. Each entry contains:
selector: CSS selector for the DOM elementbackground (optional): { type, value, raw, source }overlay (optional): { occluding: [sibling IDs this node covers] }Overlay entries indicate the node was promoted from a deeper DOM position to root level because it rendered outside its parent's bounds (e.g., cookie banners, fixed navs, modals).
3. JSON Tree
Full structured tree. Show as JSON only if the caller requests it, otherwise mention it is available. Each node contains: tag, selector, bounds, text, role, layout, background, children.
playwright-cli goto <url> then
wait for network idle) for best results.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.