npx claudepluginhub bennypowers/cem --plugin cemThis skill uses the workspace's default tool permissions.
Guide the design of a custom element's public API, ensuring consistency with existing elements and CEM conventions.
Guides Next.js Cache Components and Partial Prerendering (PPR) with cacheComponents enabled. Implements 'use cache', cacheLife(), cacheTag(), revalidateTag(), static/dynamic optimization, and cache debugging.
Migrates code, prompts, and API calls from Claude Sonnet 4.0/4.5 or Opus 4.1 to Opus 4.5, updating model strings on Anthropic, AWS, GCP, Azure platforms.
Automates semantic versioning and release workflow for Claude Code plugins: bumps versions in package.json, marketplace.json, plugin.json; verifies builds; creates git tags, GitHub releases, changelogs.
Guide the design of a custom element's public API, ensuring consistency with existing elements and CEM conventions.
Ask the user (if not already provided):
Read the existing elements to understand naming patterns:
cem://elements
For elements the user mentions as related or similar, read their full APIs:
cem://element/{tagName}
Also read any project-level guidelines:
cem://guidelines
Note existing patterns for:
disabled vs is-disabled)header, footer, actions patterns--element-property patternsWork through each API surface systematically:
disabled, not enabled)header, actions), not position (top, bottom)opened, closed)input, scroll)Event for type safety, rather than to ship CustomEvent--element-name-property naming convention:host attribute selectors with & -- &([attr]) inside :host {} is invalid because & substitutes :host literally, making &([attr]) parse as a function call rather than an attribute selector:host([variant="..."]) blocks flat at the top level; nesting is valid for descendants within those blocks/* WRONG: &([attr]) is invalid */
:host {
&([variant="primary"]) { ... }
}
/* RIGHT: flat :host selectors, nested descendants */
:host([variant="primary"]) {
--_color: blue;
}
:host([variant="primary"]) button {
&:hover { --_color: darkblue; }
&:active { --_color: navy; }
}
button, label, icon):state(loading), :state(empty))When presenting the designed API, show how each part should be documented in source code.
!cat ${CLAUDE_SKILL_DIR}/html-comment-syntax.md
Compare the proposed API against existing elements:
Present the designed API as a structured summary:
## `<prefix-element-name>` API Design
### Description
[One-paragraph purpose statement]
### Attributes
| Name | Type | Default | Description |
|------|------|---------|-------------|
| `variant` | `'primary' \| 'secondary'` | `'primary'` | Visual style variant |
### Slots
| Name | Description | Content Guidelines |
|------|-------------|--------------------|
| (default) | Primary content | Text or inline elements |
### Events
| Name | Type | Description |
|------|-------------|-------------|
| `change` | `MyChangeEvent` | Fired when value changes |
### CSS Custom Properties
| Name | Default | Description |
|------|---------|-------------|
| `--prefix-element-color` | `light-dark(#000, #fff)` | Primary text color |
### CSS Parts
| Name | Description |
|------|-------------|
| `button` | The internal button element |
### CSS States
| Name | Description |
|------|-------------|
| `loading` | Applied while async content loads |
Optionally, generate a skeleton class definition or manifest snippet if the user wants to start implementing.