[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-wix-rp-source-wordpress":3,"mdc--onnyp7-key":36,"related-org-wix-rp-source-wordpress":1277,"related-repo-wix-rp-source-wordpress":1431},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":25,"repoUrl":26,"updatedAt":27,"license":28,"forks":29,"topics":30,"repo":31,"sourceUrl":34,"mdContent":35},"rp-source-wordpress","capture data from WordPress and WooCommerce","WordPress and WooCommerce source adapter: REST capture, auth, pagination, and read contract for codegen. Use when the source platform is WordPress or WooCommerce.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"wix","Wix","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fwix.jpg",[12,16,19,22],{"name":13,"slug":14,"type":15},"Data Engineering","data-engineering","tag",{"name":17,"slug":18,"type":15},"WooCommerce","woocommerce",{"name":20,"slug":21,"type":15},"WordPress","wordpress",{"name":23,"slug":24,"type":15},"REST API","rest-api",23,"https:\u002F\u002Fgithub.com\u002Fwix\u002Fskills","2026-07-01T08:08:00.69949",null,28,[],{"repoUrl":26,"stars":25,"forks":29,"topics":32,"description":33},[],"Wix Skills","https:\u002F\u002Fgithub.com\u002Fwix\u002Fskills\u002Ftree\u002FHEAD\u002Freplatform\u002Frp-source-wordpress","---\nname: rp-source-wordpress\ndescription: >-\n  WordPress and WooCommerce source adapter: REST capture, auth, pagination, and read\n  contract for codegen. Use when the source platform is WordPress or WooCommerce.\n---\n\n# rp-source-wordpress\n\nWordPress \u002F WooCommerce **source adapter**. Owns every WordPress-specific detail the\nplatform-agnostic skills must not hardcode: how to capture the schema, how to read the\ndata, auth models, pagination, and REST quirks.\n\n## When this skill is used\n\nThis is not a stage in the migration flow — it is a reference consulted by two stages:\n\n- **`rp-discovery`** consults the *Capture* section to sample the source and produce the\n  canonical `source-profile.md` + `source-schema.json`.\n- **`rp-import-codegen`** consults the *Read contract* section to generate a reader that\n  bulk-extracts WordPress data correctly (auth, pagination, `wc\u002Fv3` vs `wp\u002Fv2`) into\n  durable project-local files for the later import step.\n\n`rp-execute-import` never consults this skill — by the time execution runs, the\nWordPress-specific knowledge is already baked into the generated reader code. Keeping the\nWordPress knowledge here is what lets the rest of the workflow stay platform-agnostic.\n\n## Platform identity\n\n- Source platform: WordPress (core REST `wp\u002Fv2`), optionally WooCommerce (`wc\u002Fv3`).\n- Detect by hitting `\u003Cbase-url>\u002Fwp-json\u002F` — the REST index lists advertised namespaces.\n- Set `\"platform\": \"wordpress\"` (and note WooCommerce presence in `sourceMeta`) in the\n  emitted `source-schema.json`.\n\n## Capture (discovery-time)\n\nSampling the source to learn its shape — **not** a bulk export.\n\nBefore capture, verify `migrations\u002F\u003Cproject>\u002Fconfig\u002Fsource.wordpress.env`. Create it if\nmissing, using empty values for the user to fill:\n\n```bash\nWP_BASE_URL=\nWP_USERNAME=\nWP_APPLICATION_PASSWORD=\nWP_MEDIA_URL_REWRITE_FROM=\nWP_MEDIA_URL_REWRITE_TO=\nWC_CONSUMER_KEY=\nWC_CONSUMER_SECRET=\n```\n\nRequired for a complete WordPress\u002FWooCommerce capture:\n\n- `WP_BASE_URL`\n- `WP_USERNAME`\n- `WP_APPLICATION_PASSWORD`\n\n`WC_CONSUMER_KEY` and `WC_CONSUMER_SECRET` are optional when WooCommerce accepts the\nWordPress Application Password for `wc\u002Fv3` reads; ask for them only if WooCommerce routes\nreturn 401\u002F403 with the WordPress Application Password.\n\n`WP_MEDIA_URL_REWRITE_FROM` and `WP_MEDIA_URL_REWRITE_TO` are optional. Use them when the\nWordPress API is reached through a public tunnel but media\u002Ffile URLs inside records still\npoint at `localhost` or another private origin. If they are blank, generated readers may\nrewrite localhost\u002Fprivate origins to `WP_BASE_URL` when `WP_BASE_URL` is public.\n\n`config\u002Fsource.wordpress.env` is a secret-bearing file once it may contain real values.\nDo not read it with whole-file commands that print its contents into tool output. Check\nonly whether the file exists and whether each required key is present\u002Fblank\u002Fmissing; when\ndescribing status, name keys only and never echo values.\n\n1. Run the deterministic capture script **from this skill's directory** (the folder\n   containing this `SKILL.md`; see `CONVENTIONS.md`):\n\n   ```\n   node scripts\u002Fwp-discovery.js --base-url \u003Curl> --out-dir \u003Cmigrations-root>\u002F\u003Cproject>\u002Fdata\u002Fwp-discovery\n   ```\n\n   It walks the REST index, runs one `OPTIONS` + a small `GET` sample per entity, and\n   writes per-entity markdown (routes, schemas, sample records, record counts,\n   relationships). Pass auth options (see Read contract → Auth) for a complete capture.\n\n2. **Credentials are required for a complete capture.** Without auth, only published\n   public content is reachable; drafts, WooCommerce (`wc\u002Fv3`), user PII, and private\n   fields return 401\u002F403, making their `recordCount`\u002F`inUse` unreliable. The script flags\n   this in its README under \"Incomplete Capture (Authentication)\" — do not treat an\n   unauthenticated run as authoritative.\n\n3. Distinguish **supported** entities (advertised by the REST index) from **used**\n   entities (those with `recordCount > 0`). Entities advertised but empty should be\n   flagged, not mapped as if they hold data.\n\n4. Map known plugins to entity types where relevant (e.g. WooCommerce → store,\n   Seriously Simple Podcasting `ssp\u002Fv1` → podcasts, Yoast → SEO, ACF → custom fields).\n\n5. **Localhost sources and media URLs.** A source at `localhost`, `127.0.0.1`, or another\n   private-only host is valid for discovery and source reads from the user's machine.\n   However, Wix Media import fetches files from the URL using Wix servers, so media URLs\n   like `http:\u002F\u002Flocalhost:8090\u002Fwp-content\u002Fuploads\u002F...` are not reachable by Wix during a\n   live import. This is optional setup and, as far as we know today, only affects media\n   import:\n   - Prefer exposing the local source through a temporary public HTTPS tunnel such as\n     ngrok before live media import.\n   - Or explicitly skip\u002Fdefer media import and continue with non-media entities.\n   - If using ngrok on macOS:\n     1. Install: `brew install ngrok`\n     2. Add an authtoken from the ngrok dashboard:\n        `ngrok config add-authtoken \"\u003CYOUR_AUTHTOKEN>\"`\n     3. Expose the local source port, for example: `ngrok http 8090`\n     4. Set the source base URL to the HTTPS forwarding URL:\n        `export WP_BASE_URL=https:\u002F\u002F\u003Cid>.ngrok-free.app`\n   Record this in `source-profile.md` when the captured source URL is localhost, and note\n   whether media will use the tunnel or be skipped\u002Fdeferred.\n\nThe raw capture is evidence, not a hand-off artifact. `rp-discovery` synthesizes it into\nthe canonical artifacts and records traceability pointers (`rawDiscovery`, per-entity\n`rawFile`).\n\n## Read contract (codegen-time)\n\nWhat a generated WordPress reader must get right. Capture the operational facts below into\n`source-profile.md` during discovery so codegen has them without re-deriving.\n\nThe generated reader is an **extractor**, not an in-memory bulk loader. It should fetch\nWordPress\u002FWooCommerce records page by page and write them to project-local files (for\nexample per-entity paged JSON files plus a manifest) so the import step can read from\ndisk later without re-fetching the source.\n\n**Reuse the shared transport — do not regenerate it.** The auth, URL building, rate-limit\nthrottling, and `Retry-After`-aware 429\u002F503 backoff a reader needs already exist as a\ndependency-free module at `lib\u002Fwp-http.js` in **this skill directory** (the same module\nthe capture script imports). It\nexports `fetchJson`, `buildHeaders`, `configureRateLimit`, and `parseTotalHeader`. Any\ngenerated WordPress reader **must reuse this module rather than reimplementing transport**,\nso the reader contains only per-project orchestration: which entities to pull, the\npagination loop, `_embed`\u002F`_links` resolution, and transform glue. One tested transport\ncore is what makes the sampler and the reader behave identically. *How* the module is\ncarried into a runnable migration project is `rp-import-codegen`'s concern (its File\ntargets), not this adapter's. The notes below describe what the reader does *on top of*\nthat shared core:\n\n- **Namespaces & auth differ per namespace:**\n  - `wp\u002Fv2` (core): HTTP Basic auth with a WordPress **Application Password**\n    (`--username` + `--application-password`).\n  - `wc\u002Fv3` (WooCommerce): **consumer key \u002F secret**, sent as Basic auth over HTTPS (or\n    as query params on some hosts). This is a different credential from the Application\n    Password — both may be needed for a full migration.\n- **Pagination:** `?page=N&per_page=M` (max `per_page` is typically 100). Total pages are\n  in the `X-WP-TotalPages` response header and total records in `X-WP-Total` — read\n  those rather than guessing when to stop.\n- **Embedded relations:** request `?_embed` to inline related resources, or follow the\n  `_links` block (`author`, `wp:featuredmedia`, `wp:term`) to resolve relations. The\n  `evidence` pointers in `source-schema.json` relations come from this `_links` block.\n- **Hierarchical taxonomies:** WordPress categories (and custom hierarchical taxonomies)\n  carry a `parent` field on each term (`0` = top-level). When **any** term has a non-zero\n  `parent`, the source taxonomy is nested. Discovery must elevate this into structured\n  schema — set `\"hierarchical\": true` on that entity in `source-schema.json` (see\n  `source-schema.example.json` → `category`) rather than leaving `parent` buried in the raw\n  dump. The Wix Blog category target is flat (FR-006), so this flag is what triggers the\n  mapper's mandatory lossiness entry; without it, the flatten happens silently.\n- **Rate limits \u002F retries:** not advertised; the capture script throttles\n  (`--rate-limit-rpm`, default 120) and backs off on 429\u002F503 honoring `Retry-After`.\n  Generated readers should inherit the same discipline.\n- **Rich content:** `content.rendered` \u002F `title.rendered` are HTML; `*.raw` requires\n  `context=edit` (authenticated). Note which the reader should pull.\n- **Custom fields:** ACF \u002F meta often appear in sample records but are absent from the\n  `OPTIONS` schema — surface them as `unknowns` in discovery so the mapper can decide.\n\n## Schema shape\n\n`source-schema.example.json` (in this skill folder) is the template `rp-discovery` follows\nwhen emitting `migrations\u002F\u003Cproject>\u002Fsource-schema.json`. It is a shape to follow, not a\nstrict schema to validate against. Keep the platform-agnostic core stable; push WordPress\nquirks (`restNamespace`, statuses, etc.) into each entity's open `sourceMeta` blob.\n",{"data":37,"body":38},{"name":4,"description":6},{"type":39,"children":40},"root",[41,48,62,69,74,154,165,171,233,239,251,264,371,376,403,427,465,476,720,747,753,765,777,883,1225,1231,1271],{"type":42,"tag":43,"props":44,"children":45},"element","h1",{"id":4},[46],{"type":47,"value":4},"text",{"type":42,"tag":49,"props":50,"children":51},"p",{},[52,54,60],{"type":47,"value":53},"WordPress \u002F WooCommerce ",{"type":42,"tag":55,"props":56,"children":57},"strong",{},[58],{"type":47,"value":59},"source adapter",{"type":47,"value":61},". Owns every WordPress-specific detail the\nplatform-agnostic skills must not hardcode: how to capture the schema, how to read the\ndata, auth models, pagination, and REST quirks.",{"type":42,"tag":63,"props":64,"children":66},"h2",{"id":65},"when-this-skill-is-used",[67],{"type":47,"value":68},"When this skill is used",{"type":42,"tag":49,"props":70,"children":71},{},[72],{"type":47,"value":73},"This is not a stage in the migration flow — it is a reference consulted by two stages:",{"type":42,"tag":75,"props":76,"children":77},"ul",{},[78,118],{"type":42,"tag":79,"props":80,"children":81},"li",{},[82,92,94,100,102,108,110,116],{"type":42,"tag":55,"props":83,"children":84},{},[85],{"type":42,"tag":86,"props":87,"children":89},"code",{"className":88},[],[90],{"type":47,"value":91},"rp-discovery",{"type":47,"value":93}," consults the ",{"type":42,"tag":95,"props":96,"children":97},"em",{},[98],{"type":47,"value":99},"Capture",{"type":47,"value":101}," section to sample the source and produce the\ncanonical ",{"type":42,"tag":86,"props":103,"children":105},{"className":104},[],[106],{"type":47,"value":107},"source-profile.md",{"type":47,"value":109}," + ",{"type":42,"tag":86,"props":111,"children":113},{"className":112},[],[114],{"type":47,"value":115},"source-schema.json",{"type":47,"value":117},".",{"type":42,"tag":79,"props":119,"children":120},{},[121,130,131,136,138,144,146,152],{"type":42,"tag":55,"props":122,"children":123},{},[124],{"type":42,"tag":86,"props":125,"children":127},{"className":126},[],[128],{"type":47,"value":129},"rp-import-codegen",{"type":47,"value":93},{"type":42,"tag":95,"props":132,"children":133},{},[134],{"type":47,"value":135},"Read contract",{"type":47,"value":137}," section to generate a reader that\nbulk-extracts WordPress data correctly (auth, pagination, ",{"type":42,"tag":86,"props":139,"children":141},{"className":140},[],[142],{"type":47,"value":143},"wc\u002Fv3",{"type":47,"value":145}," vs ",{"type":42,"tag":86,"props":147,"children":149},{"className":148},[],[150],{"type":47,"value":151},"wp\u002Fv2",{"type":47,"value":153},") into\ndurable project-local files for the later import step.",{"type":42,"tag":49,"props":155,"children":156},{},[157,163],{"type":42,"tag":86,"props":158,"children":160},{"className":159},[],[161],{"type":47,"value":162},"rp-execute-import",{"type":47,"value":164}," never consults this skill — by the time execution runs, the\nWordPress-specific knowledge is already baked into the generated reader code. Keeping the\nWordPress knowledge here is what lets the rest of the workflow stay platform-agnostic.",{"type":42,"tag":63,"props":166,"children":168},{"id":167},"platform-identity",[169],{"type":47,"value":170},"Platform identity",{"type":42,"tag":75,"props":172,"children":173},{},[174,193,206],{"type":42,"tag":79,"props":175,"children":176},{},[177,179,184,186,191],{"type":47,"value":178},"Source platform: WordPress (core REST ",{"type":42,"tag":86,"props":180,"children":182},{"className":181},[],[183],{"type":47,"value":151},{"type":47,"value":185},"), optionally WooCommerce (",{"type":42,"tag":86,"props":187,"children":189},{"className":188},[],[190],{"type":47,"value":143},{"type":47,"value":192},").",{"type":42,"tag":79,"props":194,"children":195},{},[196,198,204],{"type":47,"value":197},"Detect by hitting ",{"type":42,"tag":86,"props":199,"children":201},{"className":200},[],[202],{"type":47,"value":203},"\u003Cbase-url>\u002Fwp-json\u002F",{"type":47,"value":205}," — the REST index lists advertised namespaces.",{"type":42,"tag":79,"props":207,"children":208},{},[209,211,217,219,225,227,232],{"type":47,"value":210},"Set ",{"type":42,"tag":86,"props":212,"children":214},{"className":213},[],[215],{"type":47,"value":216},"\"platform\": \"wordpress\"",{"type":47,"value":218}," (and note WooCommerce presence in ",{"type":42,"tag":86,"props":220,"children":222},{"className":221},[],[223],{"type":47,"value":224},"sourceMeta",{"type":47,"value":226},") in the\nemitted ",{"type":42,"tag":86,"props":228,"children":230},{"className":229},[],[231],{"type":47,"value":115},{"type":47,"value":117},{"type":42,"tag":63,"props":234,"children":236},{"id":235},"capture-discovery-time",[237],{"type":47,"value":238},"Capture (discovery-time)",{"type":42,"tag":49,"props":240,"children":241},{},[242,244,249],{"type":47,"value":243},"Sampling the source to learn its shape — ",{"type":42,"tag":55,"props":245,"children":246},{},[247],{"type":47,"value":248},"not",{"type":47,"value":250}," a bulk export.",{"type":42,"tag":49,"props":252,"children":253},{},[254,256,262],{"type":47,"value":255},"Before capture, verify ",{"type":42,"tag":86,"props":257,"children":259},{"className":258},[],[260],{"type":47,"value":261},"migrations\u002F\u003Cproject>\u002Fconfig\u002Fsource.wordpress.env",{"type":47,"value":263},". Create it if\nmissing, using empty values for the user to fill:",{"type":42,"tag":265,"props":266,"children":271},"pre",{"className":267,"code":268,"language":269,"meta":270,"style":270},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","WP_BASE_URL=\nWP_USERNAME=\nWP_APPLICATION_PASSWORD=\nWP_MEDIA_URL_REWRITE_FROM=\nWP_MEDIA_URL_REWRITE_TO=\nWC_CONSUMER_KEY=\nWC_CONSUMER_SECRET=\n","bash","",[272],{"type":42,"tag":86,"props":273,"children":274},{"__ignoreMap":270},[275,293,306,319,332,345,358],{"type":42,"tag":276,"props":277,"children":280},"span",{"class":278,"line":279},"line",1,[281,287],{"type":42,"tag":276,"props":282,"children":284},{"style":283},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[285],{"type":47,"value":286},"WP_BASE_URL",{"type":42,"tag":276,"props":288,"children":290},{"style":289},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[291],{"type":47,"value":292},"=\n",{"type":42,"tag":276,"props":294,"children":296},{"class":278,"line":295},2,[297,302],{"type":42,"tag":276,"props":298,"children":299},{"style":283},[300],{"type":47,"value":301},"WP_USERNAME",{"type":42,"tag":276,"props":303,"children":304},{"style":289},[305],{"type":47,"value":292},{"type":42,"tag":276,"props":307,"children":309},{"class":278,"line":308},3,[310,315],{"type":42,"tag":276,"props":311,"children":312},{"style":283},[313],{"type":47,"value":314},"WP_APPLICATION_PASSWORD",{"type":42,"tag":276,"props":316,"children":317},{"style":289},[318],{"type":47,"value":292},{"type":42,"tag":276,"props":320,"children":322},{"class":278,"line":321},4,[323,328],{"type":42,"tag":276,"props":324,"children":325},{"style":283},[326],{"type":47,"value":327},"WP_MEDIA_URL_REWRITE_FROM",{"type":42,"tag":276,"props":329,"children":330},{"style":289},[331],{"type":47,"value":292},{"type":42,"tag":276,"props":333,"children":335},{"class":278,"line":334},5,[336,341],{"type":42,"tag":276,"props":337,"children":338},{"style":283},[339],{"type":47,"value":340},"WP_MEDIA_URL_REWRITE_TO",{"type":42,"tag":276,"props":342,"children":343},{"style":289},[344],{"type":47,"value":292},{"type":42,"tag":276,"props":346,"children":348},{"class":278,"line":347},6,[349,354],{"type":42,"tag":276,"props":350,"children":351},{"style":283},[352],{"type":47,"value":353},"WC_CONSUMER_KEY",{"type":42,"tag":276,"props":355,"children":356},{"style":289},[357],{"type":47,"value":292},{"type":42,"tag":276,"props":359,"children":361},{"class":278,"line":360},7,[362,367],{"type":42,"tag":276,"props":363,"children":364},{"style":283},[365],{"type":47,"value":366},"WC_CONSUMER_SECRET",{"type":42,"tag":276,"props":368,"children":369},{"style":289},[370],{"type":47,"value":292},{"type":42,"tag":49,"props":372,"children":373},{},[374],{"type":47,"value":375},"Required for a complete WordPress\u002FWooCommerce capture:",{"type":42,"tag":75,"props":377,"children":378},{},[379,387,395],{"type":42,"tag":79,"props":380,"children":381},{},[382],{"type":42,"tag":86,"props":383,"children":385},{"className":384},[],[386],{"type":47,"value":286},{"type":42,"tag":79,"props":388,"children":389},{},[390],{"type":42,"tag":86,"props":391,"children":393},{"className":392},[],[394],{"type":47,"value":301},{"type":42,"tag":79,"props":396,"children":397},{},[398],{"type":42,"tag":86,"props":399,"children":401},{"className":400},[],[402],{"type":47,"value":314},{"type":42,"tag":49,"props":404,"children":405},{},[406,411,413,418,420,425],{"type":42,"tag":86,"props":407,"children":409},{"className":408},[],[410],{"type":47,"value":353},{"type":47,"value":412}," and ",{"type":42,"tag":86,"props":414,"children":416},{"className":415},[],[417],{"type":47,"value":366},{"type":47,"value":419}," are optional when WooCommerce accepts the\nWordPress Application Password for ",{"type":42,"tag":86,"props":421,"children":423},{"className":422},[],[424],{"type":47,"value":143},{"type":47,"value":426}," reads; ask for them only if WooCommerce routes\nreturn 401\u002F403 with the WordPress Application Password.",{"type":42,"tag":49,"props":428,"children":429},{},[430,435,436,441,443,449,451,456,458,463],{"type":42,"tag":86,"props":431,"children":433},{"className":432},[],[434],{"type":47,"value":327},{"type":47,"value":412},{"type":42,"tag":86,"props":437,"children":439},{"className":438},[],[440],{"type":47,"value":340},{"type":47,"value":442}," are optional. Use them when the\nWordPress API is reached through a public tunnel but media\u002Ffile URLs inside records still\npoint at ",{"type":42,"tag":86,"props":444,"children":446},{"className":445},[],[447],{"type":47,"value":448},"localhost",{"type":47,"value":450}," or another private origin. If they are blank, generated readers may\nrewrite localhost\u002Fprivate origins to ",{"type":42,"tag":86,"props":452,"children":454},{"className":453},[],[455],{"type":47,"value":286},{"type":47,"value":457}," when ",{"type":42,"tag":86,"props":459,"children":461},{"className":460},[],[462],{"type":47,"value":286},{"type":47,"value":464}," is public.",{"type":42,"tag":49,"props":466,"children":467},{},[468,474],{"type":42,"tag":86,"props":469,"children":471},{"className":470},[],[472],{"type":47,"value":473},"config\u002Fsource.wordpress.env",{"type":47,"value":475}," is a secret-bearing file once it may contain real values.\nDo not read it with whole-file commands that print its contents into tool output. Check\nonly whether the file exists and whether each required key is present\u002Fblank\u002Fmissing; when\ndescribing status, name keys only and never echo values.",{"type":42,"tag":477,"props":478,"children":479},"ol",{},[480,540,573,600,613],{"type":42,"tag":79,"props":481,"children":482},{},[483,485,490,492,498,500,506,508,518,522,524,530,532,538],{"type":47,"value":484},"Run the deterministic capture script ",{"type":42,"tag":55,"props":486,"children":487},{},[488],{"type":47,"value":489},"from this skill's directory",{"type":47,"value":491}," (the folder\ncontaining this ",{"type":42,"tag":86,"props":493,"children":495},{"className":494},[],[496],{"type":47,"value":497},"SKILL.md",{"type":47,"value":499},"; see ",{"type":42,"tag":86,"props":501,"children":503},{"className":502},[],[504],{"type":47,"value":505},"CONVENTIONS.md",{"type":47,"value":507},"):",{"type":42,"tag":265,"props":509,"children":513},{"className":510,"code":512,"language":47},[511],"language-text","node scripts\u002Fwp-discovery.js --base-url \u003Curl> --out-dir \u003Cmigrations-root>\u002F\u003Cproject>\u002Fdata\u002Fwp-discovery\n",[514],{"type":42,"tag":86,"props":515,"children":516},{"__ignoreMap":270},[517],{"type":47,"value":512},{"type":42,"tag":519,"props":520,"children":521},"br",{},[],{"type":47,"value":523},"It walks the REST index, runs one ",{"type":42,"tag":86,"props":525,"children":527},{"className":526},[],[528],{"type":47,"value":529},"OPTIONS",{"type":47,"value":531}," + a small ",{"type":42,"tag":86,"props":533,"children":535},{"className":534},[],[536],{"type":47,"value":537},"GET",{"type":47,"value":539}," sample per entity, and\nwrites per-entity markdown (routes, schemas, sample records, record counts,\nrelationships). Pass auth options (see Read contract → Auth) for a complete capture.",{"type":42,"tag":79,"props":541,"children":542},{},[543,548,550,555,557,563,565,571],{"type":42,"tag":55,"props":544,"children":545},{},[546],{"type":47,"value":547},"Credentials are required for a complete capture.",{"type":47,"value":549}," Without auth, only published\npublic content is reachable; drafts, WooCommerce (",{"type":42,"tag":86,"props":551,"children":553},{"className":552},[],[554],{"type":47,"value":143},{"type":47,"value":556},"), user PII, and private\nfields return 401\u002F403, making their ",{"type":42,"tag":86,"props":558,"children":560},{"className":559},[],[561],{"type":47,"value":562},"recordCount",{"type":47,"value":564},"\u002F",{"type":42,"tag":86,"props":566,"children":568},{"className":567},[],[569],{"type":47,"value":570},"inUse",{"type":47,"value":572}," unreliable. The script flags\nthis in its README under \"Incomplete Capture (Authentication)\" — do not treat an\nunauthenticated run as authoritative.",{"type":42,"tag":79,"props":574,"children":575},{},[576,578,583,585,590,592,598],{"type":47,"value":577},"Distinguish ",{"type":42,"tag":55,"props":579,"children":580},{},[581],{"type":47,"value":582},"supported",{"type":47,"value":584}," entities (advertised by the REST index) from ",{"type":42,"tag":55,"props":586,"children":587},{},[588],{"type":47,"value":589},"used",{"type":47,"value":591},"\nentities (those with ",{"type":42,"tag":86,"props":593,"children":595},{"className":594},[],[596],{"type":47,"value":597},"recordCount > 0",{"type":47,"value":599},"). Entities advertised but empty should be\nflagged, not mapped as if they hold data.",{"type":42,"tag":79,"props":601,"children":602},{},[603,605,611],{"type":47,"value":604},"Map known plugins to entity types where relevant (e.g. WooCommerce → store,\nSeriously Simple Podcasting ",{"type":42,"tag":86,"props":606,"children":608},{"className":607},[],[609],{"type":47,"value":610},"ssp\u002Fv1",{"type":47,"value":612}," → podcasts, Yoast → SEO, ACF → custom fields).",{"type":42,"tag":79,"props":614,"children":615},{},[616,621,623,628,630,636,638,644,646],{"type":42,"tag":55,"props":617,"children":618},{},[619],{"type":47,"value":620},"Localhost sources and media URLs.",{"type":47,"value":622}," A source at ",{"type":42,"tag":86,"props":624,"children":626},{"className":625},[],[627],{"type":47,"value":448},{"type":47,"value":629},", ",{"type":42,"tag":86,"props":631,"children":633},{"className":632},[],[634],{"type":47,"value":635},"127.0.0.1",{"type":47,"value":637},", or another\nprivate-only host is valid for discovery and source reads from the user's machine.\nHowever, Wix Media import fetches files from the URL using Wix servers, so media URLs\nlike ",{"type":42,"tag":86,"props":639,"children":641},{"className":640},[],[642],{"type":47,"value":643},"http:\u002F\u002Flocalhost:8090\u002Fwp-content\u002Fuploads\u002F...",{"type":47,"value":645}," are not reachable by Wix during a\nlive import. This is optional setup and, as far as we know today, only affects media\nimport:",{"type":42,"tag":75,"props":647,"children":648},{},[649,654,659],{"type":42,"tag":79,"props":650,"children":651},{},[652],{"type":47,"value":653},"Prefer exposing the local source through a temporary public HTTPS tunnel such as\nngrok before live media import.",{"type":42,"tag":79,"props":655,"children":656},{},[657],{"type":47,"value":658},"Or explicitly skip\u002Fdefer media import and continue with non-media entities.",{"type":42,"tag":79,"props":660,"children":661},{},[662,664],{"type":47,"value":663},"If using ngrok on macOS:\n",{"type":42,"tag":477,"props":665,"children":666},{},[667,678,689,700],{"type":42,"tag":79,"props":668,"children":669},{},[670,672],{"type":47,"value":671},"Install: ",{"type":42,"tag":86,"props":673,"children":675},{"className":674},[],[676],{"type":47,"value":677},"brew install ngrok",{"type":42,"tag":79,"props":679,"children":680},{},[681,683],{"type":47,"value":682},"Add an authtoken from the ngrok dashboard:\n",{"type":42,"tag":86,"props":684,"children":686},{"className":685},[],[687],{"type":47,"value":688},"ngrok config add-authtoken \"\u003CYOUR_AUTHTOKEN>\"",{"type":42,"tag":79,"props":690,"children":691},{},[692,694],{"type":47,"value":693},"Expose the local source port, for example: ",{"type":42,"tag":86,"props":695,"children":697},{"className":696},[],[698],{"type":47,"value":699},"ngrok http 8090",{"type":42,"tag":79,"props":701,"children":702},{},[703,705,711,713,718],{"type":47,"value":704},"Set the source base URL to the HTTPS forwarding URL:\n",{"type":42,"tag":86,"props":706,"children":708},{"className":707},[],[709],{"type":47,"value":710},"export WP_BASE_URL=https:\u002F\u002F\u003Cid>.ngrok-free.app",{"type":47,"value":712},"\nRecord this in ",{"type":42,"tag":86,"props":714,"children":716},{"className":715},[],[717],{"type":47,"value":107},{"type":47,"value":719}," when the captured source URL is localhost, and note\nwhether media will use the tunnel or be skipped\u002Fdeferred.",{"type":42,"tag":49,"props":721,"children":722},{},[723,725,730,732,738,740,746],{"type":47,"value":724},"The raw capture is evidence, not a hand-off artifact. ",{"type":42,"tag":86,"props":726,"children":728},{"className":727},[],[729],{"type":47,"value":91},{"type":47,"value":731}," synthesizes it into\nthe canonical artifacts and records traceability pointers (",{"type":42,"tag":86,"props":733,"children":735},{"className":734},[],[736],{"type":47,"value":737},"rawDiscovery",{"type":47,"value":739},", per-entity\n",{"type":42,"tag":86,"props":741,"children":743},{"className":742},[],[744],{"type":47,"value":745},"rawFile",{"type":47,"value":192},{"type":42,"tag":63,"props":748,"children":750},{"id":749},"read-contract-codegen-time",[751],{"type":47,"value":752},"Read contract (codegen-time)",{"type":42,"tag":49,"props":754,"children":755},{},[756,758,763],{"type":47,"value":757},"What a generated WordPress reader must get right. Capture the operational facts below into\n",{"type":42,"tag":86,"props":759,"children":761},{"className":760},[],[762],{"type":47,"value":107},{"type":47,"value":764}," during discovery so codegen has them without re-deriving.",{"type":42,"tag":49,"props":766,"children":767},{},[768,770,775],{"type":47,"value":769},"The generated reader is an ",{"type":42,"tag":55,"props":771,"children":772},{},[773],{"type":47,"value":774},"extractor",{"type":47,"value":776},", not an in-memory bulk loader. It should fetch\nWordPress\u002FWooCommerce records page by page and write them to project-local files (for\nexample per-entity paged JSON files plus a manifest) so the import step can read from\ndisk later without re-fetching the source.",{"type":42,"tag":49,"props":778,"children":779},{},[780,785,787,793,795,801,803,808,810,816,817,823,824,830,832,838,840,845,847,853,854,860,862,867,869,874,876,881],{"type":42,"tag":55,"props":781,"children":782},{},[783],{"type":47,"value":784},"Reuse the shared transport — do not regenerate it.",{"type":47,"value":786}," The auth, URL building, rate-limit\nthrottling, and ",{"type":42,"tag":86,"props":788,"children":790},{"className":789},[],[791],{"type":47,"value":792},"Retry-After",{"type":47,"value":794},"-aware 429\u002F503 backoff a reader needs already exist as a\ndependency-free module at ",{"type":42,"tag":86,"props":796,"children":798},{"className":797},[],[799],{"type":47,"value":800},"lib\u002Fwp-http.js",{"type":47,"value":802}," in ",{"type":42,"tag":55,"props":804,"children":805},{},[806],{"type":47,"value":807},"this skill directory",{"type":47,"value":809}," (the same module\nthe capture script imports). It\nexports ",{"type":42,"tag":86,"props":811,"children":813},{"className":812},[],[814],{"type":47,"value":815},"fetchJson",{"type":47,"value":629},{"type":42,"tag":86,"props":818,"children":820},{"className":819},[],[821],{"type":47,"value":822},"buildHeaders",{"type":47,"value":629},{"type":42,"tag":86,"props":825,"children":827},{"className":826},[],[828],{"type":47,"value":829},"configureRateLimit",{"type":47,"value":831},", and ",{"type":42,"tag":86,"props":833,"children":835},{"className":834},[],[836],{"type":47,"value":837},"parseTotalHeader",{"type":47,"value":839},". Any\ngenerated WordPress reader ",{"type":42,"tag":55,"props":841,"children":842},{},[843],{"type":47,"value":844},"must reuse this module rather than reimplementing transport",{"type":47,"value":846},",\nso the reader contains only per-project orchestration: which entities to pull, the\npagination loop, ",{"type":42,"tag":86,"props":848,"children":850},{"className":849},[],[851],{"type":47,"value":852},"_embed",{"type":47,"value":564},{"type":42,"tag":86,"props":855,"children":857},{"className":856},[],[858],{"type":47,"value":859},"_links",{"type":47,"value":861}," resolution, and transform glue. One tested transport\ncore is what makes the sampler and the reader behave identically. ",{"type":42,"tag":95,"props":863,"children":864},{},[865],{"type":47,"value":866},"How",{"type":47,"value":868}," the module is\ncarried into a runnable migration project is ",{"type":42,"tag":86,"props":870,"children":872},{"className":871},[],[873],{"type":47,"value":129},{"type":47,"value":875},"'s concern (its File\ntargets), not this adapter's. The notes below describe what the reader does ",{"type":42,"tag":95,"props":877,"children":878},{},[879],{"type":47,"value":880},"on top of",{"type":47,"value":882},"\nthat shared core:",{"type":42,"tag":75,"props":884,"children":885},{},[886,945,987,1056,1134,1159,1200],{"type":42,"tag":79,"props":887,"children":888},{},[889,894],{"type":42,"tag":55,"props":890,"children":891},{},[892],{"type":47,"value":893},"Namespaces & auth differ per namespace:",{"type":42,"tag":75,"props":895,"children":896},{},[897,928],{"type":42,"tag":79,"props":898,"children":899},{},[900,905,907,912,914,920,921,927],{"type":42,"tag":86,"props":901,"children":903},{"className":902},[],[904],{"type":47,"value":151},{"type":47,"value":906}," (core): HTTP Basic auth with a WordPress ",{"type":42,"tag":55,"props":908,"children":909},{},[910],{"type":47,"value":911},"Application Password",{"type":47,"value":913},"\n(",{"type":42,"tag":86,"props":915,"children":917},{"className":916},[],[918],{"type":47,"value":919},"--username",{"type":47,"value":109},{"type":42,"tag":86,"props":922,"children":924},{"className":923},[],[925],{"type":47,"value":926},"--application-password",{"type":47,"value":192},{"type":42,"tag":79,"props":929,"children":930},{},[931,936,938,943],{"type":42,"tag":86,"props":932,"children":934},{"className":933},[],[935],{"type":47,"value":143},{"type":47,"value":937}," (WooCommerce): ",{"type":42,"tag":55,"props":939,"children":940},{},[941],{"type":47,"value":942},"consumer key \u002F secret",{"type":47,"value":944},", sent as Basic auth over HTTPS (or\nas query params on some hosts). This is a different credential from the Application\nPassword — both may be needed for a full migration.",{"type":42,"tag":79,"props":946,"children":947},{},[948,953,955,961,963,969,971,977,979,985],{"type":42,"tag":55,"props":949,"children":950},{},[951],{"type":47,"value":952},"Pagination:",{"type":47,"value":954}," ",{"type":42,"tag":86,"props":956,"children":958},{"className":957},[],[959],{"type":47,"value":960},"?page=N&per_page=M",{"type":47,"value":962}," (max ",{"type":42,"tag":86,"props":964,"children":966},{"className":965},[],[967],{"type":47,"value":968},"per_page",{"type":47,"value":970}," is typically 100). Total pages are\nin the ",{"type":42,"tag":86,"props":972,"children":974},{"className":973},[],[975],{"type":47,"value":976},"X-WP-TotalPages",{"type":47,"value":978}," response header and total records in ",{"type":42,"tag":86,"props":980,"children":982},{"className":981},[],[983],{"type":47,"value":984},"X-WP-Total",{"type":47,"value":986}," — read\nthose rather than guessing when to stop.",{"type":42,"tag":79,"props":988,"children":989},{},[990,995,997,1003,1005,1010,1012,1018,1019,1025,1026,1032,1034,1040,1042,1047,1049,1054],{"type":42,"tag":55,"props":991,"children":992},{},[993],{"type":47,"value":994},"Embedded relations:",{"type":47,"value":996}," request ",{"type":42,"tag":86,"props":998,"children":1000},{"className":999},[],[1001],{"type":47,"value":1002},"?_embed",{"type":47,"value":1004}," to inline related resources, or follow the\n",{"type":42,"tag":86,"props":1006,"children":1008},{"className":1007},[],[1009],{"type":47,"value":859},{"type":47,"value":1011}," block (",{"type":42,"tag":86,"props":1013,"children":1015},{"className":1014},[],[1016],{"type":47,"value":1017},"author",{"type":47,"value":629},{"type":42,"tag":86,"props":1020,"children":1022},{"className":1021},[],[1023],{"type":47,"value":1024},"wp:featuredmedia",{"type":47,"value":629},{"type":42,"tag":86,"props":1027,"children":1029},{"className":1028},[],[1030],{"type":47,"value":1031},"wp:term",{"type":47,"value":1033},") to resolve relations. The\n",{"type":42,"tag":86,"props":1035,"children":1037},{"className":1036},[],[1038],{"type":47,"value":1039},"evidence",{"type":47,"value":1041}," pointers in ",{"type":42,"tag":86,"props":1043,"children":1045},{"className":1044},[],[1046],{"type":47,"value":115},{"type":47,"value":1048}," relations come from this ",{"type":42,"tag":86,"props":1050,"children":1052},{"className":1051},[],[1053],{"type":47,"value":859},{"type":47,"value":1055}," block.",{"type":42,"tag":79,"props":1057,"children":1058},{},[1059,1064,1066,1072,1074,1080,1082,1087,1089,1094,1096,1102,1104,1109,1111,1117,1119,1125,1127,1132],{"type":42,"tag":55,"props":1060,"children":1061},{},[1062],{"type":47,"value":1063},"Hierarchical taxonomies:",{"type":47,"value":1065}," WordPress categories (and custom hierarchical taxonomies)\ncarry a ",{"type":42,"tag":86,"props":1067,"children":1069},{"className":1068},[],[1070],{"type":47,"value":1071},"parent",{"type":47,"value":1073}," field on each term (",{"type":42,"tag":86,"props":1075,"children":1077},{"className":1076},[],[1078],{"type":47,"value":1079},"0",{"type":47,"value":1081}," = top-level). When ",{"type":42,"tag":55,"props":1083,"children":1084},{},[1085],{"type":47,"value":1086},"any",{"type":47,"value":1088}," term has a non-zero\n",{"type":42,"tag":86,"props":1090,"children":1092},{"className":1091},[],[1093],{"type":47,"value":1071},{"type":47,"value":1095},", the source taxonomy is nested. Discovery must elevate this into structured\nschema — set ",{"type":42,"tag":86,"props":1097,"children":1099},{"className":1098},[],[1100],{"type":47,"value":1101},"\"hierarchical\": true",{"type":47,"value":1103}," on that entity in ",{"type":42,"tag":86,"props":1105,"children":1107},{"className":1106},[],[1108],{"type":47,"value":115},{"type":47,"value":1110}," (see\n",{"type":42,"tag":86,"props":1112,"children":1114},{"className":1113},[],[1115],{"type":47,"value":1116},"source-schema.example.json",{"type":47,"value":1118}," → ",{"type":42,"tag":86,"props":1120,"children":1122},{"className":1121},[],[1123],{"type":47,"value":1124},"category",{"type":47,"value":1126},") rather than leaving ",{"type":42,"tag":86,"props":1128,"children":1130},{"className":1129},[],[1131],{"type":47,"value":1071},{"type":47,"value":1133}," buried in the raw\ndump. The Wix Blog category target is flat (FR-006), so this flag is what triggers the\nmapper's mandatory lossiness entry; without it, the flatten happens silently.",{"type":42,"tag":79,"props":1135,"children":1136},{},[1137,1142,1144,1150,1152,1157],{"type":42,"tag":55,"props":1138,"children":1139},{},[1140],{"type":47,"value":1141},"Rate limits \u002F retries:",{"type":47,"value":1143}," not advertised; the capture script throttles\n(",{"type":42,"tag":86,"props":1145,"children":1147},{"className":1146},[],[1148],{"type":47,"value":1149},"--rate-limit-rpm",{"type":47,"value":1151},", default 120) and backs off on 429\u002F503 honoring ",{"type":42,"tag":86,"props":1153,"children":1155},{"className":1154},[],[1156],{"type":47,"value":792},{"type":47,"value":1158},".\nGenerated readers should inherit the same discipline.",{"type":42,"tag":79,"props":1160,"children":1161},{},[1162,1167,1168,1174,1176,1182,1184,1190,1192,1198],{"type":42,"tag":55,"props":1163,"children":1164},{},[1165],{"type":47,"value":1166},"Rich content:",{"type":47,"value":954},{"type":42,"tag":86,"props":1169,"children":1171},{"className":1170},[],[1172],{"type":47,"value":1173},"content.rendered",{"type":47,"value":1175}," \u002F ",{"type":42,"tag":86,"props":1177,"children":1179},{"className":1178},[],[1180],{"type":47,"value":1181},"title.rendered",{"type":47,"value":1183}," are HTML; ",{"type":42,"tag":86,"props":1185,"children":1187},{"className":1186},[],[1188],{"type":47,"value":1189},"*.raw",{"type":47,"value":1191}," requires\n",{"type":42,"tag":86,"props":1193,"children":1195},{"className":1194},[],[1196],{"type":47,"value":1197},"context=edit",{"type":47,"value":1199}," (authenticated). Note which the reader should pull.",{"type":42,"tag":79,"props":1201,"children":1202},{},[1203,1208,1210,1215,1217,1223],{"type":42,"tag":55,"props":1204,"children":1205},{},[1206],{"type":47,"value":1207},"Custom fields:",{"type":47,"value":1209}," ACF \u002F meta often appear in sample records but are absent from the\n",{"type":42,"tag":86,"props":1211,"children":1213},{"className":1212},[],[1214],{"type":47,"value":529},{"type":47,"value":1216}," schema — surface them as ",{"type":42,"tag":86,"props":1218,"children":1220},{"className":1219},[],[1221],{"type":47,"value":1222},"unknowns",{"type":47,"value":1224}," in discovery so the mapper can decide.",{"type":42,"tag":63,"props":1226,"children":1228},{"id":1227},"schema-shape",[1229],{"type":47,"value":1230},"Schema shape",{"type":42,"tag":49,"props":1232,"children":1233},{},[1234,1239,1241,1246,1248,1254,1256,1262,1264,1269],{"type":42,"tag":86,"props":1235,"children":1237},{"className":1236},[],[1238],{"type":47,"value":1116},{"type":47,"value":1240}," (in this skill folder) is the template ",{"type":42,"tag":86,"props":1242,"children":1244},{"className":1243},[],[1245],{"type":47,"value":91},{"type":47,"value":1247}," follows\nwhen emitting ",{"type":42,"tag":86,"props":1249,"children":1251},{"className":1250},[],[1252],{"type":47,"value":1253},"migrations\u002F\u003Cproject>\u002Fsource-schema.json",{"type":47,"value":1255},". It is a shape to follow, not a\nstrict schema to validate against. Keep the platform-agnostic core stable; push WordPress\nquirks (",{"type":42,"tag":86,"props":1257,"children":1259},{"className":1258},[],[1260],{"type":47,"value":1261},"restNamespace",{"type":47,"value":1263},", statuses, etc.) into each entity's open ",{"type":42,"tag":86,"props":1265,"children":1267},{"className":1266},[],[1268],{"type":47,"value":224},{"type":47,"value":1270}," blob.",{"type":42,"tag":1272,"props":1273,"children":1274},"style",{},[1275],{"type":47,"value":1276},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":1278,"total":1430},[1279,1294,1305,1317,1329,1339,1350,1362,1369,1383,1400,1412],{"slug":91,"name":91,"fn":1280,"description":1281,"org":1282,"tags":1283,"stars":25,"repoUrl":26,"updatedAt":1293},"discover source platform schema for migration","Discovers and documents the source platform schema (entities, fields, relationships) for a migration project. Use when capturing source structure before mapping to Wix.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1284,1287,1290],{"name":1285,"slug":1286,"type":15},"Data Modeling","data-modeling",{"name":1288,"slug":1289,"type":15},"Documentation","documentation",{"name":1291,"slug":1292,"type":15},"Migration","migration","2026-07-01T08:08:08.302261",{"slug":162,"name":162,"fn":1295,"description":1296,"org":1297,"tags":1298,"stars":25,"repoUrl":26,"updatedAt":1304},"execute migration pipelines to Wix","Runs the generated extract\u002Fimport pipeline and records execution results. Use when setup and codegen are complete and the user has approved the execution plan.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1299,1302,1303],{"name":1300,"slug":1301,"type":15},"Data Pipeline","data-pipeline",{"name":1291,"slug":1292,"type":15},{"name":9,"slug":8,"type":15},"2026-07-01T08:08:07.038962",{"slug":1306,"name":1306,"fn":1307,"description":1308,"org":1309,"tags":1310,"stars":25,"repoUrl":26,"updatedAt":1316},"rp-execute-setup","provision Wix site setup for migration","Verifies and provisions Wix-side setup required before import. Use after codegen when setup-requirements.md must be validated or executed against the target site.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1311,1314,1315],{"name":1312,"slug":1313,"type":15},"Deployment","deployment",{"name":1291,"slug":1292,"type":15},{"name":9,"slug":8,"type":15},"2026-07-01T08:08:04.475894",{"slug":129,"name":129,"fn":1318,"description":1319,"org":1320,"tags":1321,"stars":25,"repoUrl":26,"updatedAt":1328},"generate migration code for Wix","Generates migration readers, transforms, and Wix writers from schema and mapping artifacts. Use when producing runnable extract\u002Fimport code under the migration project.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1322,1325,1326,1327],{"name":1323,"slug":1324,"type":15},"Automation","automation",{"name":13,"slug":14,"type":15},{"name":1291,"slug":1292,"type":15},{"name":9,"slug":8,"type":15},"2026-07-01T08:08:05.755188",{"slug":1330,"name":1330,"fn":1331,"description":1332,"org":1333,"tags":1334,"stars":25,"repoUrl":26,"updatedAt":1338},"rp-mapper","map source entities to Wix targets","Maps discovered source entities and fields to Wix targets and documents lossiness. Use when creating mapping-plan.md and mapping-summary.md after discovery.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1335,1336,1337],{"name":1285,"slug":1286,"type":15},{"name":1291,"slug":1292,"type":15},{"name":9,"slug":8,"type":15},"2026-07-01T08:08:01.958081",{"slug":1340,"name":1340,"fn":1341,"description":1342,"org":1343,"tags":1344,"stars":25,"repoUrl":26,"updatedAt":1349},"rp-orchestration","orchestrate Wix site migrations","Routes RePlatform source-to-Wix migrations to the next workflow step by inspecting migration project artifacts. Use when starting, continuing, or recovering a migration run.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1345,1346,1347,1348],{"name":1323,"slug":1324,"type":15},{"name":1312,"slug":1313,"type":15},{"name":1291,"slug":1292,"type":15},{"name":9,"slug":8,"type":15},"2026-07-01T08:08:09.570887",{"slug":1351,"name":1351,"fn":1352,"description":1353,"org":1354,"tags":1355,"stars":25,"repoUrl":26,"updatedAt":1361},"rp-setup-discovery","set up Wix environment prerequisites","Derives Wix environment prerequisites (apps, collections, schemas) from an approved mapping plan. Use after mapping review and before import code generation.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1356,1359,1360],{"name":1357,"slug":1358,"type":15},"Configuration","configuration",{"name":1285,"slug":1286,"type":15},{"name":9,"slug":8,"type":15},"2026-07-01T08:07:59.413698",{"slug":4,"name":4,"fn":5,"description":6,"org":1363,"tags":1364,"stars":25,"repoUrl":26,"updatedAt":27},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1365,1366,1367,1368],{"name":13,"slug":14,"type":15},{"name":23,"slug":24,"type":15},{"name":17,"slug":18,"type":15},{"name":20,"slug":21,"type":15},{"slug":1370,"name":1370,"fn":1371,"description":1372,"org":1373,"tags":1374,"stars":25,"repoUrl":26,"updatedAt":1382},"rp-target-wix","validate Wix API write operations","Wix target adapter with verified write primitives (wix-writers.js) and contract tests. Use when vendoring Wix writers, validating API shapes, or Wix provisioning mechanics.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1375,1378,1381],{"name":1376,"slug":1377,"type":15},"API Development","api-development",{"name":1379,"slug":1380,"type":15},"Testing","testing",{"name":9,"slug":8,"type":15},"2026-07-01T08:08:03.226054",{"slug":1384,"name":1384,"fn":1385,"description":1386,"org":1387,"tags":1388,"stars":25,"repoUrl":26,"updatedAt":1399},"wix-app","build Wix CLI app extensions","Build and review Wix CLI app extensions — dashboard pages, modals, plugins, menu plugins, custom element widgets, Editor React components, site plugins, embedded scripts, backend APIs, backend events, service plugins, data collections, and App Market readiness. Use when building ANY feature or extension for a Wix CLI app or preparing a Wix app for App Market review. Triggers on: add, build, create, implement, help me, dashboard, widget, plugin, backend, API, event, collection, embedded script, service plugin, Editor React component, checkout, shipping, tax, discount, SPI, CMS, schema, tracking, popup, admin panel, menu item, modal, validate, test, verify, register extension, App Market, app review, submission readiness.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1389,1392,1395,1398],{"name":1390,"slug":1391,"type":15},"Backend","backend",{"name":1393,"slug":1394,"type":15},"CLI","cli",{"name":1396,"slug":1397,"type":15},"Frontend","frontend",{"name":9,"slug":8,"type":15},"2026-04-16T04:58:00.157961",{"slug":1401,"name":1401,"fn":1402,"description":1403,"org":1404,"tags":1405,"stars":25,"repoUrl":26,"updatedAt":1411},"wix-auth","authenticate with Wix APIs","Authenticate with Wix to obtain an access token for calling Wix APIs. Use when an agent needs a valid Wix access token and has none, or when the stored token is expired.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1406,1407,1410],{"name":1376,"slug":1377,"type":15},{"name":1408,"slug":1409,"type":15},"Auth","auth",{"name":9,"slug":8,"type":15},"2026-07-07T06:47:46.95263",{"slug":1413,"name":1413,"fn":1414,"description":1415,"org":1416,"tags":1417,"stars":25,"repoUrl":26,"updatedAt":1429},"wix-design-system","build UIs with Wix Design System","Wix Design System component reference. Use when building UI with @wix\u002Fdesign-system, choosing components, checking props and examples, or writing tests with component testkits. Triggers on \"what component\", \"how do I make\", \"WDS\", \"show me props\", \"testkit\", \"driver\", or component names like Button, Card, Modal, Box, Text.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1418,1421,1424,1425,1428],{"name":1419,"slug":1420,"type":15},"Design","design",{"name":1422,"slug":1423,"type":15},"Design System","design-system",{"name":1396,"slug":1397,"type":15},{"name":1426,"slug":1427,"type":15},"UI Components","ui-components",{"name":9,"slug":8,"type":15},"2026-04-29T05:33:44.561687",17,{"items":1432,"total":1477},[1433,1439,1445,1451,1458,1464,1471],{"slug":91,"name":91,"fn":1280,"description":1281,"org":1434,"tags":1435,"stars":25,"repoUrl":26,"updatedAt":1293},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1436,1437,1438],{"name":1285,"slug":1286,"type":15},{"name":1288,"slug":1289,"type":15},{"name":1291,"slug":1292,"type":15},{"slug":162,"name":162,"fn":1295,"description":1296,"org":1440,"tags":1441,"stars":25,"repoUrl":26,"updatedAt":1304},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1442,1443,1444],{"name":1300,"slug":1301,"type":15},{"name":1291,"slug":1292,"type":15},{"name":9,"slug":8,"type":15},{"slug":1306,"name":1306,"fn":1307,"description":1308,"org":1446,"tags":1447,"stars":25,"repoUrl":26,"updatedAt":1316},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1448,1449,1450],{"name":1312,"slug":1313,"type":15},{"name":1291,"slug":1292,"type":15},{"name":9,"slug":8,"type":15},{"slug":129,"name":129,"fn":1318,"description":1319,"org":1452,"tags":1453,"stars":25,"repoUrl":26,"updatedAt":1328},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1454,1455,1456,1457],{"name":1323,"slug":1324,"type":15},{"name":13,"slug":14,"type":15},{"name":1291,"slug":1292,"type":15},{"name":9,"slug":8,"type":15},{"slug":1330,"name":1330,"fn":1331,"description":1332,"org":1459,"tags":1460,"stars":25,"repoUrl":26,"updatedAt":1338},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1461,1462,1463],{"name":1285,"slug":1286,"type":15},{"name":1291,"slug":1292,"type":15},{"name":9,"slug":8,"type":15},{"slug":1340,"name":1340,"fn":1341,"description":1342,"org":1465,"tags":1466,"stars":25,"repoUrl":26,"updatedAt":1349},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1467,1468,1469,1470],{"name":1323,"slug":1324,"type":15},{"name":1312,"slug":1313,"type":15},{"name":1291,"slug":1292,"type":15},{"name":9,"slug":8,"type":15},{"slug":1351,"name":1351,"fn":1352,"description":1353,"org":1472,"tags":1473,"stars":25,"repoUrl":26,"updatedAt":1361},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1474,1475,1476],{"name":1357,"slug":1358,"type":15},{"name":1285,"slug":1286,"type":15},{"name":9,"slug":8,"type":15},16]