
experience-lwc-runtime-observe
Use when running Salesforce Lightning Preview for an app or a single LWC component to extract the runtime DOM for inspection. TRIGGER when the user says "preview an LWC locally", "run sf lightning dev", "launch Local Dev", "inspect a component's shadow DOM at runtime", "grab rendered HTML from a live preview", "troubleshoot what actually renders versus the template", "set up Salesforce Live Preview plugin", "lightning preview", "local dev server", or "extract runtime DOM". DO NOT TRIGGER when the user is authoring or editing LWC source code (use experience-lwc-generate) or reviewing component code statically without running it.
- Installs
- 2K
- Last 24h
- —
- Trending rank
- —
- Security
- Not audited
Install
Works with every agent the skills CLI supports.
npx skills add https://github.com/forcedotcom/sf-skills --skill experience-lwc-runtime-observe- 01
Install
Run the command in your project. The CLI asks which agents to install for.
- 02
Describe the task
Ask your agent for something this skill covers. It loads experience-lwc-runtime-observe automatically when relevant.
- 03
Review the result
The agent follows the SKILL.md steps, scripts and references bundled with the skill.
SKILL.md
The instructions your agent reads when the skill is triggered.
Previewing LWC Runtime — Local Dev + DOM Inspection
Guides the agent through two sequential jobs that typically run together:
- Start a Lightning Preview session with the Salesforce CLI so an LWC app or component renders in a local dev environment.
- Navigate to that preview URL and extract the runtime DOM subtree so the agent (or user) can reason about what actually rendered.
Preview is the prerequisite for DOM inspection. Keep them in this order.
When to Use This Skill
- The user wants to preview an LWC app or component locally before deploying
(
sf lightning dev app/sf lightning dev component). - The user wants the rendered HTML subtree for a specific component at runtime — for a diff, a screenshot pipeline, or to reason about shadow DOM.
- The user asks why the template content "isn't in the DOM" — almost always a shadow-DOM misunderstanding handled in Step 2.
Prerequisites
- Salesforce CLI (
sf) installed. Check withsf version. @salesforce/plugin-lightning-devinstalled. Check withsf plugins.- An authenticated org (
sf org listshows at least one connected org). - For DOM extraction: browser automation available in the agent harness (Playwright, Puppeteer, Chrome DevTools Protocol — whatever is wired up).
Step 1 — Start the Lightning Preview
Ask the user (or infer from the request) whether the scope is app or component.
1a. Verify the toolchain
Ask the user for (or infer from the request) the org alias the preview
should target. Run the bundled verification script with that alias and
surface any error it emits — do not re-invoke sf version /
sf plugins / sf org display in prose. The script checks CLI
presence, @salesforce/plugin-lightning-dev installation, and that the
specific target alias is authenticated and Connected, and exits nonzero
with an actionable message on failure:
"<skill_dir>/scripts/verify-toolchain.sh" <orgAlias>
If it reports that the target alias is not authenticated or not
Connected, direct the user to
Enable Local Dev
and have them run sf org login web --alias <orgAlias>, then re-run the
verification script before proceeding.
1b. Read the subcommand's flags
# For app scope
sf lightning dev app --help
# For component scope
sf lightning dev component --help
Note required vs optional flags. If a required flag is ambiguous, ask the user before running.
1c. Launch the preview
Prefix every preview command with OPEN_BROWSER=false — the CLI opens a
browser window by default, which we do not want when an agent is driving.
(This env var is undocumented in --help; rely on it unless the user
explicitly asks for a browser window.)
| Scope | Command |
|---|---|
app | OPEN_BROWSER=false sf lightning dev app -o <orgAlias> -n <appName> -t desktop |
component | OPEN_BROWSER=false sf lightning dev component -o <orgAlias> -n <componentName> |
When the preview is up, capture the URL and log it in exactly this format:
Lightning Preview running at URL: <URL>
If any sub-step fails, stop and surface the error to the user — don't try to paper over auth or plugin-install problems.
Step 2 — Extract the Runtime DOM
Only run this step once Step 1 has produced a live preview URL.
2a. Get an authenticated front-door URL — without surfacing the token to agent context
The front-door URL returned by sf org open --url-only --json contains a
short-lived OTP that authenticates the session. Never run sf org open
directly — its output would land in the agent tool-output stream and leak
an auth token into the transcript, violating agent-safety standard S1.
The bundled helper is the only supported way to obtain the URL: it runs
sf org open internally with stdout redirected into a chmod 600 tempfile
and stderr suppressed, so no URL fragment or token substring ever reaches
agent context.
Instead, use the bundled helper script, which writes the URL to a
chmod 600 tempfile and prints only export assignments (no token
material). Capture the helper output first so a nonzero exit status
aborts the caller — eval "$(...)" alone masks failures, letting the
agent proceed with an unset $FRONTDOOR_URL_FILE:
frontdoor_env="$("<skill_dir>/scripts/open-frontdoor.sh" <orgAlias> <previewUrl>)" || exit 1
eval "$frontdoor_env"
The helper suppresses sf and python3 stderr as well as stdout, so
partial URLs and progress noise never reach the agent transcript.
The browser driver must:
- Read the URL from
$FRONTDOOR_URL_FILE. - Navigate to it to establish a session.
- Delete the tempfile immediately after use.
- Never
cator otherwise echo the file contents.
OTP tokens expire fast. Bring up the browser driver first, then invoke the helper just before navigating — otherwise the token goes stale.
2b. Navigate and wait
- Open the preview URL from Step 1 in the automation browser.
- Wait for the network to go idle and the initial render to complete.
- If the expected element isn't there, back off briefly and retry before declaring failure — local dev pages sometimes hydrate in two phases.
2c. Extract the subtree
Two deterministic string operations — turning a component name into its
c-<kebab> selector and wrapping the extracted HTML in the exact
DOM_OUTPUT_START / DOM_OUTPUT_END markers — are handled by
<skill_dir>/scripts/extract-dom.sh. Do NOT re-derive the selector or
compose the markers in prose; call the script.
Actual DOM traversal must be run by the browser-automation driver (Playwright / Puppeteer / CDP); the script does not drive the browser.
If scope is component
Compute the selector deterministically:
selector="$("<skill_dir>/scripts/extract-dom.sh" selector <componentName>)"
Then, using the driver, pierce the lwr_dev-preview-container shadow
root, locate the first visible element matching $selector, and read its
subtree HTML (via element.shadowRoot.innerHTML). Pipe that HTML into
the wrap step:
printf '%s' "$html_subtree" \
| "<skill_dir>/scripts/extract-dom.sh" wrap component <componentName>
If scope is app
Using the driver, identify the primary app root (prefer document.body
or the main app container — not document.documentElement), exclude
<head> and non-rendered nodes, and read the subtree HTML. Pipe it into
the wrap step:
printf '%s' "$html_subtree" \
| "<skill_dir>/scripts/extract-dom.sh" wrap app
Emit the script's stdout unchanged as the DOM output.
2d. About LWC Shadow DOM (the #1 gotcha)
Lightning Web Components use Shadow DOM. The template content is not directly queryable on the host element:
| Access pattern | What you get |
|---|---|
element.innerHTML | empty, or only slotted light-DOM content |
element.outerHTML | just the host tag, no children |
element.shadowRoot.innerHTML | the real rendered template content |
If the browser driver's DOM query doesn't pierce shadow roots by default,
walk shadowRoot explicitly. Most modern automation drivers have a
shadow-piercing query helper — use it.
Examples
For a worked end-to-end example (preview a component, capture the front-door
URL safely, and extract its DOM), load
examples/component-preview-and-dom.md.
Verification Checklist
-
<skill_dir>/scripts/verify-toolchain.sh <orgAlias>exited zero for the target alias. - Preview command ran with
OPEN_BROWSER=false. - Preview URL logged in the
Lightning Preview running at URL: <URL>format. - Front-door URL fetched via
<skill_dir>/scripts/open-frontdoor.sh(neversf org opendirectly). - DOM extraction used
shadowRoottraversal (notinnerHTMLon the host). - DOM output was produced by
<skill_dir>/scripts/extract-dom.sh wrap …(script owns the markers).
Troubleshooting
verify-toolchain.shreports "Target org alias is not authenticated or not Connected" — runsf org login web --alias <orgAlias>(the alias must match the one you passed toverify-toolchain.shand the-ovalue the preview command uses).verify-toolchain.shreports the plugin is missing — install it withsf plugins install @salesforce/plugin-lightning-dev.- Preview opens a browser window — you forgot
OPEN_BROWSER=false. - Empty DOM on extraction — you're looking at
innerHTMLon a host. Useelement.shadowRoot.innerHTMLinstead. Also verify you pierced thelwr_dev-preview-containershadow root. - Front-door token fails — it's expired. Re-invoke
<skill_dir>/scripts/open-frontdoor.shand navigate within ~60 seconds.
FAQ
What does the experience-lwc-runtime-observe skill do?
Use when running Salesforce Lightning Preview for an app or a single LWC component to extract the runtime DOM for inspection. TRIGGER when the user says "preview an LWC locally", "run sf lightning dev", "launch Local Dev", "inspect a component's shadow DOM at runtime", "grab rendered HTML from a live preview", "troubleshoot what actually renders versus the template", "set up Salesforce Live Preview plugin", "lightning preview", "local dev server", or "extract runtime DOM". DO NOT TRIGGER when the user is authoring or editing LWC source code (use experience-lwc-generate) or reviewing component code statically without running it.
How do I install experience-lwc-runtime-observe?
Run npx skills add https://github.com/forcedotcom/sf-skills --skill experience-lwc-runtime-observe in your project. The skills CLI detects the agents you use and copies the skill into the right folder. For Claude Code you can also place the skill folder at ~/.claude/skills/experience-lwc-runtime-observe/ (personal) or .claude/skills/experience-lwc-runtime-observe/ (project).
Which AI agents can use experience-lwc-runtime-observe?
Any agent that supports the open Agent Skills format (a folder with a SKILL.md file), including Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, Windsurf, Cline, OpenCode and more.
Is experience-lwc-runtime-observe safe to install?
No partner security audit is available yet. Skills can run commands and scripts, so read the SKILL.md and any bundled files before installing.
Who maintains experience-lwc-runtime-observe?
It is published by forcedotcom in forcedotcom/sf-skills. It has 1,965 recorded installs.
More from forcedotcom/sf-skills
platform-apex-generate
forcedotcom/sf-skills
Primary Apex authoring skill for class generation, refactoring, and review. ALWAYS ACTIVATE when the user mentions Apex, .cls, triggers, or asks to create/refactor a class (service, selector, domain, batch, queueable, schedulable, invocable, DTO, utility, interface, abstract, exception, REST resource). Use this skill for requests involving SObject CRUD, mapping collections, fetching related records, scheduled jobs, batch jobs, trigger design, @AuraEnabled controllers, @RestResource endpoints, custom REST APIs, or code review of existing Apex.
platform-apex-test-generate
forcedotcom/sf-skills
Use to generate and validate Apex test classes with TestDataFactory patterns, bulk testing (251+ records), mocking, assertions, and disciplined test-fix loops. Use when creating Apex test classes (for triggers, services, controllers, batch jobs, queueables, and callouts), improving coverage, debugging or fixing failing Apex tests, or running test/coverage analysis. Triggers on Test.cls files, sf apex run test, coverage reports. Do NOT trigger for production Apex (use platform-apex-generate) or Jest/LWC tests.
platform-apex-test-run
forcedotcom/sf-skills
Apex test execution, coverage analysis, and test-fix loops with 120-point scoring. Use when the user runs Apex tests, checks code coverage, fixes failing tests, or touches Test.cls / Test.cls files. DO NOT TRIGGER when writing Apex production code (use platform-apex-generate), Agentforce agent testing (use agentforce-test), or Jest/LWC tests (use experience-lwc-generate).
platform-apex-logs-debug
forcedotcom/sf-skills
Salesforce debug log analysis and troubleshooting with 100-point scoring. TRIGGER when: user analyzes debug logs, hits governor limits, reads stack traces, or touches .log files from Salesforce orgs. DO NOT TRIGGER when: running Apex tests (use platform-apex-test-run), generating or fixing Apex code (use platform-apex-generate), or Agentforce session tracing (use agentforce-observe).
platform-soql-query
forcedotcom/sf-skills
Use when the user needs SOQL/SOSL authoring or optimization: natural-language-to-query generation, relationship queries, aggregates, query-plan/selectivity analysis, and performance or safety improvements. TRIGGER when the user writes, optimizes, or debugs SOQL/SOSL, touches .soql files, or asks about relationship queries, aggregates, or query performance. DO NOT TRIGGER for bulk data operations (use platform-data-manage), Apex DML logic (use platform-apex-generate), or report/dashboard queries.
platform-metadata-deploy
forcedotcom/sf-skills
Salesforce DevOps automation using sf CLI v2. TRIGGER when: user deploys metadata, validates a deploy or does a dry-run, deploys to a Production org, quick-deploys a validated job ID, ships/promotes to prod, creates/manages scratch orgs or sandboxes, sets up CI/CD pipelines, or troubleshoots deployment errors with sf project deploy. DO NOT TRIGGER when: writing Apex code, building LWC components (use experience-lwc-generate), creating metadata definitions (use platform-custom-object-generate), deleting metadata from an org (use platform-destructive-deploy), or querying org data (use platform-data-manage).
Popular frontend & design skills
setup-matt-pocock-skills
mattpocock/skills
Configure this repo for the engineering skills: set up its issue tracker, triage label vocabulary, and domain doc layout. Run once before first use of the other engineering skills.
frontend-design
anthropics/skills
Guidance for distinctive, intentional visual design when building new UI or reshaping an existing one. Helps with aesthetic direction, typography, and making choices that don't read as templated defaults.
hyperframes-animation
heygen-com/hyperframes
All animation knowledge for HyperFrames — atomic motion rules, multi-phase scene blueprints, scene transitions, broader motion-design techniques, AND the seven runtime adapters (GSAP default, plus Lottie, Three.js, Anime.js, CSS keyframes, Web Animations API, TypeGPU). Use for any motion or animation task: pick 2-4 rules and compose, or load a blueprint, or look up runtime-specific API (e.g. GSAP eases / Lottie player / Three.js mixer). Also covers auditing an existing composition's choreography (animation map) and 24 named text-animation effects. HyperFrames-native: single paused timeline, seek-safe, deterministic.
prototype
mattpocock/skills
Build a throwaway prototype to answer a design question. Use when the user wants to sanity-check whether a state model or logic feels right, or explore what a UI should look like.
hyperframes-core
heygen-com/hyperframes
The HyperFrames composition contract — build one renderable project. Use for composition structure, the data- timing attributes, class="clip", tracks, sub-compositions, variables, framework-owned media playback, deterministic-render rules, and validation. Read before writing composition HTML.
vercel-react-best-practices
vercel-labs/agent-skills
React and Next.js performance optimization guidelines from Vercel Engineering. This skill should be used when writing, reviewing, or refactoring React/Next.js code to ensure optimal performance patterns. Triggers on tasks involving React components, Next.js pages, data fetching, bundle optimization, or performance improvements.