style-creator
Style Creator
Add new art styles to the gemskills style library with properly crafted prompts, reference tiles, and registry entries.
When to Use
- Adding a new art style to the library
- Creating a regional or cultural aesthetic style
- Defining a custom visual style with a reference tile
- Batch-adding multiple related styles
Important: Working Directory
All file edits and commands operate relative to ${CLAUDE_PLUGIN_ROOT} (the plugin root).
Sharp may fail in the plugin cache. If bun run optimize fails, the tile generation script auto-optimizes. If both fail, use sips as a fallback:
sips -s format png -s formatOptions best <tile-path> --out <tile-path>
Workflow
Follow these steps in order. Do not skip steps.
Step 1: Define the Style
Gather from the user:
- Name: Human-readable name (e.g. "Miami Aesthetic")
- ID: Lowercase with hyphens (e.g.
miami-aesthetic) - Short name: 3-4 character abbreviation (e.g.
miam) - Category: One of:
traditional,digital,illustration,photography,design,retro,technique,decorative,creative,cultural
If the user provides only a name or concept, derive the ID and short name automatically. Choose the category that best fits.
Step 2: Write promptHints
The promptHints field is a comma-separated string of descriptors prepended to user prompts when the style is used. Focus on:
- Color palette keywords
- Texture and material descriptors
- Technique and medium references
- Mood and atmosphere terms
- Compositional patterns
Keep to 8-12 descriptors. These guide the model when generating user images, not the tile itself.
Step 3: Write the tilePrompt
Apply these principles — do NOT read external reference files, the rules are right here:
Core principle: Texture vs Object. The tile must transfer materiality/medium/technique, NOT a scene. A tile showing "a cyberpunk city" will bleed city elements into every user prompt. A tile showing "neon refractions on chrome with film grain" transfers only the visual physics.
6-part prompt structure:
- Full-bleed anchor:
Full-bleed [style] filling the entire canvas - Macro/texture anchor:
extreme close-up macro texture,seamless pattern,abstract composition - Style descriptors: Specific movements, artists, time periods
- Materiality/medium: What the art is "made of" —
cracked canvas,halftone dots,VHS static,watercolor bleed - Palette and lighting:
chiaroscuro,pastel gradients,neon rim light,sepia tones - Anti-container enforcers:
Edge to edge, no frame, no border, no [style-specific items]
Category tips:
- Abstract styles: Focus on geometry and brushwork, avoid naming objects
- Figurative styles (anime, comic): Generate the ink and paper, not a character. Use
dense montageorextreme macro of brushwork - Photography: Focus on camera artifacts — grain, light leaks, vignette, bokeh
- Design movements: Focus on repeating motifs and materials
- Regional aesthetics: Color palette and textures, NOT photos of places. No buildings, streets, or landmarks.
Anti-container items to add based on style:
- Paintings:
no canvas, no easel, no gallery, no museum, no wall - Crafts:
no hoop, no frame, no desk, no table - Photos:
no letterbox, no black bars, no monitor, no screen - Textiles:
no cloth edge, no fabric edge, no bed, no furniture
Step 4: Add to styles.json
Add the new style entry to the styles array in:
${CLAUDE_PLUGIN_ROOT}/skills/browsing-styles/assets/styles.json
Entry format:
{
"id": "style-id",
"shortName": "shrt",
"name": "Style Name",
"category": "category",
"promptHints": "descriptor1, descriptor2, descriptor3",
"tilePrompt": "Full-bleed ... Edge to edge, no frame, no border."
}
Verify the ID and short name are unique across all existing styles before adding.
Step 5: Generate the Tile
Generate the reference tile using the tile generation script:
bun run ${CLAUDE_PLUGIN_ROOT}/skills/browsing-styles/scripts/generate_tiles.ts --style <style-id>
This generates a 512x512 PNG tile at assets/tiles/<style-id>.png and auto-optimizes it.
If auto-optimization fails, try manually from the plugin root:
bun run ${CLAUDE_PLUGIN_ROOT}/optimize -- --file=skills/browsing-styles/assets/tiles/<style-id>.png
If sharp is unavailable, use sips:
sips -s format png -s formatOptions best ${CLAUDE_PLUGIN_ROOT}/skills/browsing-styles/assets/tiles/<style-id>.png --out ${CLAUDE_PLUGIN_ROOT}/skills/browsing-styles/assets/tiles/<style-id>.png
If the style benefits from a reference image (e.g. a regional aesthetic), use the generate-image script with --input:
bun run ${CLAUDE_PLUGIN_ROOT}/skills/generate-image/scripts/generate.ts \
"<tilePrompt text>" \
--input /path/to/reference.jpg \
--aspect 1:1 --size 1K \
--output ${CLAUDE_PLUGIN_ROOT}/skills/browsing-styles/assets/tiles/<style-id>.png
Step 6: Visual Verification
Do not read the generated tile back into context. Ask the user to visually inspect it. Common issues:
- Not full-bleed? (frames, borders, containers, canvas edges)
- Shows a scene instead of the aesthetic?
- Wrong color palette?
- Text, logos, or trademarked content?
If it fails, update the tilePrompt and regenerate.
Step 7: Update Counts
After adding styles, update the style count in these files:
${CLAUDE_PLUGIN_ROOT}/README.md(style count mentions)${CLAUDE_PLUGIN_ROOT}/.claude-plugin/plugin.json(description text and version bump)${CLAUDE_PLUGIN_ROOT}/skills/browsing-styles/SKILL.md(count)${CLAUDE_PLUGIN_ROOT}/skills/team-group-photo/SKILL.md(count)
Regenerate STYLES.md from the plugin root:
bun -e "
const root = process.env.CLAUDE_PLUGIN_ROOT;
const data = JSON.parse(require('fs').readFileSync(root + '/skills/browsing-styles/assets/styles.json', 'utf8'));
const styles = data.styles;
const cats = data.categories;
const grouped = {};
for (const s of styles) { if (!grouped[s.category]) grouped[s.category] = []; grouped[s.category].push(s); }
let md = '# Art Styles Reference\n\n' + styles.length + ' styles across ' + Object.keys(grouped).length + ' categories. Use \\\`--style <id>\\\` or \\\`--style <short>\\\` with any image generation skill.\n\n## Categories\n\n| Category | Count | Description |\n|----------|-------|-------------|\n';
for (const [cat, desc] of Object.entries(cats)) { md += '| ' + cat + ' | ' + (grouped[cat]?.length || 0) + ' | ' + desc + ' |\n'; }
md += '\n';
for (const [cat, desc] of Object.entries(cats)) { const items = grouped[cat] || []; if (!items.length) continue; md += '## ' + cat.charAt(0).toUpperCase() + cat.slice(1) + '\n\n| Tile | ID | Short | Name |\n|------|-----|-------|------|\n'; for (const s of items) { md += '| <img src=\"skills/browsing-styles/assets/tiles/' + s.id + '.png\" width=\"80\" /> | ' + s.id + ' | ' + s.shortName + ' | ' + s.name + ' |\n'; } md += '\n'; }
require('fs').writeFileSync(root + '/STYLES.md', md);
console.log('STYLES.md written with ' + styles.length + ' styles');
"
Step 8: Bump Version and Commit
Bump the patch version in ${CLAUDE_PLUGIN_ROOT}/.claude-plugin/plugin.json and commit all changes.
Context Discipline
Do not read generated tile images back into context. The scripts output file paths only. Ask the user to visually inspect tiles and provide feedback for iteration.