From genjutsu
Runs a full design pipeline: art direction brainstorm, design system generation, page-by-page implementation, and final visual audit. Adapts to Web, Android Compose, and Apple SwiftUI.
How this skill is triggered — by the user, by Claude, or both
Slash command
/genjutsu:paintThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
> Paint a complete visual universe. Brainstorm first, design system second, implement third, audit last.
Paint a complete visual universe. Brainstorm first, design system second, implement third, audit last. This is NOT a quick beautifier - it's a full design pipeline.
This skill speaks in two registers:
During execution - light ninja flair, signature, immersive. Short.
In reports / final summaries / audit results - plain, factual, dev-readable. Drop the flair entirely.
The flair lives at the intro and during work narration. The moment a result lands or a question gets asked, it's gone.
/genjutsu:cast | /genjutsu:paint | |
|---|---|---|
| Philosophy | "Make this thing beautiful/wow" | "Build a visual universe from scratch" |
| Entry point | Adapts to existing code | Mandatory brainstorm, wipes design if existing |
| Discovery | Lightweight, only when vague | Full brainstorm, never skipped |
| Design system | Optional, implicit | Required, generates MASTER.md |
| Audit | Quick check before delivery | Full design-audit at the end |
| Scope | One component/page/effect | Entire project visual identity |
/genjutsu:paint calls the same sub-skills as /genjutsu:cast for implementation.
# Environment detection:
# - claude.ai: skills are uploaded individually to /mnt/skills/user/<name>/
# - Claude Code: ${CLAUDE_PLUGIN_ROOT} resolves to THIS plugin version's
# install directory. Claude Code substitutes it anywhere in skill content.
# Single-bundle upload (genjutsu.zip) first: sub-skills live under this skill's
# own dir, e.g. /mnt/skills/user/genjutsu/_jutsu/<name>/.
BUNDLE_JUTSU="$(find /mnt/skills/user -maxdepth 2 -type d -name _jutsu 2>/dev/null | head -1)"
if [ -n "$BUNDLE_JUTSU" ]; then
# claude.ai - single self-contained genjutsu bundle
SKILL_BASE="$BUNDLE_JUTSU"
elif [ -d "/mnt/skills/user" ]; then
# claude.ai - each sub-skill is its own uploaded skill (detect the mount, not
# one specific sub-skill, so a partial upload still resolves the base).
SKILL_BASE="/mnt/skills/user"
else
# Claude Code plugin
SKILL_BASE="${CLAUDE_PLUGIN_ROOT}/skills/_jutsu"
# Fallback if the placeholder was not substituted: newest installed version.
# Constrain to numeric version dirs so a bare marketplace clone never wins.
if [ ! -d "$SKILL_BASE" ]; then
SKILL_BASE=$(find ~/.claude/plugins/cache -type d -path '*/genjutsu/[0-9]*/skills/_jutsu' 2>/dev/null | sort -V | tail -1)
fi
fi
# Abort clearly instead of cat-ing bogus paths if resolution failed.
if [ -z "$SKILL_BASE" ] || [ ! -d "$SKILL_BASE" ]; then
echo "genjutsu: could not resolve the sub-skills directory. On claude.ai upload the genjutsu skill ZIP(s); on Claude Code reinstall the plugin." >&2
fi
# Load a sub-skill, warning (not failing) if its ZIP was not uploaded / is missing.
load_skill() {
if [ -f "$SKILL_BASE/$1/SKILL.md" ]; then
cat "$SKILL_BASE/$1/SKILL.md"
else
echo "genjutsu: sub-skill '$1' not found - upload its ZIP (claude.ai) or reinstall the plugin; continuing without it." >&2
fi
}
All sub-skills are loaded via load_skill <name> (defined above), which cat's $SKILL_BASE/<name>/SKILL.md and warns instead of failing if a sub-skill was not uploaded.
This is the foundation. Rush it and everything downstream is wrong. The goal: understand the user's vision well enough to write two theses they'd agree with without hesitation.
Before asking the user about tech stack, scan the project to detect what's already there:
# 1. Web (existing)
cat package.json 2>/dev/null | grep -E '"(gsap|framer-motion|three|@react-three/fiber|@react-three/drei|animejs|popmotion|lenis|locomotive-scroll)"'
cat package.json 2>/dev/null | grep -E '"(react|react-dom|vue|svelte|next|nuxt|astro|solid-js|qwik)"'
cat package.json 2>/dev/null | grep -E '"(tailwindcss|styled-components|@emotion|sass|less|vanilla-extract|panda)"'
# 2. Android / Compose
ls build.gradle.kts build.gradle settings.gradle.kts settings.gradle 2>/dev/null
grep -rE 'androidx\.compose|implementation\("androidx\.compose' build.gradle* settings.gradle* 2>/dev/null
# 3. Compose Multiplatform / KMP
grep -rE 'org\.jetbrains\.compose|kotlin\("multiplatform"\)|id\("org\.jetbrains\.kotlin\.multiplatform"\)' build.gradle* settings.gradle* 2>/dev/null
# 4. Apple / SwiftUI
ls *.xcodeproj *.xcworkspace Package.swift 2>/dev/null
grep -lE 'import SwiftUI|@main.*App' --include="*.swift" -r . 2>/dev/null | head -1
# 5. Apple platform sub-detection (iOS vs macOS)
grep -E '\.iOS\(|\.macOS\(' Package.swift 2>/dev/null
grep -E 'SDKROOT = (iphoneos|macosx)' *.xcodeproj/project.pbxproj 2>/dev/null
# 6. Mobile web indicators
grep -rE 'viewport.*width=device-width|@media.*pointer:\s*coarse|@media.*max-width' --include='*.html' --include='*.css' --include='*.scss' . 2>/dev/null | head -3
ls public/manifest.json public/sw.js 2>/dev/null
# 7. Legacy bridge indicators (mention in DISCOVER, do not auto-load)
ls -- *.xib *.storyboard 2>/dev/null
find . -path '*/res/layout/*.xml' 2>/dev/null | head -1
grep -rE 'setContentView\(R\.layout' --include='*.kt' --include='*.java' . 2>/dev/null | head -1
Map the results:
.xib, .storyboard, layout XML, setContentView(R.layout.*). Mention only, no auto-load.If legacy mixed detected (XIB / storyboard / layout XML / setContentView(R.layout.*)):
Ask exactly one question during brainstorm:
"I see your project mixes [XML layouts / XIBs / classic Activities] with modern UI. For this task, should I stay on pure [Compose/SwiftUI], or integrate into a legacy screen?"
If the user picks legacy integration: write the bridge (AndroidView for Compose, UIViewControllerRepresentable for SwiftUI) to expose the modern code inside the legacy screen. Never generate new legacy code (no XML, no XIB, no setContentView).
The five domains to cover:
How to ask: One question at a time, starting with the least obvious domain. If you already know the tech stack from scanning package.json, don't ask — start with mood or audience instead. Each answer reshapes how you ask the next question.
How to handle vague answers:
When the user says "modern" or "clean" or "I don't know, just make it nice":
Never interpret a vague answer as confirmation. "Yeah something like that" means dig deeper — ask which part of "that" resonates.
When the user pushes to skip or rush brainstorm:
Do NOT capitulate. Instead:
"We've covered [covered areas]. I'm still missing [missing areas], which will directly impact [concrete consequence]. Want me to ask one more question, or would you rather I make assumptions and you correct them afterward?"
This gives them an informed choice. If they choose assumptions, name each assumption explicitly in the thesis.
Never negotiate the number of remaining questions ("just two more, I promise"). You don't know how many you need until you hear the answers.
When to stop: When you can write both theses (visual + interaction) and you'd bet money the user will say "oui parfait." If you'd be guessing on even one aspect, keep asking.
From the brainstorm, produce two theses:
A single sentence that captures the entire visual identity. Must explicitly address all four:
Example: "Dark neo-brutalist interface with bold monospace type, fluorescent chartreuse accents, generous whitespace, raw-edged components with offset shadows."
Self-check: read your thesis back. If any of the four areas is missing or vague ("nice typography"), rewrite it before presenting.
A single sentence that captures the motion and interaction language. Must explicitly address all four:
Example: "Fast and dry transitions (100-200ms), hover with subtle scale (1.02), scroll-triggered reveals with stagger, no bounce or elastic — all sharp ease-out."
Cross-platform thesis examples:
Self-check: read your thesis back. If you can't immediately derive the CSS/JS properties from it, it's too vague. Rewrite.
Wait for explicit user validation of BOTH theses before moving on. If the user pushes back, don't start over — ask what feels wrong and adjust.
Load _jutsu/ui-ux-pro-max sub-skill:
cat "$SKILL_BASE/ui-ux-pro-max/SKILL.md"
The MASTER.md design system file is canonical, but the generated code files match the detected stack:
cubic-bezier(...) easings, rem spacing. Output paired with tailwind.config.js extension or :root { --token: ... } CSS.Theme.kt, Color.kt, Type.kt, Shapes.kt, Motion.kt referenced from MASTER.md. Color tokens in Color(0xFF...), typography in TextStyle, shapes in RoundedCornerShape, motion in MotionScheme (M3 Expressive when scope is hero / impactful). Spacing in dp.Color+App.swift, Font+App.swift, Animation+App.swift, Shape+App.swift. Color tokens via Color("AssetName") referencing the asset catalog (or Color(red:green:blue:) if no catalog), typography via Font.system(...) or .custom(...), animations via .spring(...) / .snappy / .bouncy named presets. Spacing in CGFloat constants.commonMain with expect/actual for fonts and platform-specific colors. Same structure as Android Compose, plus a section in MASTER.md describing per-platform deviations.The MASTER.md document itself remains a single canonical source-of-truth file. The generated code files (Theme.kt / Color+App.swift / etc.) are children of MASTER.md and reference it.
Generate the complete design system based on both theses:
Create a MASTER.md at project root with the full design system. This file is the single source of truth. Every implementation decision references it.
Check if these MCPs are connected and use them when available:
If MCPs are not available, skip gracefully — the design system + code implementation is the core path.
Load sub-skills based on tech stack and interaction thesis.
Always load (load every sub-skill below via load_skill <name>, defined above - it warns instead of failing silently if a ZIP is missing):
load_skill motion-principles - the foundationContext layers (load when applicable):
| Detected | Load |
|---|---|
| Mobile context (web mobile OR native iOS / Android) | $SKILL_BASE/mobile-principles/SKILL.md |
| Desktop context (macOS OR web desktop with no mobile indicators) | $SKILL_BASE/desktop-principles/SKILL.md |
| Audit explicitly requested OR scope=full | $SKILL_BASE/design-audit/SKILL.md |
| Advanced UI/UX questions | $SKILL_BASE/ui-ux-pro-max/SKILL.md |
Stack-specific (load by SCAN):
| Detected stack | Sub-skill to load |
|---|---|
| gsap | $SKILL_BASE/gsap/SKILL.md |
| framer-motion | $SKILL_BASE/framer-motion/SKILL.md |
| Pure CSS / Tailwind / no lib | $SKILL_BASE/css-native/SKILL.md |
| three / @react-three | $SKILL_BASE/threejs-r3f/SKILL.md |
| Canvas / generative | $SKILL_BASE/canvas-generative/SKILL.md |
| Android Compose | $SKILL_BASE/compose-motion/SKILL.md (always) + $SKILL_BASE/compose-graphics/SKILL.md (if scope=full or thesis is advanced - see below) |
| Compose Multiplatform | $SKILL_BASE/compose-motion/SKILL.md + $SKILL_BASE/compose-multiplatform/SKILL.md (always); $SKILL_BASE/swiftui-motion/SKILL.md if iOS target detected and SwiftUI interop demanded; $SKILL_BASE/compose-graphics/SKILL.md if advanced |
| SwiftUI iOS or macOS | $SKILL_BASE/swiftui-motion/SKILL.md (always) + $SKILL_BASE/swiftui-graphics/SKILL.md (if scope=full or thesis is advanced) |
"Advanced thesis" trigger for compose-graphics / swiftui-graphics:
The thesis is "advanced" (and triggers loading the graphics sub-skill) if it contains any of these terms:
shader, Metal, AGSL, RuntimeShader, MSLliquid-glass, glassEffect, morphing transitionM3 Expressive, MotionScheme, expressive motioncolorEffect, distortionEffect, layerEffectCanvas (with generative / particle / flow field context)holographic, CRT, displacement, rippleOtherwise stick to the base motion sub-skill.
Implementation rules:
Load _jutsu/design-audit sub-skill:
cat "$SKILL_BASE/design-audit/SKILL.md"
Run the full audit checklist matching the detected stack.
All stacks:
prefers-reduced-motion, SwiftUI accessibilityReduceMotion, or Compose helper using ValueAnimator.areAnimatorsEnabled() / Settings.Global.ANIMATOR_DURATION_SCALE).Web:
will-change used sparingly.aria-hidden on purely decorative animations.Compose:
Modifier.recomposeHighlighter).width/height (use Modifier.graphicsLayer { translationX/Y, scaleX/Y }).Modifier.semantics set on custom interactive components.SwiftUI:
body recomputed on irrelevant state changes (use @StateObject, @ObservableObject correctly)..accessibilityLabel / .accessibilityHint on all interactive views.macOS-specific (in addition to SwiftUI):
Cmd+N, Cmd+W, Cmd+F, etc.) bound to primary actions.outline: none without alternative).Present findings grouped by severity: Critical > Important > Nice-to-have.
When invoked on a project that already has design/styling:
This is intentional: /genjutsu:paint rebuilds the visual universe. To enhance what exists, use /genjutsu:cast instead.
| Thought | Reality |
|---|---|
| "The user already said 'minimal dark' — I have enough for a thesis" | Two words aren't five domains. Keep asking. |
| "I'll ask all five brainstorm questions at once" | One at a time. The answer to 'audience' changes how you ask about 'mood'. |
| "The user seems impatient, let's skip to coding" | Use the pressure protocol. A bad thesis costs days, not minutes. |
| "I'll pick colors that feel right" | Every token comes from MASTER.md. No freelancing. |
| "I'll do the whole site in one pass" | Page by page. Validate page by page. |
| "This animation would be cool even though the thesis says no bounce" | The thesis is law. Change it? Re-validate with the user first. |
| "The audit can wait, the user seems happy" | The audit is not optional. Phase 5 always runs. |
| "I'll interpret 'yeah something like that' as a yes" | That's not confirmation. Ask which part resonates. |
npx claudepluginhub athevon/genjutsu --plugin genjutsuGuides completion of development work by verifying tests, detecting environment, and presenting structured options for merge, PR, or cleanup.
Enforces test-driven development: write failing test first, then minimal code to pass. Use when implementing features or bugfixes.
Guides creation and editing of skills using test-driven development with pressure scenarios and subagents to verify agent compliance.