[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-automattic-block-content":3,"mdc--qcme23-key":40,"related-repo-automattic-block-content":1202,"related-org-automattic-block-content":1304},{"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":35,"sourceUrl":38,"mdContent":39},"block-content","write editable WordPress block markup","Write editable WordPress block markup for local Studio sites, including core\u002Fhtml limits, block-theme layout rules, full-width sections, validation, and skeleton-first page\u002FCSS recipes.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"automattic","Automattic","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fautomattic.png",[12,16,19,22],{"name":13,"slug":14,"type":15},"HTML","html","tag",{"name":17,"slug":18,"type":15},"WordPress","wordpress",{"name":20,"slug":21,"type":15},"CSS","css",{"name":23,"slug":24,"type":15},"Block Editor","block-editor",484,"https:\u002F\u002Fgithub.com\u002FAutomattic\u002Fstudio","2026-05-27T07:01:55.629681",null,82,[31,32,33,34,18],"agents","cli","desktop","electron",{"repoUrl":26,"stars":25,"forks":29,"topics":36,"description":37},[31,32,33,34,18],"WordPress Studio, a free desktop app and CLI that helps developers streamline their local WordPress development workflow.","https:\u002F\u002Fgithub.com\u002FAutomattic\u002Fstudio\u002Ftree\u002FHEAD\u002Fapps\u002Fcli\u002Fai\u002Fskills\u002Fblock-content","---\nname: block-content\ndescription: Write editable WordPress block markup for local Studio sites, including core\u002Fhtml limits, block-theme layout rules, full-width sections, validation, and skeleton-first page\u002FCSS recipes.\nuser-invokable: true\n---\n\n# Block Content\n\nUse this skill before writing or editing page content, post content, templates, template parts, patterns, or any other WordPress block markup.\n\n## Core Policy\n\n- Use editable WordPress blocks for content and layout. Prefer `core\u002Fgroup`, `core\u002Fcolumns`, `core\u002Fheading`, `core\u002Fparagraph`, `core\u002Flist`, `core\u002Fimage`, `core\u002Fbuttons`, and theme CSS.\n- Only use `core\u002Fhtml` blocks for inline SVGs, interaction markup with no block equivalent such as marquee or custom cursor markup, or a single bottom-of-page `\u003Cscript>` block.\n- Never use `core\u002Fhtml` to wrap text content, headings, layout sections, lists, or forms.\n- For forms or features core blocks do not cleanly provide, load the `plugin-recommendations` skill and use editable plugin blocks.\n- No decorative HTML comments such as `\u003C!-- Hero Section -->` or `\u003C!-- Features -->`. Only WordPress block delimiter comments are allowed.\n- No custom class names on inner DOM elements. Put custom classes only on the outermost block wrapper via the block `className` attribute.\n- Style buttons via `.wp-element-button` — the inner element WordPress applies the button's padding, background, and border to (shared by the button block and buttons from other blocks). A custom class on a button block sits on the `.wp-block-button` wrapper, so descend to `.your-class .wp-element-button`; never style the wrapper directly, or its padding stacks on top of the default and the button doubles in size.\n- No inline `style` attributes or block `style` attributes for styling. Use `className` plus the theme's `style.css`.\n- Prefer theme palette colors over hardcoded hex. Apply block colors with palette **slug** attributes — `{\"backgroundColor\":\"accent-1\",\"textColor\":\"base\"}` — and in `style.css` reference palette colors as `var(--wp--preset--color--\u003Cslug>)`. Discover the available slugs from the active theme's `theme.json` `settings.color.palette` (for a theme you are building, the palette you defined there); when you want a color the palette lacks, prefer adding it to the palette and referencing its slug. Keeping colors on the palette keeps sections in sync with Global Styles, theme switching, and light\u002Fdark variations. A raw hex value is fine for a deliberate one-off, but it should be the exception, not the default.\n- Use `core\u002Fspacer` for empty spacing elements, not empty `core\u002Fgroup` blocks.\n- No emojis anywhere in generated content.\n\n## Layout Cascade\n\nWordPress constrains children of `core\u002Fpost-content` and any constrained-layout container to `theme.json`'s `settings.layout.contentSize`, which is about 700px by default. Custom CSS such as `.hero { width: 100% }` does not override core layout selectors like `.is-layout-constrained > *:not(.alignwide):not(.alignfull)` because they are more specific.\n\nUse these patterns:\n\n- **Full-bleed section, constrained inner content**: for a full-width hero, banner, or CTA with centered content, use an outer `core\u002Fgroup` with `{\"align\":\"full\",\"layout\":{\"type\":\"constrained\"}}`, then place normal inner blocks inside it.\n- **Full-bleed section, full-bleed inner content**: for image grids, edge-to-edge galleries, and similar layouts, use outer and inner `core\u002Fgroup` blocks with `{\"align\":\"full\",\"layout\":{\"type\":\"default\"}}`.\n- **Standard constrained content**: omit `align` and write normal blocks.\n\nThe common failure is a hero or banner that was intended to be full-width but still renders in the narrow content column. Fix that in markup by adding `align: \"full\"` on the outer group or correcting the inner `layout` type, not by trying to force width in CSS.\n\n## Root Block Gap\n\nWordPress inserts `margin-block-start: var(--wp--style--block-gap)` between the top-level children of the rendered template — between the header template part, the main group, and the footer template part (`.wp-site-blocks > * + *`). Core supplies a default gap (24px) even when the theme's `theme.json` never declares `styles.spacing.blockGap`, so a gap appears there that no markup asked for.\n\n- Themes created with `scaffold_theme` already zero this in `style.css` (`.wp-site-blocks > * + * { margin-block-start: 0; }`) — sections butt edge-to-edge and own their vertical rhythm via their own padding. Keep that reset when editing the file.\n- When working in a theme without that reset, add the same rule to the theme's `style.css` instead of compensating with negative margins or guessing at the extra space.\n- Do not zero the gap by setting `styles.spacing.blockGap: \"0\"` in `theme.json` — that value cascades as the default gap inside every flow and constrained layout and collapses content rhythm site-wide.\n- When you want visible space between top-level sections, add it deliberately (padding on the sections) so the spacing is designed, not inherited.\n\n## Skeleton-First Recipes\n\nFor long files over about 200 lines, write a small skeleton first and fill anchors across later `Edit` calls.\n\n### Theme CSS\n\nFor `style.css`, start with custom properties and anchor comments only:\n\n```css\n:root {\n\t\u002F* Map section variables onto the theme palette — reference preset slugs,\n\t   never hardcode hex here. The slugs come from theme.json's color palette. *\u002F\n\t--site-bg: var( --wp--preset--color--base );\n\t--site-text: var( --wp--preset--color--contrast );\n}\n\n\u002F* === reset === *\u002F\n\u002F* === typography === *\u002F\n\u002F* === hero === *\u002F\n\u002F* === sections === *\u002F\n\u002F* === cta === *\u002F\n\u002F* === footer === *\u002F\n\u002F* === responsive === *\u002F\n```\n\nKeep the skeleton under 2KB. Fill one anchor per `Edit`, using the anchor line as `old_string` and replacing it with the anchor plus the new styles.\n\nWhen `scaffold_theme` was used, do not `Write` over the scaffolded `style.css`; it already contains the required theme header. Use `Edit` to append the `:root` block and anchor comments below the existing content.\n\n### Page Content\n\nFor long page content:\n\n1. Create the page empty:\n\n```text\nwp_cli post create --post_content=\"\"\n```\n\n2. Write `\u003Csite>\u002Ftmp\u002Fpage-\u003Cslug>.html`, not a file inside the theme, with small section anchors:\n\n```html\n\u003C!-- section:hero -->\n\u003C!-- section:features -->\n\u003C!-- section:cta -->\n```\n\n3. Fill one anchor per `Edit` using editable blocks. Never wrap a section in `core\u002Fhtml`.\n4. **Validate before applying (mandatory gate).** Once all anchors are filled, you MUST call `validate_blocks` with `filePath` pointing at `\u003Csite>\u002Ftmp\u002Fpage-\u003Cslug>.html` and get a passing result — the core\u002Fhtml policy passes and editor validation reports all blocks valid. This is not optional and not a step you can defer to after `wp_cli eval`: the scratch file is block content, so it must be validated as a file while it still lives in a file. If validation reports invalid blocks, fix them in the file and call `validate_blocks` again until it passes. Never apply block content you have not validated.\n5. Apply the validated content once:\n\n```text\nwp_cli eval '$content = file_get_contents(ABSPATH . \"tmp\u002Fpage-\u003Cslug>.html\"); wp_update_post([\"ID\" => \u003Cid>, \"post_content\" => $content]); echo \"ok\";'\n```\n\nDo not use `--post_content-file=\u003Chost path>`. `wp_cli` runs inside the PHP-WASM filesystem; the host site directory is mounted at `\u002Fwordpress\u002F`, so `ABSPATH === \"\u002Fwordpress\u002F\"`. Host paths are not readable there and can silently update the post to empty content.\n\n## Validation\n\n- Validation is a mandatory gate, not a cleanup step. You MUST call `validate_blocks` and get a passing result for any block content you generate **before** that content reaches the live site — before `wp_cli post create\u002Fupdate`, before `wp_cli eval`, and before importing a scratch file. Never apply, import, or save block content you have not validated. A build that skips validation is incomplete, even if the page renders.\n- Run `validate_blocks` after every write or edit that creates or changes block content. Call it with `filePath` whenever the content lives in a file — including scratch files such as `\u003Csite>\u002Ftmp\u002Fpage-\u003Cslug>.html` that you later import with `wp_cli eval`. The scratch file is the block content; validate the file, not just the eventual post. It first runs a static `core\u002Fhtml` policy check: if that reports invalid `core\u002Fhtml` blocks, editor validation is skipped — rewrite only those blocks as editable core or plugin blocks, then call `validate_blocks` again. Once the policy passes it validates in the live editor and applies safe serialization fixes directly to the file. If it says an auto-fix was applied, do not manually replace markup or call validation again unless you intentionally change block markup afterward. Use the diff only to inspect structural changes for CSS impact. Classes added or removed by the validator can affect layout and styling.\n",{"data":41,"body":43},{"name":4,"description":6,"user-invokable":42},true,{"type":44,"children":45},"root",[46,54,60,67,350,356,400,405,475,496,502,538,606,612,625,632,644,841,861,903,909,914,923,933,949,981,1054,1063,1100,1106,1197],{"type":47,"tag":48,"props":49,"children":50},"element","h1",{"id":4},[51],{"type":52,"value":53},"text","Block Content",{"type":47,"tag":55,"props":56,"children":57},"p",{},[58],{"type":52,"value":59},"Use this skill before writing or editing page content, post content, templates, template parts, patterns, or any other WordPress block markup.",{"type":47,"tag":61,"props":62,"children":64},"h2",{"id":63},"core-policy",[65],{"type":52,"value":66},"Core Policy",{"type":47,"tag":68,"props":69,"children":70},"ul",{},[71,129,150,162,175,196,209,238,273,325,345],{"type":47,"tag":72,"props":73,"children":74},"li",{},[75,77,84,86,92,93,99,100,106,107,113,114,120,121,127],{"type":52,"value":76},"Use editable WordPress blocks for content and layout. Prefer ",{"type":47,"tag":78,"props":79,"children":81},"code",{"className":80},[],[82],{"type":52,"value":83},"core\u002Fgroup",{"type":52,"value":85},", ",{"type":47,"tag":78,"props":87,"children":89},{"className":88},[],[90],{"type":52,"value":91},"core\u002Fcolumns",{"type":52,"value":85},{"type":47,"tag":78,"props":94,"children":96},{"className":95},[],[97],{"type":52,"value":98},"core\u002Fheading",{"type":52,"value":85},{"type":47,"tag":78,"props":101,"children":103},{"className":102},[],[104],{"type":52,"value":105},"core\u002Fparagraph",{"type":52,"value":85},{"type":47,"tag":78,"props":108,"children":110},{"className":109},[],[111],{"type":52,"value":112},"core\u002Flist",{"type":52,"value":85},{"type":47,"tag":78,"props":115,"children":117},{"className":116},[],[118],{"type":52,"value":119},"core\u002Fimage",{"type":52,"value":85},{"type":47,"tag":78,"props":122,"children":124},{"className":123},[],[125],{"type":52,"value":126},"core\u002Fbuttons",{"type":52,"value":128},", and theme CSS.",{"type":47,"tag":72,"props":130,"children":131},{},[132,134,140,142,148],{"type":52,"value":133},"Only use ",{"type":47,"tag":78,"props":135,"children":137},{"className":136},[],[138],{"type":52,"value":139},"core\u002Fhtml",{"type":52,"value":141}," blocks for inline SVGs, interaction markup with no block equivalent such as marquee or custom cursor markup, or a single bottom-of-page ",{"type":47,"tag":78,"props":143,"children":145},{"className":144},[],[146],{"type":52,"value":147},"\u003Cscript>",{"type":52,"value":149}," block.",{"type":47,"tag":72,"props":151,"children":152},{},[153,155,160],{"type":52,"value":154},"Never use ",{"type":47,"tag":78,"props":156,"children":158},{"className":157},[],[159],{"type":52,"value":139},{"type":52,"value":161}," to wrap text content, headings, layout sections, lists, or forms.",{"type":47,"tag":72,"props":163,"children":164},{},[165,167,173],{"type":52,"value":166},"For forms or features core blocks do not cleanly provide, load the ",{"type":47,"tag":78,"props":168,"children":170},{"className":169},[],[171],{"type":52,"value":172},"plugin-recommendations",{"type":52,"value":174}," skill and use editable plugin blocks.",{"type":47,"tag":72,"props":176,"children":177},{},[178,180,186,188,194],{"type":52,"value":179},"No decorative HTML comments such as ",{"type":47,"tag":78,"props":181,"children":183},{"className":182},[],[184],{"type":52,"value":185},"\u003C!-- Hero Section -->",{"type":52,"value":187}," or ",{"type":47,"tag":78,"props":189,"children":191},{"className":190},[],[192],{"type":52,"value":193},"\u003C!-- Features -->",{"type":52,"value":195},". Only WordPress block delimiter comments are allowed.",{"type":47,"tag":72,"props":197,"children":198},{},[199,201,207],{"type":52,"value":200},"No custom class names on inner DOM elements. Put custom classes only on the outermost block wrapper via the block ",{"type":47,"tag":78,"props":202,"children":204},{"className":203},[],[205],{"type":52,"value":206},"className",{"type":52,"value":208}," attribute.",{"type":47,"tag":72,"props":210,"children":211},{},[212,214,220,222,228,230,236],{"type":52,"value":213},"Style buttons via ",{"type":47,"tag":78,"props":215,"children":217},{"className":216},[],[218],{"type":52,"value":219},".wp-element-button",{"type":52,"value":221}," — the inner element WordPress applies the button's padding, background, and border to (shared by the button block and buttons from other blocks). A custom class on a button block sits on the ",{"type":47,"tag":78,"props":223,"children":225},{"className":224},[],[226],{"type":52,"value":227},".wp-block-button",{"type":52,"value":229}," wrapper, so descend to ",{"type":47,"tag":78,"props":231,"children":233},{"className":232},[],[234],{"type":52,"value":235},".your-class .wp-element-button",{"type":52,"value":237},"; never style the wrapper directly, or its padding stacks on top of the default and the button doubles in size.",{"type":47,"tag":72,"props":239,"children":240},{},[241,243,249,251,256,258,263,265,271],{"type":52,"value":242},"No inline ",{"type":47,"tag":78,"props":244,"children":246},{"className":245},[],[247],{"type":52,"value":248},"style",{"type":52,"value":250}," attributes or block ",{"type":47,"tag":78,"props":252,"children":254},{"className":253},[],[255],{"type":52,"value":248},{"type":52,"value":257}," attributes for styling. Use ",{"type":47,"tag":78,"props":259,"children":261},{"className":260},[],[262],{"type":52,"value":206},{"type":52,"value":264}," plus the theme's ",{"type":47,"tag":78,"props":266,"children":268},{"className":267},[],[269],{"type":52,"value":270},"style.css",{"type":52,"value":272},".",{"type":47,"tag":72,"props":274,"children":275},{},[276,278,284,286,292,294,299,301,307,309,315,317,323],{"type":52,"value":277},"Prefer theme palette colors over hardcoded hex. Apply block colors with palette ",{"type":47,"tag":279,"props":280,"children":281},"strong",{},[282],{"type":52,"value":283},"slug",{"type":52,"value":285}," attributes — ",{"type":47,"tag":78,"props":287,"children":289},{"className":288},[],[290],{"type":52,"value":291},"{\"backgroundColor\":\"accent-1\",\"textColor\":\"base\"}",{"type":52,"value":293}," — and in ",{"type":47,"tag":78,"props":295,"children":297},{"className":296},[],[298],{"type":52,"value":270},{"type":52,"value":300}," reference palette colors as ",{"type":47,"tag":78,"props":302,"children":304},{"className":303},[],[305],{"type":52,"value":306},"var(--wp--preset--color--\u003Cslug>)",{"type":52,"value":308},". Discover the available slugs from the active theme's ",{"type":47,"tag":78,"props":310,"children":312},{"className":311},[],[313],{"type":52,"value":314},"theme.json",{"type":52,"value":316}," ",{"type":47,"tag":78,"props":318,"children":320},{"className":319},[],[321],{"type":52,"value":322},"settings.color.palette",{"type":52,"value":324}," (for a theme you are building, the palette you defined there); when you want a color the palette lacks, prefer adding it to the palette and referencing its slug. Keeping colors on the palette keeps sections in sync with Global Styles, theme switching, and light\u002Fdark variations. A raw hex value is fine for a deliberate one-off, but it should be the exception, not the default.",{"type":47,"tag":72,"props":326,"children":327},{},[328,330,336,338,343],{"type":52,"value":329},"Use ",{"type":47,"tag":78,"props":331,"children":333},{"className":332},[],[334],{"type":52,"value":335},"core\u002Fspacer",{"type":52,"value":337}," for empty spacing elements, not empty ",{"type":47,"tag":78,"props":339,"children":341},{"className":340},[],[342],{"type":52,"value":83},{"type":52,"value":344}," blocks.",{"type":47,"tag":72,"props":346,"children":347},{},[348],{"type":52,"value":349},"No emojis anywhere in generated content.",{"type":47,"tag":61,"props":351,"children":353},{"id":352},"layout-cascade",[354],{"type":52,"value":355},"Layout Cascade",{"type":47,"tag":55,"props":357,"children":358},{},[359,361,367,369,374,376,382,384,390,392,398],{"type":52,"value":360},"WordPress constrains children of ",{"type":47,"tag":78,"props":362,"children":364},{"className":363},[],[365],{"type":52,"value":366},"core\u002Fpost-content",{"type":52,"value":368}," and any constrained-layout container to ",{"type":47,"tag":78,"props":370,"children":372},{"className":371},[],[373],{"type":52,"value":314},{"type":52,"value":375},"'s ",{"type":47,"tag":78,"props":377,"children":379},{"className":378},[],[380],{"type":52,"value":381},"settings.layout.contentSize",{"type":52,"value":383},", which is about 700px by default. Custom CSS such as ",{"type":47,"tag":78,"props":385,"children":387},{"className":386},[],[388],{"type":52,"value":389},".hero { width: 100% }",{"type":52,"value":391}," does not override core layout selectors like ",{"type":47,"tag":78,"props":393,"children":395},{"className":394},[],[396],{"type":52,"value":397},".is-layout-constrained > *:not(.alignwide):not(.alignfull)",{"type":52,"value":399}," because they are more specific.",{"type":47,"tag":55,"props":401,"children":402},{},[403],{"type":52,"value":404},"Use these patterns:",{"type":47,"tag":68,"props":406,"children":407},{},[408,433,457],{"type":47,"tag":72,"props":409,"children":410},{},[411,416,418,423,425,431],{"type":47,"tag":279,"props":412,"children":413},{},[414],{"type":52,"value":415},"Full-bleed section, constrained inner content",{"type":52,"value":417},": for a full-width hero, banner, or CTA with centered content, use an outer ",{"type":47,"tag":78,"props":419,"children":421},{"className":420},[],[422],{"type":52,"value":83},{"type":52,"value":424}," with ",{"type":47,"tag":78,"props":426,"children":428},{"className":427},[],[429],{"type":52,"value":430},"{\"align\":\"full\",\"layout\":{\"type\":\"constrained\"}}",{"type":52,"value":432},", then place normal inner blocks inside it.",{"type":47,"tag":72,"props":434,"children":435},{},[436,441,443,448,450,456],{"type":47,"tag":279,"props":437,"children":438},{},[439],{"type":52,"value":440},"Full-bleed section, full-bleed inner content",{"type":52,"value":442},": for image grids, edge-to-edge galleries, and similar layouts, use outer and inner ",{"type":47,"tag":78,"props":444,"children":446},{"className":445},[],[447],{"type":52,"value":83},{"type":52,"value":449}," blocks with ",{"type":47,"tag":78,"props":451,"children":453},{"className":452},[],[454],{"type":52,"value":455},"{\"align\":\"full\",\"layout\":{\"type\":\"default\"}}",{"type":52,"value":272},{"type":47,"tag":72,"props":458,"children":459},{},[460,465,467,473],{"type":47,"tag":279,"props":461,"children":462},{},[463],{"type":52,"value":464},"Standard constrained content",{"type":52,"value":466},": omit ",{"type":47,"tag":78,"props":468,"children":470},{"className":469},[],[471],{"type":52,"value":472},"align",{"type":52,"value":474}," and write normal blocks.",{"type":47,"tag":55,"props":476,"children":477},{},[478,480,486,488,494],{"type":52,"value":479},"The common failure is a hero or banner that was intended to be full-width but still renders in the narrow content column. Fix that in markup by adding ",{"type":47,"tag":78,"props":481,"children":483},{"className":482},[],[484],{"type":52,"value":485},"align: \"full\"",{"type":52,"value":487}," on the outer group or correcting the inner ",{"type":47,"tag":78,"props":489,"children":491},{"className":490},[],[492],{"type":52,"value":493},"layout",{"type":52,"value":495}," type, not by trying to force width in CSS.",{"type":47,"tag":61,"props":497,"children":499},{"id":498},"root-block-gap",[500],{"type":52,"value":501},"Root Block Gap",{"type":47,"tag":55,"props":503,"children":504},{},[505,507,513,515,521,523,528,530,536],{"type":52,"value":506},"WordPress inserts ",{"type":47,"tag":78,"props":508,"children":510},{"className":509},[],[511],{"type":52,"value":512},"margin-block-start: var(--wp--style--block-gap)",{"type":52,"value":514}," between the top-level children of the rendered template — between the header template part, the main group, and the footer template part (",{"type":47,"tag":78,"props":516,"children":518},{"className":517},[],[519],{"type":52,"value":520},".wp-site-blocks > * + *",{"type":52,"value":522},"). Core supplies a default gap (24px) even when the theme's ",{"type":47,"tag":78,"props":524,"children":526},{"className":525},[],[527],{"type":52,"value":314},{"type":52,"value":529}," never declares ",{"type":47,"tag":78,"props":531,"children":533},{"className":532},[],[534],{"type":52,"value":535},"styles.spacing.blockGap",{"type":52,"value":537},", so a gap appears there that no markup asked for.",{"type":47,"tag":68,"props":539,"children":540},{},[541,569,581,601],{"type":47,"tag":72,"props":542,"children":543},{},[544,546,552,554,559,561,567],{"type":52,"value":545},"Themes created with ",{"type":47,"tag":78,"props":547,"children":549},{"className":548},[],[550],{"type":52,"value":551},"scaffold_theme",{"type":52,"value":553}," already zero this in ",{"type":47,"tag":78,"props":555,"children":557},{"className":556},[],[558],{"type":52,"value":270},{"type":52,"value":560}," (",{"type":47,"tag":78,"props":562,"children":564},{"className":563},[],[565],{"type":52,"value":566},".wp-site-blocks > * + * { margin-block-start: 0; }",{"type":52,"value":568},") — sections butt edge-to-edge and own their vertical rhythm via their own padding. Keep that reset when editing the file.",{"type":47,"tag":72,"props":570,"children":571},{},[572,574,579],{"type":52,"value":573},"When working in a theme without that reset, add the same rule to the theme's ",{"type":47,"tag":78,"props":575,"children":577},{"className":576},[],[578],{"type":52,"value":270},{"type":52,"value":580}," instead of compensating with negative margins or guessing at the extra space.",{"type":47,"tag":72,"props":582,"children":583},{},[584,586,592,594,599],{"type":52,"value":585},"Do not zero the gap by setting ",{"type":47,"tag":78,"props":587,"children":589},{"className":588},[],[590],{"type":52,"value":591},"styles.spacing.blockGap: \"0\"",{"type":52,"value":593}," in ",{"type":47,"tag":78,"props":595,"children":597},{"className":596},[],[598],{"type":52,"value":314},{"type":52,"value":600}," — that value cascades as the default gap inside every flow and constrained layout and collapses content rhythm site-wide.",{"type":47,"tag":72,"props":602,"children":603},{},[604],{"type":52,"value":605},"When you want visible space between top-level sections, add it deliberately (padding on the sections) so the spacing is designed, not inherited.",{"type":47,"tag":61,"props":607,"children":609},{"id":608},"skeleton-first-recipes",[610],{"type":52,"value":611},"Skeleton-First Recipes",{"type":47,"tag":55,"props":613,"children":614},{},[615,617,623],{"type":52,"value":616},"For long files over about 200 lines, write a small skeleton first and fill anchors across later ",{"type":47,"tag":78,"props":618,"children":620},{"className":619},[],[621],{"type":52,"value":622},"Edit",{"type":52,"value":624}," calls.",{"type":47,"tag":626,"props":627,"children":629},"h3",{"id":628},"theme-css",[630],{"type":52,"value":631},"Theme CSS",{"type":47,"tag":55,"props":633,"children":634},{},[635,637,642],{"type":52,"value":636},"For ",{"type":47,"tag":78,"props":638,"children":640},{"className":639},[],[641],{"type":52,"value":270},{"type":52,"value":643},", start with custom properties and anchor comments only:",{"type":47,"tag":645,"props":646,"children":650},"pre",{"className":647,"code":648,"language":21,"meta":649,"style":649},"language-css shiki shiki-themes material-theme-lighter material-theme material-theme-palenight",":root {\n    \u002F* Map section variables onto the theme palette — reference preset slugs,\n       never hardcode hex here. The slugs come from theme.json's color palette. *\u002F\n    --site-bg: var( --wp--preset--color--base );\n    --site-text: var( --wp--preset--color--contrast );\n}\n\n\u002F* === reset === *\u002F\n\u002F* === typography === *\u002F\n\u002F* === hero === *\u002F\n\u002F* === sections === *\u002F\n\u002F* === cta === *\u002F\n\u002F* === footer === *\u002F\n\u002F* === responsive === *\u002F\n","",[651],{"type":47,"tag":78,"props":652,"children":653},{"__ignoreMap":649},[654,676,686,695,730,760,769,778,787,796,805,814,823,832],{"type":47,"tag":655,"props":656,"children":659},"span",{"class":657,"line":658},"line",1,[660,666,671],{"type":47,"tag":655,"props":661,"children":663},{"style":662},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[664],{"type":52,"value":665},":",{"type":47,"tag":655,"props":667,"children":669},{"style":668},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[670],{"type":52,"value":44},{"type":47,"tag":655,"props":672,"children":673},{"style":662},[674],{"type":52,"value":675}," {\n",{"type":47,"tag":655,"props":677,"children":679},{"class":657,"line":678},2,[680],{"type":47,"tag":655,"props":681,"children":683},{"style":682},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[684],{"type":52,"value":685},"    \u002F* Map section variables onto the theme palette — reference preset slugs,\n",{"type":47,"tag":655,"props":687,"children":689},{"class":657,"line":688},3,[690],{"type":47,"tag":655,"props":691,"children":692},{"style":682},[693],{"type":52,"value":694},"       never hardcode hex here. The slugs come from theme.json's color palette. *\u002F\n",{"type":47,"tag":655,"props":696,"children":698},{"class":657,"line":697},4,[699,705,709,715,720,725],{"type":47,"tag":655,"props":700,"children":702},{"style":701},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[703],{"type":52,"value":704},"    --site-bg",{"type":47,"tag":655,"props":706,"children":707},{"style":662},[708],{"type":52,"value":665},{"type":47,"tag":655,"props":710,"children":712},{"style":711},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[713],{"type":52,"value":714}," var",{"type":47,"tag":655,"props":716,"children":717},{"style":662},[718],{"type":52,"value":719},"(",{"type":47,"tag":655,"props":721,"children":722},{"style":701},[723],{"type":52,"value":724}," --wp--preset--color--base ",{"type":47,"tag":655,"props":726,"children":727},{"style":662},[728],{"type":52,"value":729},");\n",{"type":47,"tag":655,"props":731,"children":733},{"class":657,"line":732},5,[734,739,743,747,751,756],{"type":47,"tag":655,"props":735,"children":736},{"style":701},[737],{"type":52,"value":738},"    --site-text",{"type":47,"tag":655,"props":740,"children":741},{"style":662},[742],{"type":52,"value":665},{"type":47,"tag":655,"props":744,"children":745},{"style":711},[746],{"type":52,"value":714},{"type":47,"tag":655,"props":748,"children":749},{"style":662},[750],{"type":52,"value":719},{"type":47,"tag":655,"props":752,"children":753},{"style":701},[754],{"type":52,"value":755}," --wp--preset--color--contrast ",{"type":47,"tag":655,"props":757,"children":758},{"style":662},[759],{"type":52,"value":729},{"type":47,"tag":655,"props":761,"children":763},{"class":657,"line":762},6,[764],{"type":47,"tag":655,"props":765,"children":766},{"style":662},[767],{"type":52,"value":768},"}\n",{"type":47,"tag":655,"props":770,"children":772},{"class":657,"line":771},7,[773],{"type":47,"tag":655,"props":774,"children":775},{"emptyLinePlaceholder":42},[776],{"type":52,"value":777},"\n",{"type":47,"tag":655,"props":779,"children":781},{"class":657,"line":780},8,[782],{"type":47,"tag":655,"props":783,"children":784},{"style":682},[785],{"type":52,"value":786},"\u002F* === reset === *\u002F\n",{"type":47,"tag":655,"props":788,"children":790},{"class":657,"line":789},9,[791],{"type":47,"tag":655,"props":792,"children":793},{"style":682},[794],{"type":52,"value":795},"\u002F* === typography === *\u002F\n",{"type":47,"tag":655,"props":797,"children":799},{"class":657,"line":798},10,[800],{"type":47,"tag":655,"props":801,"children":802},{"style":682},[803],{"type":52,"value":804},"\u002F* === hero === *\u002F\n",{"type":47,"tag":655,"props":806,"children":808},{"class":657,"line":807},11,[809],{"type":47,"tag":655,"props":810,"children":811},{"style":682},[812],{"type":52,"value":813},"\u002F* === sections === *\u002F\n",{"type":47,"tag":655,"props":815,"children":817},{"class":657,"line":816},12,[818],{"type":47,"tag":655,"props":819,"children":820},{"style":682},[821],{"type":52,"value":822},"\u002F* === cta === *\u002F\n",{"type":47,"tag":655,"props":824,"children":826},{"class":657,"line":825},13,[827],{"type":47,"tag":655,"props":828,"children":829},{"style":682},[830],{"type":52,"value":831},"\u002F* === footer === *\u002F\n",{"type":47,"tag":655,"props":833,"children":835},{"class":657,"line":834},14,[836],{"type":47,"tag":655,"props":837,"children":838},{"style":682},[839],{"type":52,"value":840},"\u002F* === responsive === *\u002F\n",{"type":47,"tag":55,"props":842,"children":843},{},[844,846,851,853,859],{"type":52,"value":845},"Keep the skeleton under 2KB. Fill one anchor per ",{"type":47,"tag":78,"props":847,"children":849},{"className":848},[],[850],{"type":52,"value":622},{"type":52,"value":852},", using the anchor line as ",{"type":47,"tag":78,"props":854,"children":856},{"className":855},[],[857],{"type":52,"value":858},"old_string",{"type":52,"value":860}," and replacing it with the anchor plus the new styles.",{"type":47,"tag":55,"props":862,"children":863},{},[864,866,871,873,879,881,886,888,893,895,901],{"type":52,"value":865},"When ",{"type":47,"tag":78,"props":867,"children":869},{"className":868},[],[870],{"type":52,"value":551},{"type":52,"value":872}," was used, do not ",{"type":47,"tag":78,"props":874,"children":876},{"className":875},[],[877],{"type":52,"value":878},"Write",{"type":52,"value":880}," over the scaffolded ",{"type":47,"tag":78,"props":882,"children":884},{"className":883},[],[885],{"type":52,"value":270},{"type":52,"value":887},"; it already contains the required theme header. Use ",{"type":47,"tag":78,"props":889,"children":891},{"className":890},[],[892],{"type":52,"value":622},{"type":52,"value":894}," to append the ",{"type":47,"tag":78,"props":896,"children":898},{"className":897},[],[899],{"type":52,"value":900},":root",{"type":52,"value":902}," block and anchor comments below the existing content.",{"type":47,"tag":626,"props":904,"children":906},{"id":905},"page-content",[907],{"type":52,"value":908},"Page Content",{"type":47,"tag":55,"props":910,"children":911},{},[912],{"type":52,"value":913},"For long page content:",{"type":47,"tag":915,"props":916,"children":917},"ol",{},[918],{"type":47,"tag":72,"props":919,"children":920},{},[921],{"type":52,"value":922},"Create the page empty:",{"type":47,"tag":645,"props":924,"children":928},{"className":925,"code":927,"language":52,"meta":649},[926],"language-text","wp_cli post create --post_content=\"\"\n",[929],{"type":47,"tag":78,"props":930,"children":931},{"__ignoreMap":649},[932],{"type":52,"value":927},{"type":47,"tag":915,"props":934,"children":935},{"start":678},[936],{"type":47,"tag":72,"props":937,"children":938},{},[939,941,947],{"type":52,"value":940},"Write ",{"type":47,"tag":78,"props":942,"children":944},{"className":943},[],[945],{"type":52,"value":946},"\u003Csite>\u002Ftmp\u002Fpage-\u003Cslug>.html",{"type":52,"value":948},", not a file inside the theme, with small section anchors:",{"type":47,"tag":645,"props":950,"children":953},{"className":951,"code":952,"language":14,"meta":649,"style":649},"language-html shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003C!-- section:hero -->\n\u003C!-- section:features -->\n\u003C!-- section:cta -->\n",[954],{"type":47,"tag":78,"props":955,"children":956},{"__ignoreMap":649},[957,965,973],{"type":47,"tag":655,"props":958,"children":959},{"class":657,"line":658},[960],{"type":47,"tag":655,"props":961,"children":962},{"style":682},[963],{"type":52,"value":964},"\u003C!-- section:hero -->\n",{"type":47,"tag":655,"props":966,"children":967},{"class":657,"line":678},[968],{"type":47,"tag":655,"props":969,"children":970},{"style":682},[971],{"type":52,"value":972},"\u003C!-- section:features -->\n",{"type":47,"tag":655,"props":974,"children":975},{"class":657,"line":688},[976],{"type":47,"tag":655,"props":977,"children":978},{"style":682},[979],{"type":52,"value":980},"\u003C!-- section:cta -->\n",{"type":47,"tag":915,"props":982,"children":983},{"start":688},[984,1002,1049],{"type":47,"tag":72,"props":985,"children":986},{},[987,989,994,996,1001],{"type":52,"value":988},"Fill one anchor per ",{"type":47,"tag":78,"props":990,"children":992},{"className":991},[],[993],{"type":52,"value":622},{"type":52,"value":995}," using editable blocks. Never wrap a section in ",{"type":47,"tag":78,"props":997,"children":999},{"className":998},[],[1000],{"type":52,"value":139},{"type":52,"value":272},{"type":47,"tag":72,"props":1003,"children":1004},{},[1005,1010,1012,1018,1019,1025,1027,1032,1034,1040,1042,1047],{"type":47,"tag":279,"props":1006,"children":1007},{},[1008],{"type":52,"value":1009},"Validate before applying (mandatory gate).",{"type":52,"value":1011}," Once all anchors are filled, you MUST call ",{"type":47,"tag":78,"props":1013,"children":1015},{"className":1014},[],[1016],{"type":52,"value":1017},"validate_blocks",{"type":52,"value":424},{"type":47,"tag":78,"props":1020,"children":1022},{"className":1021},[],[1023],{"type":52,"value":1024},"filePath",{"type":52,"value":1026}," pointing at ",{"type":47,"tag":78,"props":1028,"children":1030},{"className":1029},[],[1031],{"type":52,"value":946},{"type":52,"value":1033}," and get a passing result — the core\u002Fhtml policy passes and editor validation reports all blocks valid. This is not optional and not a step you can defer to after ",{"type":47,"tag":78,"props":1035,"children":1037},{"className":1036},[],[1038],{"type":52,"value":1039},"wp_cli eval",{"type":52,"value":1041},": the scratch file is block content, so it must be validated as a file while it still lives in a file. If validation reports invalid blocks, fix them in the file and call ",{"type":47,"tag":78,"props":1043,"children":1045},{"className":1044},[],[1046],{"type":52,"value":1017},{"type":52,"value":1048}," again until it passes. Never apply block content you have not validated.",{"type":47,"tag":72,"props":1050,"children":1051},{},[1052],{"type":52,"value":1053},"Apply the validated content once:",{"type":47,"tag":645,"props":1055,"children":1058},{"className":1056,"code":1057,"language":52,"meta":649},[926],"wp_cli eval '$content = file_get_contents(ABSPATH . \"tmp\u002Fpage-\u003Cslug>.html\"); wp_update_post([\"ID\" => \u003Cid>, \"post_content\" => $content]); echo \"ok\";'\n",[1059],{"type":47,"tag":78,"props":1060,"children":1061},{"__ignoreMap":649},[1062],{"type":52,"value":1057},{"type":47,"tag":55,"props":1064,"children":1065},{},[1066,1068,1074,1076,1082,1084,1090,1092,1098],{"type":52,"value":1067},"Do not use ",{"type":47,"tag":78,"props":1069,"children":1071},{"className":1070},[],[1072],{"type":52,"value":1073},"--post_content-file=\u003Chost path>",{"type":52,"value":1075},". ",{"type":47,"tag":78,"props":1077,"children":1079},{"className":1078},[],[1080],{"type":52,"value":1081},"wp_cli",{"type":52,"value":1083}," runs inside the PHP-WASM filesystem; the host site directory is mounted at ",{"type":47,"tag":78,"props":1085,"children":1087},{"className":1086},[],[1088],{"type":52,"value":1089},"\u002Fwordpress\u002F",{"type":52,"value":1091},", so ",{"type":47,"tag":78,"props":1093,"children":1095},{"className":1094},[],[1096],{"type":52,"value":1097},"ABSPATH === \"\u002Fwordpress\u002F\"",{"type":52,"value":1099},". Host paths are not readable there and can silently update the post to empty content.",{"type":47,"tag":61,"props":1101,"children":1103},{"id":1102},"validation",[1104],{"type":52,"value":1105},"Validation",{"type":47,"tag":68,"props":1107,"children":1108},{},[1109,1143],{"type":47,"tag":72,"props":1110,"children":1111},{},[1112,1114,1119,1121,1126,1128,1134,1136,1141],{"type":52,"value":1113},"Validation is a mandatory gate, not a cleanup step. You MUST call ",{"type":47,"tag":78,"props":1115,"children":1117},{"className":1116},[],[1118],{"type":52,"value":1017},{"type":52,"value":1120}," and get a passing result for any block content you generate ",{"type":47,"tag":279,"props":1122,"children":1123},{},[1124],{"type":52,"value":1125},"before",{"type":52,"value":1127}," that content reaches the live site — before ",{"type":47,"tag":78,"props":1129,"children":1131},{"className":1130},[],[1132],{"type":52,"value":1133},"wp_cli post create\u002Fupdate",{"type":52,"value":1135},", before ",{"type":47,"tag":78,"props":1137,"children":1139},{"className":1138},[],[1140],{"type":52,"value":1039},{"type":52,"value":1142},", and before importing a scratch file. Never apply, import, or save block content you have not validated. A build that skips validation is incomplete, even if the page renders.",{"type":47,"tag":72,"props":1144,"children":1145},{},[1146,1148,1153,1155,1160,1162,1167,1169,1174,1176,1181,1183,1188,1190,1195],{"type":52,"value":1147},"Run ",{"type":47,"tag":78,"props":1149,"children":1151},{"className":1150},[],[1152],{"type":52,"value":1017},{"type":52,"value":1154}," after every write or edit that creates or changes block content. Call it with ",{"type":47,"tag":78,"props":1156,"children":1158},{"className":1157},[],[1159],{"type":52,"value":1024},{"type":52,"value":1161}," whenever the content lives in a file — including scratch files such as ",{"type":47,"tag":78,"props":1163,"children":1165},{"className":1164},[],[1166],{"type":52,"value":946},{"type":52,"value":1168}," that you later import with ",{"type":47,"tag":78,"props":1170,"children":1172},{"className":1171},[],[1173],{"type":52,"value":1039},{"type":52,"value":1175},". The scratch file is the block content; validate the file, not just the eventual post. It first runs a static ",{"type":47,"tag":78,"props":1177,"children":1179},{"className":1178},[],[1180],{"type":52,"value":139},{"type":52,"value":1182}," policy check: if that reports invalid ",{"type":47,"tag":78,"props":1184,"children":1186},{"className":1185},[],[1187],{"type":52,"value":139},{"type":52,"value":1189}," blocks, editor validation is skipped — rewrite only those blocks as editable core or plugin blocks, then call ",{"type":47,"tag":78,"props":1191,"children":1193},{"className":1192},[],[1194],{"type":52,"value":1017},{"type":52,"value":1196}," again. Once the policy passes it validates in the live editor and applies safe serialization fixes directly to the file. If it says an auto-fix was applied, do not manually replace markup or call validation again unless you intentionally change block markup afterward. Use the diff only to inspect structural changes for CSS impact. Classes added or removed by the validator can affect layout and styling.",{"type":47,"tag":248,"props":1198,"children":1199},{},[1200],{"type":52,"value":1201},"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":1203,"total":825},[1204,1223,1230,1244,1261,1276,1289],{"slug":1205,"name":1205,"fn":1206,"description":1207,"org":1208,"tags":1209,"stars":25,"repoUrl":26,"updatedAt":1222},"annotate","collect visual feedback with browser annotation tools","Open a browser with visual annotation tools. The user clicks elements on their site and leaves feedback — the agent reads annotations and makes changes. Use this when the user wants to point at specific elements to fix, tweak, or redesign.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1210,1213,1216,1219],{"name":1211,"slug":1212,"type":15},"Frontend","frontend",{"name":1214,"slug":1215,"type":15},"Productivity","productivity",{"name":1217,"slug":1218,"type":15},"UX Copy","ux-copy",{"name":1220,"slug":1221,"type":15},"UX Design","ux-design","2026-05-06T05:40:01.516544",{"slug":4,"name":4,"fn":5,"description":6,"org":1224,"tags":1225,"stars":25,"repoUrl":26,"updatedAt":27},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1226,1227,1228,1229],{"name":23,"slug":24,"type":15},{"name":20,"slug":21,"type":15},{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"slug":1231,"name":1231,"fn":1232,"description":1233,"org":1234,"tags":1235,"stars":25,"repoUrl":26,"updatedAt":1243},"hosting-plans-helper","provide WordPress.com hosting plan information","Answer WordPress.com plan, pricing, upgrade, and feature-tier questions (plan names, what each tier unlocks — plugins, themes, custom code, SSH, hosting — and current prices) from authoritative live data. Load before answering ANY plan, pricing, or feature-gating question; never answer these from memory.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1236,1239,1242],{"name":1237,"slug":1238,"type":15},"Pricing","pricing",{"name":1240,"slug":1241,"type":15},"Reference","reference",{"name":17,"slug":18,"type":15},"2026-07-02T07:42:33.654791",{"slug":1245,"name":1245,"fn":1246,"description":1247,"org":1248,"tags":1249,"stars":25,"repoUrl":26,"updatedAt":1260},"liberate","migrate websites to WordPress","Import and rebuild a website from a closed platform (Wix, Squarespace, Webflow, Shopify, GoDaddy, Hostinger, HubSpot, Weebly) into a Studio WordPress site. Extracts pages\u002Fposts\u002Fproducts + media, then reconstructs the design as editable blocks + WooCommerce OR as a high-fidelity replica theme. Invoke when the user wants to migrate, import, liberate, or rebuild a site from one of these platforms.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1250,1253,1256,1259],{"name":1251,"slug":1252,"type":15},"CMS","cms",{"name":1254,"slug":1255,"type":15},"Migration","migration",{"name":1257,"slug":1258,"type":15},"Web Development","web-development",{"name":17,"slug":18,"type":15},"2026-07-09T06:47:33.454311",{"slug":1262,"name":1262,"fn":1263,"description":1264,"org":1265,"tags":1266,"stars":25,"repoUrl":26,"updatedAt":1275},"need-for-speed","run frontend performance audits for WordPress sites","Run a frontend performance audit on a WordPress site and get actionable optimization recommendations.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1267,1270,1271,1274],{"name":1268,"slug":1269,"type":15},"Audit","audit",{"name":1211,"slug":1212,"type":15},{"name":1272,"slug":1273,"type":15},"Performance","performance",{"name":17,"slug":18,"type":15},"2026-05-06T05:40:06.433267",{"slug":172,"name":172,"fn":1277,"description":1278,"org":1279,"tags":1280,"stars":25,"repoUrl":26,"updatedAt":1288},"recommend WordPress plugins for site features","Choose recommended plugins and plugin-provided blocks for features core WordPress blocks do not cover - ecommerce (WooCommerce), forms and newsletters (Jetpack), online courses and quizzes (Sensei LMS), polls, surveys and ratings (Crowdsignal), spam protection (Akismet) - while keeping generated content editable and avoiding raw HTML fallbacks. Any request to sell products or build a shop, store, or storefront requires WooCommerce with products.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1281,1284,1287],{"name":1282,"slug":1283,"type":15},"Content Creation","content-creation",{"name":1285,"slug":1286,"type":15},"Plugin Development","plugin-development",{"name":17,"slug":18,"type":15},"2026-05-27T07:01:58.249105",{"slug":1290,"name":1290,"fn":1291,"description":1292,"org":1293,"tags":1294,"stars":25,"repoUrl":26,"updatedAt":1303},"rank-me-up","run on-page SEO audits for WordPress sites","Run an on-page SEO audit on a WordPress site and get actionable recommendations to improve search visibility.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1295,1296,1299,1302],{"name":1268,"slug":1269,"type":15},{"name":1297,"slug":1298,"type":15},"Marketing","marketing",{"name":1300,"slug":1301,"type":15},"SEO","seo",{"name":17,"slug":18,"type":15},"2026-05-06T05:40:05.196367",{"items":1305,"total":1426},[1306,1313,1320,1326,1333,1340,1346,1353,1370,1380,1395,1411],{"slug":1205,"name":1205,"fn":1206,"description":1207,"org":1307,"tags":1308,"stars":25,"repoUrl":26,"updatedAt":1222},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1309,1310,1311,1312],{"name":1211,"slug":1212,"type":15},{"name":1214,"slug":1215,"type":15},{"name":1217,"slug":1218,"type":15},{"name":1220,"slug":1221,"type":15},{"slug":4,"name":4,"fn":5,"description":6,"org":1314,"tags":1315,"stars":25,"repoUrl":26,"updatedAt":27},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1316,1317,1318,1319],{"name":23,"slug":24,"type":15},{"name":20,"slug":21,"type":15},{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"slug":1231,"name":1231,"fn":1232,"description":1233,"org":1321,"tags":1322,"stars":25,"repoUrl":26,"updatedAt":1243},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1323,1324,1325],{"name":1237,"slug":1238,"type":15},{"name":1240,"slug":1241,"type":15},{"name":17,"slug":18,"type":15},{"slug":1245,"name":1245,"fn":1246,"description":1247,"org":1327,"tags":1328,"stars":25,"repoUrl":26,"updatedAt":1260},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1329,1330,1331,1332],{"name":1251,"slug":1252,"type":15},{"name":1254,"slug":1255,"type":15},{"name":1257,"slug":1258,"type":15},{"name":17,"slug":18,"type":15},{"slug":1262,"name":1262,"fn":1263,"description":1264,"org":1334,"tags":1335,"stars":25,"repoUrl":26,"updatedAt":1275},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1336,1337,1338,1339],{"name":1268,"slug":1269,"type":15},{"name":1211,"slug":1212,"type":15},{"name":1272,"slug":1273,"type":15},{"name":17,"slug":18,"type":15},{"slug":172,"name":172,"fn":1277,"description":1278,"org":1341,"tags":1342,"stars":25,"repoUrl":26,"updatedAt":1288},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1343,1344,1345],{"name":1282,"slug":1283,"type":15},{"name":1285,"slug":1286,"type":15},{"name":17,"slug":18,"type":15},{"slug":1290,"name":1290,"fn":1291,"description":1292,"org":1347,"tags":1348,"stars":25,"repoUrl":26,"updatedAt":1303},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1349,1350,1351,1352],{"name":1268,"slug":1269,"type":15},{"name":1297,"slug":1298,"type":15},{"name":1300,"slug":1301,"type":15},{"name":17,"slug":18,"type":15},{"slug":1354,"name":1354,"fn":1355,"description":1356,"org":1357,"tags":1358,"stars":25,"repoUrl":26,"updatedAt":1369},"site-spec","gather specifications for new WordPress sites","Gather the site name and layout preference before building a WordPress site. Run this before creating any new site.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1359,1362,1365,1368],{"name":1360,"slug":1361,"type":15},"Design","design",{"name":1363,"slug":1364,"type":15},"Product Management","product-management",{"name":1366,"slug":1367,"type":15},"Specs","specs",{"name":17,"slug":18,"type":15},"2026-05-06T05:40:02.739409",{"slug":1371,"name":1371,"fn":1372,"description":1373,"org":1374,"tags":1375,"stars":25,"repoUrl":26,"updatedAt":1379},"studio-cli","manage local WordPress sites with Studio CLI","Use the Studio CLI to manage local WordPress sites, authentication, and preview sites. Invoke this skill when you need to run Studio CLI commands, manage sites, or troubleshoot site issues.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1376,1378],{"name":1377,"slug":32,"type":15},"CLI",{"name":17,"slug":18,"type":15},"2026-04-06T18:02:57.150231",{"slug":1381,"name":1381,"fn":1382,"description":1383,"org":1384,"tags":1385,"stars":25,"repoUrl":26,"updatedAt":1394},"taxonomist","optimize WordPress category taxonomy","Analyze and optimize a WordPress site's category taxonomy. Exports all posts, uses AI to suggest an improved category structure — merging duplicates, retiring dead categories, creating missing ones, writing descriptions, and re-categorizing posts. Run this when the user wants to clean up or improve their categories.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1386,1389,1392,1393],{"name":1387,"slug":1388,"type":15},"Content Strategy","content-strategy",{"name":1390,"slug":1391,"type":15},"Data Cleaning","data-cleaning",{"name":1300,"slug":1301,"type":15},{"name":17,"slug":18,"type":15},"2026-05-06T05:40:03.966799",{"slug":1396,"name":1396,"fn":1397,"description":1398,"org":1399,"tags":1400,"stars":25,"repoUrl":26,"updatedAt":1410},"visual-design","plan and execute visual design direction","Plan and execute high-quality visual direction for site creation, redesign, layout, typography, color, motion, and visual polish.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1401,1404,1405,1408],{"name":1402,"slug":1403,"type":15},"Animation","animation",{"name":1360,"slug":1361,"type":15},{"name":1406,"slug":1407,"type":15},"Typography","typography",{"name":1409,"slug":1396,"type":15},"Visual Design","2026-07-24T05:40:57.887452",{"slug":1412,"name":1412,"fn":1413,"description":1414,"org":1415,"tags":1416,"stars":25,"repoUrl":26,"updatedAt":1425},"visual-polish","verify and polish website visual design","Verify and polish a built or redesigned site by diagnosing rendered-DOM issues against intent and fixing them in a planned, batched screenshot-and-fix loop.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1417,1420,1421,1424],{"name":1418,"slug":1419,"type":15},"Debugging","debugging",{"name":1211,"slug":1212,"type":15},{"name":1422,"slug":1423,"type":15},"Screenshots","screenshots",{"name":1409,"slug":1396,"type":15},"2026-06-06T07:09:59.809812",81]