@respira/wordpress-mcp-server 7.2.18 → 7.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/dist/acf-tools.d.ts +0 -10
  2. package/dist/acf-tools.d.ts.map +1 -1
  3. package/dist/acf-tools.js +0 -15
  4. package/dist/acf-tools.js.map +1 -1
  5. package/dist/config.d.ts.map +1 -1
  6. package/dist/config.js +31 -36
  7. package/dist/config.js.map +1 -1
  8. package/dist/server.d.ts +0 -47
  9. package/dist/server.d.ts.map +1 -1
  10. package/dist/server.js +1155 -605
  11. package/dist/server.js.map +1 -1
  12. package/dist/wordpress-client.d.ts +61 -29
  13. package/dist/wordpress-client.d.ts.map +1 -1
  14. package/dist/wordpress-client.js +271 -148
  15. package/dist/wordpress-client.js.map +1 -1
  16. package/package.json +2 -2
  17. package/skills/activity-report-composer/README.md +38 -0
  18. package/skills/activity-report-composer/SKILL.md +167 -0
  19. package/skills/activity-report-composer/metadata.json +42 -0
  20. package/skills/brand-voice-synthesizer/README.md +43 -0
  21. package/skills/brand-voice-synthesizer/SKILL.md +259 -0
  22. package/skills/brand-voice-synthesizer/metadata.json +46 -0
  23. package/skills/build-oxygen6-page/SKILL.md +59 -0
  24. package/skills/conversion-audit/README.md +37 -0
  25. package/skills/conversion-audit/SKILL.md +185 -0
  26. package/skills/conversion-audit/metadata.json +46 -0
  27. package/skills/custom-post-type-architect/README.md +34 -0
  28. package/skills/custom-post-type-architect/SKILL.md +158 -0
  29. package/skills/custom-post-type-architect/metadata.json +39 -0
  30. package/skills/design-system-synthesizer/README.md +46 -0
  31. package/skills/design-system-synthesizer/SKILL.md +395 -0
  32. package/skills/design-system-synthesizer/metadata.json +57 -0
  33. package/skills/figma-to-elementor/SKILL.md +204 -0
  34. package/skills/html-to-bricks/README.md +43 -0
  35. package/skills/html-to-bricks/SKILL.md +135 -0
  36. package/skills/html-to-bricks/metadata.json +41 -0
  37. package/skills/internal-link-builder/SKILL.md +258 -0
  38. package/skills/internal-link-builder/metadata.json +46 -0
  39. package/skills/migrate-beaver-builder-to-bricks/SKILL.md +251 -0
  40. package/skills/migrate-beaver-builder-to-gutenberg/SKILL.md +248 -0
  41. package/skills/migrate-brizy-to-gutenberg/SKILL.md +248 -0
  42. package/skills/migrate-divi-to-breakdance/SKILL.md +312 -0
  43. package/skills/migrate-divi-to-bricks/SKILL.md +321 -0
  44. package/skills/migrate-divi-to-gutenberg/SKILL.md +328 -0
  45. package/skills/migrate-elementor-to-breakdance/SKILL.md +287 -0
  46. package/skills/migrate-elementor-to-bricks/SKILL.md +289 -0
  47. package/skills/migrate-elementor-to-gutenberg/SKILL.md +327 -0
  48. package/skills/migrate-elementor-to-oxygen/SKILL.md +300 -0
  49. package/skills/migrate-oxygen-to-breakdance/SKILL.md +235 -0
  50. package/skills/migrate-oxygen-to-bricks/SKILL.md +237 -0
  51. package/skills/migrate-thrive-architect-to-gutenberg/SKILL.md +257 -0
  52. package/skills/migrate-visual-composer-to-gutenberg/SKILL.md +261 -0
  53. package/skills/migrate-wpbakery-to-bricks/SKILL.md +336 -0
  54. package/skills/migrate-wpbakery-to-gutenberg/SKILL.md +345 -0
  55. package/skills/mobile-experience-report/SKILL.md +719 -0
  56. package/skills/mobile-experience-report/telemetry.ts +137 -0
  57. package/skills/page-template-library/README.md +41 -0
  58. package/skills/page-template-library/SKILL.md +175 -0
  59. package/skills/page-template-library/metadata.json +44 -0
  60. package/skills/prime-the-agent/README.md +49 -0
  61. package/skills/prime-the-agent/SKILL.md +225 -0
  62. package/skills/prime-the-agent/metadata.json +46 -0
  63. package/skills/respira-setup-assistant/SKILL.md +386 -0
  64. package/skills/respira-setup-assistant/metadata.json +36 -0
  65. package/skills/seo-aeo-amplifier/README.md +61 -0
  66. package/skills/seo-aeo-amplifier/SKILL.md +277 -0
  67. package/skills/seo-aeo-amplifier/metadata.json +62 -0
  68. package/skills/stale-content-detector/README.md +41 -0
  69. package/skills/stale-content-detector/SKILL.md +156 -0
  70. package/skills/stale-content-detector/metadata.json +43 -0
  71. package/skills/technical-debt-audit/SKILL.md +691 -0
  72. package/skills/technical-debt-audit/telemetry.ts +142 -0
  73. package/skills/woocommerce-health-check/SKILL.md +719 -0
  74. package/skills/woocommerce-health-check/telemetry.ts +137 -0
  75. package/skills/wordpress-ai-image-optimizer/README.md +49 -0
  76. package/skills/wordpress-ai-image-optimizer/SKILL.md +232 -0
  77. package/skills/wordpress-ai-image-optimizer/metadata.json +63 -0
  78. package/skills/wordpress-site-dna/README.md +81 -0
  79. package/skills/wordpress-site-dna/SKILL.md +669 -0
  80. package/skills/wordpress-site-dna/telemetry.ts +137 -0
  81. package/dist/__tests__/acf-tool-routing.test.d.ts +0 -2
  82. package/dist/__tests__/acf-tool-routing.test.d.ts.map +0 -1
  83. package/dist/__tests__/acf-tool-routing.test.js +0 -37
  84. package/dist/__tests__/acf-tool-routing.test.js.map +0 -1
  85. package/dist/__tests__/cowork-bootstrap.test.d.ts +0 -2
  86. package/dist/__tests__/cowork-bootstrap.test.d.ts.map +0 -1
  87. package/dist/__tests__/cowork-bootstrap.test.js +0 -61
  88. package/dist/__tests__/cowork-bootstrap.test.js.map +0 -1
@@ -0,0 +1,327 @@
1
+ # Migrate Elementor to Gutenberg
2
+
3
+ **Version:** 2.0.0
4
+ **Updated:** 2026-06-30
5
+ **Freshly updated:** v2.0.0 wires in current Respira safety and precision. Pre-migration now inventories source pages with `respira_find_builder_targets`. Every write is preceded by a `respira_get_snapshot`, and the existing draft-duplicate path is kept. After the initial content write, validation issues (block nesting, broken refs) are corrected surgically with `respira_find_element` + `respira_update_element` (and `respira_batch_update` for multi-block or multi-page fixes) instead of rewriting whole pages. Snapshot restore and draft deletion are now explicit rollback paths. Reflects the current 16 supported builders.
6
+
7
+ Converts Elementor-built WordPress pages to native Gutenberg blocks. Reads Elementor's JSON widget tree from post meta, maps each widget to its closest core block equivalent, generates a migration plan for approval, and writes clean block markup to the target pages. Use this skill whenever someone wants to move from Elementor to Gutenberg, eliminate page builder dependencies, go back to native WordPress blocks, or simplify their tech stack by dropping Elementor.
8
+
9
+ ## What This Skill Does
10
+
11
+ Moving from Elementor to Gutenberg is one of the most common — and most complex — builder migrations. Elementor stores content as a deeply nested JSON tree in `_elementor_data`, while Gutenberg uses HTML comments (`<!-- wp:block -->`) inline with content in `post_content`. Every layout decision Elementor makes with JSON settings must be translated into block attributes, CSS classes, or Group/Columns block structures.
12
+
13
+ This skill handles that translation systematically: it reads every Elementor widget, finds the right Gutenberg block, maps settings as closely as possible, and flags anything that needs manual attention. The result is clean, dependency-free WordPress content. Elementor and Gutenberg are both among the 16 page builders Respira reads and writes natively, so extraction and the block write run through the same builder-aware tooling Respira uses everywhere else.
14
+
15
+ **Handles:**
16
+ - Section/Column layouts → Group and Columns blocks with appropriate width settings
17
+ - Text Editor → Paragraph blocks (preserving inline formatting)
18
+ - Heading → Heading block (h1-h6 mapping)
19
+ - Image → Image block (with alt text, caption, link)
20
+ - Video → Video or Embed block (YouTube/Vimeo detected)
21
+ - Button → Buttons block (with link, style, colors)
22
+ - Icon List → List block
23
+ - Spacer → Spacer block
24
+ - Divider → Separator block
25
+ - Google Maps → Custom HTML block with embed
26
+ - Tabs, Accordion → Group blocks with Details block (WP 6.3+) or HTML fallback
27
+ - Image Gallery → Gallery block
28
+ - Counter, Progress Bar → HTML or Group block approximations
29
+ - Custom HTML → Custom HTML block (direct transfer)
30
+ - Responsive visibility → block-level responsive classes (theme-dependent)
31
+
32
+ **Preserves:**
33
+ - All text content, headings, and inline formatting (bold, italic, links)
34
+ - Image URLs, alt text, captions, and link targets
35
+ - Button labels, URLs, and target attributes
36
+ - Color values applied as block-level styles
37
+ - Basic spacing via Spacer blocks
38
+ - Heading hierarchy (h1-h6)
39
+ - List content and structure
40
+ - Embedded media URLs
41
+
42
+ ## What This Skill Does NOT Do
43
+
44
+ - **Complex multi-column layouts** — Elementor allows pixel-level column width control and nested sections. Gutenberg Columns blocks support percentage widths but with less precision. Complex grid layouts may need manual adjustment or a block-based layout plugin.
45
+ - **Elementor Pro widgets** — Posts grid, portfolio, price table, price list, flip box, call to action, and similar Pro widgets have no core Gutenberg equivalent. They are flagged for manual recreation.
46
+ - **Third-party addon widgets** — Essential Addons, JetElements, Crocoblock widgets cannot be auto-mapped.
47
+ - **Dynamic content** — ACF fields, custom loops, and dynamic tags require separate solutions (ACF blocks, custom block patterns, or Query Loop block).
48
+ - **Theme Builder templates** — Headers, footers, archive templates are outside page content scope.
49
+ - **Advanced animations** — Motion effects, parallax scrolling, entrance animations have no Gutenberg equivalent.
50
+ - **Form widgets** — Elementor forms need a forms plugin replacement (WPForms, Gravity Forms, etc.).
51
+ - **Popup content** — Elementor popups are not page content and are excluded.
52
+ - **Design fidelity** — Gutenberg is intentionally simpler. Expect a cleaner but less visually identical result. This is a feature, not a bug — you are trading design complexity for simplicity and performance.
53
+
54
+ ## Requirements
55
+
56
+ - Respira for WordPress plugin installed and connected
57
+ - MCP connection active (desktop or WebMCP)
58
+ - Elementor plugin active (to read source content)
59
+ - WordPress 6.0+ (for modern block features; 6.3+ recommended for Details block)
60
+ - A block-compatible theme (Twenty Twenty-Three, Astra, Kadence, GeneratePress, etc.)
61
+ - Read access to scan Elementor content
62
+ - Write access to create duplicates with Gutenberg content
63
+
64
+ ## Trigger Phrase
65
+
66
+ - "migrate elementor to gutenberg"
67
+
68
+ ## Alternative Triggers
69
+
70
+ - "convert elementor to blocks"
71
+ - "switch from elementor to gutenberg"
72
+ - "remove elementor dependency"
73
+ - "go back to native wordpress"
74
+ - "rebuild elementor pages with blocks"
75
+ - "elementor to block editor"
76
+ - "decommission elementor"
77
+
78
+ ## Source Builder: Elementor
79
+
80
+ Elementor stores page content in the `_elementor_data` post meta field as a JSON string. The structure is a nested tree:
81
+
82
+ ```
83
+ Document
84
+ └─ Section (type: "section")
85
+ ├─ settings: { structure, layout, content_width, ... }
86
+ └─ elements: [
87
+ Column (type: "column")
88
+ ├─ settings: { _column_size, ... }
89
+ └─ elements: [
90
+ Widget (type: "widget", widgetType: "heading")
91
+ └─ settings: { title, size, header_size, ... }
92
+ ]
93
+ ]
94
+ ```
95
+
96
+ Key Elementor specifics:
97
+ - **Widget types** are in the `widgetType` field (e.g., `heading`, `text-editor`, `image`, `button`)
98
+ - **Responsive settings** use suffixes: `margin`, `margin_tablet`, `margin_mobile`
99
+ - **CSS** is cached in `_elementor_css` post meta — not needed for migration but useful for verification
100
+ - **Page settings** in `_elementor_page_settings` (page layout, hide title, etc.)
101
+ - **Global widgets** reference a template via `templateID` — must be resolved before mapping
102
+ - **Nested sections** (Inner Section widget) create sub-layouts within columns
103
+
104
+ Read Elementor content via `respira_extract_builder_content` with `builder=elementor`.
105
+
106
+ ## Target: Gutenberg (Block Editor)
107
+
108
+ Gutenberg stores content directly in `post_content` as HTML with block comment delimiters:
109
+
110
+ ```html
111
+ <!-- wp:group {"layout":{"type":"constrained"}} -->
112
+ <div class="wp-block-group">
113
+ <!-- wp:heading {"level":2} -->
114
+ <h2 class="wp-block-heading">Title Here</h2>
115
+ <!-- /wp:heading -->
116
+
117
+ <!-- wp:paragraph -->
118
+ <p>Content here with <strong>formatting</strong>.</p>
119
+ <!-- /wp:paragraph -->
120
+ </div>
121
+ <!-- /wp:group -->
122
+ ```
123
+
124
+ Key Gutenberg specifics:
125
+ - Block attributes are JSON in the opening comment: `<!-- wp:image {"id":123,"sizeSlug":"large"} -->`
126
+ - Layout blocks: `wp:group`, `wp:columns`, `wp:column`
127
+ - Style attributes go in the block JSON: `{"style":{"color":{"background":"#fff"},"spacing":{"padding":{"top":"2rem"}}}}`
128
+ - No separate meta storage — everything is in `post_content`
129
+ - Columns use percentage widths: `<!-- wp:column {"width":"33.33%"} -->`
130
+
131
+ Write Gutenberg content via `respira_update_page` or `respira_update_post` targeting the `content` field.
132
+
133
+ ## Execution Workflow
134
+
135
+ ### Phase 1: Pre-Migration Audit
136
+
137
+ 1. Verify Respira + MCP connection via `respira_get_site_context`. If unavailable, stop and show setup guidance.
138
+ 2. Confirm Elementor is active via `respira_list_plugins`.
139
+ 3. Check WordPress version (6.0+ required, 6.3+ ideal).
140
+ 4. Identify active theme — note if it is block-theme compatible.
141
+ 5. Inventory and scope the source pages with `respira_find_builder_targets` (builder=elementor) — a fast, ranked list of every Elementor-built page/post before you touch anything. Fall back to `respira_list_pages` / `respira_list_posts` + `respira_get_builder_info` to confirm builder per item where needed.
142
+ 6. For each Elementor page, extract content via `respira_extract_builder_content` with `builder=elementor`
143
+ 7. Build an inventory:
144
+ - Total pages/posts using Elementor
145
+ - Widget types used (frequency count)
146
+ - Pro-only widgets detected
147
+ - Third-party addon widgets detected
148
+ - Dynamic tags and global widgets
149
+ - Layout complexity score per page (nesting depth, column configurations)
150
+ - Estimated migration complexity (simple/moderate/complex)
151
+
152
+ ### Phase 2: Migration Plan
153
+
154
+ Present a detailed plan acknowledging that Gutenberg migration involves the most interpretation:
155
+
156
+ ```
157
+ ## Elementor → Gutenberg Migration Plan
158
+
159
+ ### Important Context
160
+ Gutenberg is intentionally simpler than Elementor. This migration prioritizes
161
+ content preservation and clean markup over pixel-perfect layout recreation.
162
+ Some design adjustments will be needed post-migration.
163
+
164
+ ### Site Inventory
165
+ - Total Elementor pages: X
166
+ - Total widgets to convert: X
167
+ - Direct block equivalents: X (Y%)
168
+ - Approximate equivalents (layout may differ): X (Y%)
169
+ - No equivalent — manual recreation needed: X (Y%)
170
+
171
+ ### Widget Mapping Summary
172
+ | Elementor Widget | Gutenberg Block | Fidelity |
173
+ |-----------------|----------------|----------|
174
+ | heading | wp:heading | Exact |
175
+ | text-editor | wp:paragraph | Exact |
176
+ | image | wp:image | Exact |
177
+ | section+columns | wp:group+columns| Close |
178
+ | tabs | wp:details (6.3+)| Approx |
179
+ | form | — | Manual |
180
+
181
+ ### Layout Simplification Notes
182
+ - [Specific notes about how complex Elementor layouts will be simplified]
183
+ - [Column configurations that will change]
184
+ - [Sections that will become Groups]
185
+
186
+ ### Page-by-Page Plan
187
+ 1. **[Page Title]** — X widgets, [simple/moderate/complex]
188
+ - Direct conversions: X
189
+ - Approximate conversions: X
190
+ - Manual items: X — [details]
191
+ 2. ...
192
+ ```
193
+
194
+ Ask for confirmation:
195
+ > This migration will produce cleaner, faster-loading pages but with simpler layouts than Elementor.
196
+ > 1. Migrate all pages
197
+ > 2. Migrate specific pages
198
+ > 3. Start with a test page (recommended for complex sites)
199
+ > 4. Just keep this plan
200
+
201
+ ### Phase 3: Page-by-Page Migration
202
+
203
+ For each approved page:
204
+
205
+ 1. Read full Elementor content via `respira_extract_builder_content` with `builder=elementor`
206
+ 2. Walk the Elementor JSON tree depth-first:
207
+ - Convert Section → `<!-- wp:group -->` with constrained layout
208
+ - Convert Column structures → `<!-- wp:columns -->` and `<!-- wp:column {"width":"X%"} -->`
209
+ - Convert each widget to appropriate block:
210
+ - `heading` → `<!-- wp:heading {"level":N} --><hN>text</hN><!-- /wp:heading -->`
211
+ - `text-editor` → `<!-- wp:paragraph --><p>text</p><!-- /wp:paragraph -->`
212
+ - `image` → `<!-- wp:image {"id":N,"sizeSlug":"large"} --><figure>...</figure><!-- /wp:image -->`
213
+ - `button` → `<!-- wp:buttons --><div class="wp-block-buttons"><!-- wp:button -->...<!-- /wp:button --></div><!-- /wp:buttons -->`
214
+ - Map colors and spacing to block-level `style` attributes where possible
215
+ - Convert background images to Group block background or Cover block
216
+ - Flag unmappable widgets with `<!-- MIGRATION NOTE: [widget type] needs manual recreation -->`
217
+ 3. Assemble complete block markup with proper nesting and closing tags
218
+ 4. Create a duplicate page via `respira_create_page_duplicate` or `respira_create_post_duplicate`
219
+ 5. Before writing, take a snapshot with `respira_get_snapshot` so the duplicate's pre-write state can be restored if anything goes wrong
220
+ 6. Write block content to the duplicate via `respira_update_page` or `respira_update_post`
221
+ 7. Surgical fix pass — if the converted page has validation issues (broken block nesting, a misconverted block, a dangling reference), do not rewrite the whole page. Locate the specific element with `respira_find_element` and correct it with `respira_update_element`. For repeated fixes across many blocks or several pages, batch them with `respira_batch_update`
222
+ 8. Report: widgets converted, items flagged, known layout differences
223
+
224
+ ### Phase 4: Post-Migration Verification
225
+
226
+ 1. Summarize all migrations:
227
+ - Pages migrated
228
+ - Widgets converted to blocks
229
+ - Items needing manual attention
230
+ - Layout simplifications made
231
+ 2. For each migrated page, provide:
232
+ - Link to edit the duplicate in Gutenberg
233
+ - Flagged items requiring manual recreation
234
+ - Layout notes (where the Gutenberg version differs from Elementor)
235
+ 3. Post-migration checklist:
236
+ - [ ] Open each duplicate in block editor — verify blocks are valid
237
+ - [ ] Check responsive preview (tablet/mobile in block editor)
238
+ - [ ] Verify images, links, and media
239
+ - [ ] Recreate flagged widgets manually (forms, sliders, etc.)
240
+ - [ ] Add any needed block patterns or reusable blocks
241
+ - [ ] Consider a forms plugin replacement for Elementor forms
242
+ - [ ] Test interactive elements
243
+ - [ ] Review page speed improvement (should be noticeable)
244
+
245
+ ## Safety Model
246
+
247
+ - Read-only analysis first — full content scan before any changes
248
+ - Explicit user confirmation required before creating any duplicates
249
+ - Original Elementor pages are never modified or deleted
250
+ - All migrated content goes to draft duplicates only
251
+ - Never auto-publishes migrated pages
252
+ - Takes a `respira_get_snapshot` of each duplicate before any write, so its pre-write state can be restored
253
+ - Two explicit rollback paths: restore the snapshot with `respira_restore_snapshot`, or delete the draft duplicates entirely with `respira_delete_page` / `respira_delete_post`
254
+ - Surgical fixes (`respira_find_element` + `respira_update_element`, or `respira_batch_update`) replace whole-page rewrites, so corrections stay scoped and reversible
255
+ - Warns about significant layout changes before proceeding
256
+
257
+ ## Honest Disclaimer
258
+
259
+ This skill converts Elementor page content to Gutenberg blocks and creates draft duplicates for review.
260
+
261
+ It cannot:
262
+ - Replicate Elementor's design precision in Gutenberg
263
+ - Auto-convert Pro widgets, addon widgets, or forms
264
+ - Migrate dynamic content or theme builder templates
265
+ - Replace the need for visual review and manual fine-tuning
266
+ - Make Gutenberg do things it was not designed for
267
+
268
+ It can:
269
+ - Convert 60-80% of standard Elementor content to clean blocks
270
+ - Eliminate your Elementor dependency for simpler pages
271
+ - Dramatically improve page load speed (no Elementor CSS/JS overhead)
272
+ - Produce clean, standards-compliant WordPress content
273
+ - Give you a clear roadmap for what needs manual attention
274
+ - Keep your original pages completely untouched
275
+
276
+ ## Tooling
277
+
278
+ **Core WordPress tools**
279
+ - `respira_get_site_context`
280
+ - `respira_list_plugins`
281
+ - `respira_list_pages`
282
+ - `respira_list_posts`
283
+ - `respira_read_page`
284
+ - `respira_read_post`
285
+ - `respira_get_builder_info`
286
+ - `respira_extract_builder_content`
287
+ - `respira_find_builder_targets`
288
+ - `respira_create_page_duplicate`
289
+ - `respira_create_post_duplicate`
290
+ - `respira_update_page`
291
+ - `respira_update_post`
292
+
293
+ **Safety and precision tools**
294
+ - `respira_get_snapshot`
295
+ - `respira_restore_snapshot`
296
+ - `respira_find_element`
297
+ - `respira_update_element`
298
+ - `respira_batch_update`
299
+ - `respira_delete_page`
300
+ - `respira_delete_post`
301
+
302
+ ## Telemetry
303
+
304
+ After run completion, send fire-and-forget usage tracking to:
305
+
306
+ - `POST https://www.respira.press/api/skills/track-usage`
307
+
308
+ Include:
309
+ - `skill_slug = migrate-elementor-to-gutenberg`
310
+ - site/version context
311
+ - duration and success
312
+ - pages migrated, blocks created, widgets flagged counts
313
+ - tools used
314
+
315
+ Never block user flow on telemetry failure.
316
+
317
+ ## Related Skills
318
+
319
+ - WordPress Site DNA (understand site structure before migrating)
320
+ - Internal Link Builder (verify internal links post-migration)
321
+ - SEO & AEO Amplifier (verify SEO preservation post-migration)
322
+ - Technical Debt Audit (clean up Elementor remnants after full migration)
323
+
324
+ ---
325
+
326
+ Built by Respira Team
327
+ https://respira.press/skills/migrate-elementor-to-gutenberg
@@ -0,0 +1,300 @@
1
+ # Migrate Elementor to Oxygen
2
+
3
+ **Version:** 2.0.0
4
+ **Updated:** 2026-06-30
5
+ **Freshly updated:** v2.0.0 wires in current Respira safety and precision. Pre-migration now inventories source pages with `respira_find_builder_targets`. Every write is preceded by a `respira_get_snapshot`, and the existing draft-duplicate path is kept. After the initial `respira_inject_builder_content`, validation issues (column widths, broken refs) are corrected surgically with `respira_find_element` + `respira_update_element` (and `respira_batch_update` for multi-element or multi-page fixes) instead of re-injecting whole pages. Snapshot restore and draft deletion are now explicit rollback paths. Reflects the current 16 supported builders.
6
+
7
+ Converts Elementor-built WordPress pages to Oxygen Builder. Reads Elementor's JSON widget tree from post meta, maps each widget to its Oxygen component equivalent, generates a migration plan for approval, and writes Oxygen content to the target pages. Use this skill whenever someone wants to move from Elementor to Oxygen, switch to Oxygen's developer-oriented builder, or rebuild Elementor pages in Oxygen.
8
+
9
+ ## What This Skill Does
10
+
11
+ Oxygen is a fundamentally different kind of builder than Elementor — it outputs clean HTML/CSS without wrapper divs, gives direct access to CSS properties, and thinks in terms of components rather than widgets. This migration requires not just content transfer but a philosophical shift: Elementor's widget-based approach maps to Oxygen's component-based architecture where you have more control but less hand-holding. Both Elementor and Oxygen are among the 16 page builders Respira reads and writes natively, so extraction and injection run through the same builder-aware tooling Respira uses everywhere else.
12
+
13
+ **Handles:**
14
+ - Section/Column layouts → Oxygen Section/Columns/Div components
15
+ - Text Editor, Heading → Oxygen Text and Heading components
16
+ - Image, Video, Button → native Oxygen equivalents
17
+ - Icon, Icon Box → Oxygen icon components
18
+ - Tabs, Accordion → Oxygen interactive components
19
+ - Spacer, Divider → CSS spacing or Oxygen separator
20
+ - Google Maps → Oxygen map component
21
+ - Code Block, Custom HTML → Oxygen Code Block
22
+ - Image Gallery → Oxygen Gallery component
23
+ - Custom CSS → Oxygen's stylesheet or custom CSS fields
24
+ - Responsive settings → Oxygen media query breakpoints
25
+
26
+ **Preserves:**
27
+ - All text content, headings, and inline formatting
28
+ - Image URLs, alt text, captions, and links
29
+ - Typography settings (mapped to Oxygen's CSS-based typography controls)
30
+ - Color values (hex, rgb, rgba)
31
+ - Spacing values (margin, padding)
32
+ - Background images and gradients
33
+ - Border and shadow CSS properties
34
+ - Link URLs and targets
35
+ - CSS classes
36
+
37
+ ## What This Skill Does NOT Do
38
+
39
+ - **Third-party Elementor addons** — Essential Addons, JetElements, Crocoblock widgets are flagged for manual migration. Oxygen has its own ecosystem of components.
40
+ - **Elementor Pro dynamic tags** — Oxygen has powerful dynamic data capabilities but with a completely different interface. Dynamic content is flagged for manual setup.
41
+ - **Theme Builder templates** — Elementor's template system is separate from Oxygen's template system. Templates need to be recreated in Oxygen.
42
+ - **Form widgets** — Elementor forms need Oxygen's form component or a third-party solution.
43
+ - **Popup content** — Must be rebuilt using Oxygen's modal/lightbox functionality.
44
+ - **WooCommerce widgets** — Oxygen has its own WooCommerce components that must be configured independently.
45
+ - **Motion effects and animations** — Oxygen uses CSS animations directly; Elementor's motion effects don't map 1:1.
46
+ - **Responsive precision** — Oxygen uses explicit media query breakpoints (1120px, 992px, 768px, 480px by default) which differ from Elementor's breakpoints.
47
+
48
+ ## Requirements
49
+
50
+ - Respira for WordPress plugin installed and connected
51
+ - MCP connection active (desktop or WebMCP)
52
+ - Elementor plugin active (to read source content)
53
+ - Oxygen Builder installed and active (to write target content)
54
+ - Read access to scan Elementor content
55
+ - Write access to create duplicates with Oxygen content
56
+
57
+ ## Trigger Phrase
58
+
59
+ - "migrate elementor to oxygen"
60
+
61
+ ## Alternative Triggers
62
+
63
+ - "convert elementor to oxygen"
64
+ - "switch from elementor to oxygen"
65
+ - "rebuild elementor in oxygen"
66
+ - "move from elementor to oxygen"
67
+ - "elementor to oxygen migration"
68
+
69
+ ## Source Builder: Elementor
70
+
71
+ Elementor stores page content in the `_elementor_data` post meta field as a JSON string. The structure is a nested tree:
72
+
73
+ ```
74
+ Document
75
+ └─ Section (type: "section")
76
+ ├─ settings: { structure, layout, content_width, ... }
77
+ └─ elements: [
78
+ Column (type: "column")
79
+ ├─ settings: { _column_size, ... }
80
+ └─ elements: [
81
+ Widget (type: "widget", widgetType: "heading")
82
+ └─ settings: { title, size, header_size, ... }
83
+ ]
84
+ ]
85
+ ```
86
+
87
+ Key Elementor specifics:
88
+ - **Widget types** are in the `widgetType` field
89
+ - **Responsive settings** use suffixes: `_tablet`, `_mobile`
90
+ - **CSS** cached in `_elementor_css` post meta
91
+ - **Page settings** in `_elementor_page_settings`
92
+ - **Global widgets** reference templates via `templateID`
93
+
94
+ Read Elementor content via `respira_extract_builder_content` with `builder=elementor`.
95
+
96
+ ## Target Builder: Oxygen
97
+
98
+ Oxygen stores content in the `ct_builder_shortcodes` post meta field. Despite the name, modern Oxygen uses a JSON-based structure internally.
99
+
100
+ Key Oxygen specifics:
101
+ - Components include: `ct_section`, `ct_row`, `ct_column`, `ct_div_block`, `ct_headline`, `ct_text_block`, `ct_image`, `ct_link_button`
102
+ - Oxygen outputs clean HTML — minimal wrapper divs, direct CSS properties
103
+ - CSS is stored per-component with explicit property names (not shorthand)
104
+ - Responsive design uses media query breakpoints: default, 1120px, 992px, 768px, 480px
105
+ - Oxygen's ID system uses numeric component IDs
106
+ - Reusable parts are stored as `ct_template` post type
107
+ - Oxygen disables the theme — it controls all output directly
108
+
109
+ Write Oxygen content via `respira_inject_builder_content` with `builder=oxygen`.
110
+
111
+ ## Execution Workflow
112
+
113
+ ### Phase 1: Pre-Migration Audit
114
+
115
+ 1. Verify Respira + MCP connection via `respira_get_site_context`. If unavailable, stop and show setup guidance.
116
+ 2. Confirm Elementor is active via `respira_list_plugins`.
117
+ 3. Confirm Oxygen is installed and active via `respira_list_plugins`.
118
+ 4. **Important**: Note that Oxygen disables the WordPress theme. Verify the user understands this architectural difference.
119
+ 5. Inventory and scope the source pages with `respira_find_builder_targets` (builder=elementor) — a fast, ranked list of every Elementor-built page/post before you touch anything. Fall back to `respira_list_pages` / `respira_list_posts` + `respira_get_builder_info` to confirm builder per item where needed.
120
+ 6. For each Elementor page, extract content via `respira_extract_builder_content` with `builder=elementor`
121
+ 7. Build an inventory:
122
+ - Total pages/posts using Elementor
123
+ - Widget types used (frequency count)
124
+ - Third-party addon widgets detected
125
+ - Dynamic tags and global widgets
126
+ - Layout complexity per page
127
+ - Estimated migration difficulty (simple/moderate/complex)
128
+
129
+ ### Phase 2: Migration Plan
130
+
131
+ Present a migration plan that acknowledges the architectural differences:
132
+
133
+ ```
134
+ ## Elementor → Oxygen Migration Plan
135
+
136
+ ### Architectural Note
137
+ Oxygen takes full control of your site's output — it disables your WordPress
138
+ theme entirely. This is a significant architectural change from Elementor,
139
+ which works alongside your theme. Plan accordingly for headers, footers,
140
+ and archive templates.
141
+
142
+ ### Site Inventory
143
+ - Total Elementor pages: X
144
+ - Total widgets to convert: X
145
+ - Auto-convertible: X (Y%)
146
+ - Manual attention: X (Y%)
147
+
148
+ ### Component Mapping Summary
149
+ | Elementor Widget | Oxygen Component | Status |
150
+ |------------------|-----------------|--------|
151
+ | heading | ct_headline | Auto |
152
+ | text-editor | ct_text_block | Auto |
153
+ | image | ct_image | Auto |
154
+ | button | ct_link_button | Auto |
155
+ | section/columns | ct_section/row | Auto |
156
+ | [addon widget] | — | Manual |
157
+
158
+ ### Page-by-Page Plan
159
+ 1. **[Page Title]** — X widgets, [complexity]
160
+ - Auto-convertible: X
161
+ - Needs attention: [details]
162
+ 2. ...
163
+
164
+ ### Post-Migration Requirements
165
+ - Oxygen templates needed for: header, footer, archive, single post
166
+ - [Any theme-dependent features that need Oxygen equivalents]
167
+ ```
168
+
169
+ Ask for confirmation:
170
+ > Oxygen is a powerful but different paradigm from Elementor. Your originals stay safe.
171
+ > 1. Migrate all pages
172
+ > 2. Migrate specific pages
173
+ > 3. Start with a test page (recommended)
174
+ > 4. Just keep this plan
175
+
176
+ ### Phase 3: Page-by-Page Migration
177
+
178
+ For each approved page:
179
+
180
+ 1. Read full Elementor content via `respira_extract_builder_content` with `builder=elementor`
181
+ 2. Walk the Elementor JSON tree and map:
182
+ - Section → `ct_section`
183
+ - Column → `ct_column` within `ct_row`
184
+ - heading → `ct_headline` (map `header_size` to tag, `title` to text)
185
+ - text-editor → `ct_text_block` (preserve HTML content)
186
+ - image → `ct_image` (map src, alt, dimensions)
187
+ - button → `ct_link_button` (map label, URL, target)
188
+ - Map CSS properties directly (Oxygen uses explicit CSS, not abstracted settings)
189
+ - Convert Elementor responsive suffixes to Oxygen media query breakpoint keys
190
+ - Resolve global widgets to inline content
191
+ - Flag unmappable widgets
192
+ 3. Generate valid Oxygen component structure
193
+ 4. Create a duplicate via `respira_create_page_duplicate` or `respira_create_post_duplicate`
194
+ 5. Before writing, take a snapshot with `respira_get_snapshot` so the duplicate's pre-write state can be restored if anything goes wrong
195
+ 6. Write Oxygen content to the duplicate via `respira_inject_builder_content` with `builder=oxygen`
196
+ 7. Surgical fix pass — if the injected page has validation issues (collapsed column widths, broken parent refs, a misconverted component), do not re-inject the whole page. Locate the specific element with `respira_find_element` and correct it with `respira_update_element`. For repeated fixes across many components or several pages, batch them with `respira_batch_update`
197
+ 8. Report status
198
+
199
+ ### Phase 4: Post-Migration Verification
200
+
201
+ 1. Summarize all migrations:
202
+ - Pages migrated, components created, items flagged
203
+ 2. For each migrated page:
204
+ - Link to edit in Oxygen
205
+ - Flagged items list
206
+ - CSS property notes (where Oxygen's approach differs)
207
+ 3. Post-migration checklist:
208
+ - [ ] Open each duplicate in Oxygen editor
209
+ - [ ] Verify layout structure and component hierarchy
210
+ - [ ] Check responsive at each Oxygen breakpoint (1120px, 992px, 768px, 480px)
211
+ - [ ] Verify images and media
212
+ - [ ] Test links and buttons
213
+ - [ ] Recreate flagged elements manually
214
+ - [ ] Set up Oxygen templates for header/footer if not yet done
215
+ - [ ] Review Oxygen's clean HTML output
216
+ - [ ] Compare with Elementor original side-by-side
217
+
218
+ ## Safety Model
219
+
220
+ - Read-only analysis first — full content scan before any changes
221
+ - Explicit user confirmation required before creating duplicates
222
+ - Original Elementor pages are never modified or deleted
223
+ - All migrated content goes to draft duplicates only
224
+ - Never auto-publishes migrated pages
225
+ - Takes a `respira_get_snapshot` of each duplicate before any write, so its pre-write state can be restored
226
+ - Two explicit rollback paths: restore the snapshot with `respira_restore_snapshot`, or delete the draft duplicates entirely with `respira_delete_page` / `respira_delete_post`
227
+ - Surgical fixes (`respira_find_element` + `respira_update_element`, or `respira_batch_update`) replace whole-page re-injection, so corrections stay scoped and reversible
228
+ - Warns about Oxygen's theme-disabling behavior upfront
229
+
230
+ ## Honest Disclaimer
231
+
232
+ This skill converts Elementor page content to Oxygen format and creates draft duplicates for review.
233
+
234
+ It cannot:
235
+ - Migrate third-party Elementor addon widgets
236
+ - Auto-convert dynamic tags to Oxygen dynamic data
237
+ - Guarantee pixel-perfect visual match
238
+ - Migrate theme builder templates or popups
239
+ - Set up Oxygen's global templates (header, footer, etc.)
240
+ - Replace visual QA review
241
+
242
+ It can:
243
+ - Convert 80-90% of standard Elementor widgets to Oxygen components
244
+ - Produce cleaner HTML output than Elementor
245
+ - Preserve all text content, images, links, and core styling
246
+ - Save significant rebuilding time
247
+ - Flag everything needing manual attention
248
+ - Keep original pages untouched
249
+
250
+ ## Tooling
251
+
252
+ **Core WordPress tools**
253
+ - `respira_get_site_context`
254
+ - `respira_list_plugins`
255
+ - `respira_list_pages`
256
+ - `respira_list_posts`
257
+ - `respira_read_page`
258
+ - `respira_read_post`
259
+ - `respira_get_builder_info`
260
+ - `respira_extract_builder_content`
261
+ - `respira_inject_builder_content`
262
+ - `respira_find_builder_targets`
263
+ - `respira_create_page_duplicate`
264
+ - `respira_create_post_duplicate`
265
+
266
+ **Safety and precision tools**
267
+ - `respira_get_snapshot`
268
+ - `respira_restore_snapshot`
269
+ - `respira_find_element`
270
+ - `respira_update_element`
271
+ - `respira_batch_update`
272
+ - `respira_delete_page`
273
+ - `respira_delete_post`
274
+
275
+ ## Telemetry
276
+
277
+ After run completion, send fire-and-forget usage tracking to:
278
+
279
+ - `POST https://www.respira.press/api/skills/track-usage`
280
+
281
+ Include:
282
+ - `skill_slug = migrate-elementor-to-oxygen`
283
+ - site/version context
284
+ - duration and success
285
+ - pages migrated, components created, items flagged counts
286
+ - tools used
287
+
288
+ Never block user flow on telemetry failure.
289
+
290
+ ## Related Skills
291
+
292
+ - WordPress Site DNA (understand site structure before migrating)
293
+ - Internal Link Builder (verify internal links post-migration)
294
+ - SEO & AEO Amplifier (verify SEO preservation post-migration)
295
+ - Technical Debt Audit (clean up post-migration)
296
+
297
+ ---
298
+
299
+ Built by Respira Team
300
+ https://respira.press/skills/migrate-elementor-to-oxygen