Respira Builder Edits
SkillAI & modelsUse for any in-page content edit on a WordPress site with a page builder. Covers finding elements, applying surgical edits, duplicating before large changes, and verifying the result. Works across Elementor 3 + 4, Divi 4 + 5, Beaver Builder, Bricks, Oxygen Classic, Oxygen 6, Breakdance, WPBakery, Uncode, and Gutenberg.
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the Respira Builder Edits skill
What this skill tells your AI
The instructions your AI receives, as published by respira-press/agent-skills-wordpress in skills/respira-builder-edits/SKILL.md and read by ahel’s review.
Common Mistakes
| Mistake | Correct approach |
|---|---|
Using respira_update_page to change a heading, image, or button | Use respira_find_element then respira_update_element. The page tool replaces the whole body and the builder loses every node. |
Calling respira_update_page without checking respira_get_builder_info | Always identify the builder first. Update_page destroys builder JSON on builder-managed pages. |
| Editing raw builder JSON by guessing field names | Read the current structure with respira_read_page, respira_find_element, or respira_get_builder_inline_schemas before writing. |
| Making large changes without a snapshot | Always call respira_create_page_duplicate before multi-element edits. |
| Assuming Divi 5 uses the same field as Divi 4 | Divi 4 stores shortcodes in post_content. Divi 5 stores blocks plus a per-node attrs._nodeId minted by the complexifier. By-id matching needs the _nodeId fallback (added in v7.0.30). |
Passing nested Divi 5 payloads through children only | Divi 5 also accepts Divi-vocabulary aliases rows / cols / modules (folded in v7.0.32). Pre-v7.0.32 these silently dropped. |
| Using a non-existent Beaver Builder module type | The content_field_map covers Heading, Text, Button, Image, HTML, Video, Sidebar, and Box (added in v7.0.13). Unknown types fall through without an error. |
Passing flat updates like {"button_text": "Go"} | Pass either flat OR {settings: {button_text: "Go"}}. v7.0.16 deep-merges both into the settings object. v7.0.19 extended this through Divi 4. v7.0.29 extended it through update_module and apply_builder_patch. |
Skipping respira_get_page_outline for "what is on this page" reads | The outline is lighter than extract_builder_content and ships per-row child counts plus a primary heading. Use it before deciding which element to edit. |
Inputs
- The page or post URL, ID, or slug.
- A description of what to change (text, image URL, color, style, link).
- The builder in use, or unknown. Auto-detect with
respira_get_builder_info.
Workflow
- Understand the site. Call
respira_get_site_contextandrespira_get_builder_infoif you haven't already. - Understand the page. Call
respira_get_page_outlinefor a fast structural read, orrespira_find_elementif you already know what to target. - Create a snapshot.
respira_create_page_duplicatebefore any edit that touches more than one element or that you're not 100% sure of. - Find the element.
respira_find_elementwith the most specific selector available: text content, CSS class, widget type, or element ID. Bricks 2.3.x + Divi 5 surface bothidandattrs._nodeId; either works. - Apply the edit.
respira_update_elementwith only the fields that change. For multi-element edits on the same page, preferrespira_batch_update. - Verify. Re-read the element and confirm the change is reflected. For Divi 5, also check the front-end if it's a CSS or style-driven change because the renderer has its own paths.
- Report. Tell the user what changed and where.
Builder-specific notes
- Elementor 3. Content lives in
_elementor_data. Each widget hasid,widgetType, andsettings. The base path is mature. - Elementor 4 (Atomic Elements). v7.1 added end-to-end write support across 9 atomic widgets (
e-heading,e-paragraph,e-button,e-image,e-svg,e-divider,e-youtube,e-self-hosted-video,e-component) plus 11 atomic layout containers (e-flexbox,e-div-block,e-grid, thee-tabsfamily, thee-formfamily). Pre-v7.1 every atomic write returned 422respira_elementor_atomic_write_unsupported. The v4 normaliser lifts shorthand to the canonical$$typeenvelopes; the v4 validator catches malformed nodes before they hit the DB. Unsupported atomic types still refuse fast withsupported_widgetsin the error body. - Divi 4. Shortcodes in
post_content. v7.0.19 + v7.0.29 fixed update_element, batch_update, apply_builder_patch, remove_element, inject_builder_content, and update_module. The kses bypass survives so<script>and<style>insideet_pb_codeare preserved. Custom post types are supported. - Divi 5. Blocks plus
attrs._nodeId. v7.0.16 fixed the background overlay key (overlay.enableis what the renderer reads). v7.0.28 fixed the number-counter typed envelope and the button text colour dual-write. v7.0.30 added the_nodeIdfallback for id matching. v7.0.32 added the children-aliases fold (rows,cols,modules) plus a hard-error on silent child drops. - Beaver Builder. v7.0.13 added Box module mappings. v7.0.16 fixed typed-node normalisation (
{type:'row', columns:[…]}). v7.0.17 defaults missing columnsizeto "100" so columns render full-width when the agent omits it. v7.0.25 fixed the top-level font-field stdClass fatal. v7.0.26 expanded that to typography containers. Custom HTML in modules survives the kses bypass. - Bricks. v7.0.23 fixed page-settings deep-merge and the CSS regen API. v7.0.24 closed the file-mode CSS regen gap. v7.0.26 fixed global-class id resolution and the
EDITABLEroute collision that was clobbering the registry. v7.0.27 unified settings normalisation: null deletes,_background.colorand_colorstring lift to{hex, raw}, typography keys migrate into_typography,_gapfans out to_columnGap+_rowGap. - Oxygen Classic. v7.0.18 added the root-wrapped
_ct_builder_jsonshape ({id:0, name:"root", depth:0, children:[…]}). Legacy bare-array pages self-heal on next read. v7.0.17 wraps inject intry/catch \Throwableso third-party plugins hooked intooxy_save_ct_builder_json_metano longer fatal the REST request. - Oxygen 6. Storage is
_oxygen_data, a different format from Classic. v7.0.7 brought deep-intelligence parity. - Breakdance. v7.0.20 added
resolve_breakdance_properties()for every shape an agent emits. v7.0.21 addednest_breakdance_content_section()for the 15 element types whose renderer readscontent.content.*. v7.0.22 fixed append unwrap and the replace-confirmation gate. - WPBakery + Uncode. v7.0.31 added the Uncode adapter pack (
uncode_*andtdb_*shortcodes as first-class elements), pagination onfind_builder_targets, populated labels via decoded content-bearing attrs, andrespira_get_page_outlineplusrespira_get_builder_inline_schemas. Filterable viarespira_wpbakery_shortcode_prefixesfor site-specific extensions.
Rules
- Never use
respira_update_pagefor content edits. It replaces the entire page body and the builder treats the result as a single text blob. - Never guess builder JSON field names. Read first, then write.
- Always run
respira_get_site_contextplusrespira_get_builder_infobefore the first edit on a page you haven't touched in the current session. - For Divi 5, when matching by id, expect both
idandattrs._nodeIdto resolve. - For Bricks file-mode CSS (cssLoading=file), v7.0.24 primes the front-end state so per-element rules emit correctly. No workaround needed.
- When the builder is unknown, call
respira_get_builder_infoand wait for confirmation before editing.
Verification
After every edit:
- Call
respira_find_elementwith the same selector used before the edit. - Confirm the changed field matches the intended value.
- If the element is not found or unchanged, check whether
respira_update_elementreturned an error or a structured soft-fail.
For batch edits:
- Use
respira_diff_snapshotsto compare the before / after snapshot. - Confirm all changed elements are reflected; flag any that are missing.
Escalation
Stop and ask the user if:
respira_get_builder_inforeturns an unknown or unsupported builder.respira_update_elementreturns a soft-fail on a Bricks, Oxygen, or Breakdance element after the v7.0.x fixes have been applied.- The page is protected by a WAF or security plugin that blocks the REST endpoint.
respira_diagnose_connectiondetects Cloudflare-edge write blocks. - The edit would touch more than 20 elements. Confirm scope before proceeding.
Example
Goal: change the hero heading text from "Welcome" to "Get started today."
1. respira_get_builder_info → Elementor 3.21, supported
2. respira_get_page_outline → 4 sections, hero is row 0, primary heading "Welcome"
3. respira_create_page_duplicate → snapshot ID abc123
4. respira_find_element → selector: text="Welcome", type: heading
Result: element ID e7a2, widgetType: heading, settings.title: "Welcome"
5. respira_update_element → element ID e7a2, settings.title: "Get started today."
6. respira_find_element → element ID e7a2
Result: settings.title: "Get started today." ✓
Signals
- GitHub stars
- 43
- Forks
- 8
- Last commit
- Sep 2026
Advanced
- Catalog kind
- skill
- Gateway key
respira-builder-edits- Source
- github.com/respira-press/agent-skills-wordpress