UI/UX Design System Advisor
Galaxy-Dawn/claude-scholar
Turns a vague UI request into a concrete design system with style, palette, typography and layout guidance from a search script, plus stack-specific implementation advice.
Build production-grade components for React, Vue 3, and Svelte 5 with all states (loading, empty, error, success, idle), TypeScript strict, WCAG 2.2 accessibility, server components (RSC), and…
$ npx skills add EliasOulkadi/shokunin --skill component-forge -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install EliasOulkadi/shokunin component-forge --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/EliasOulkadi/shokunin.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.pack/skills/component-forge .claude/skills/component-forge && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "component-forge" agent skill from https://github.com/EliasOulkadi/shokunin/tree/master/.pack/skills/component-forge into .claude/skills/component-forge/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "component-forge", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/EliasOulkadi/shokunin/tree/master/.pack/skills/component-forgeType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add EliasOulkadi/shokunin --skill component-forge -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install EliasOulkadi/shokunin component-forge --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/EliasOulkadi/shokunin.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.pack/skills/component-forge .agents/skills/component-forge && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "component-forge" agent skill from https://github.com/EliasOulkadi/shokunin/tree/master/.pack/skills/component-forge into .agents/skills/component-forge/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "component-forge", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add EliasOulkadi/shokunin --skill component-forge -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install EliasOulkadi/shokunin component-forge --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/EliasOulkadi/shokunin.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.pack/skills/component-forge .cursor/skills/component-forge && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "component-forge" agent skill from https://github.com/EliasOulkadi/shokunin/tree/master/.pack/skills/component-forge into .cursor/skills/component-forge/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "component-forge", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/EliasOulkadi/shokunin.git --path .pack/skills/component-forge--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add EliasOulkadi/shokunin --skill component-forge -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install EliasOulkadi/shokunin component-forge --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/EliasOulkadi/shokunin.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.pack/skills/component-forge .gemini/skills/component-forge && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "component-forge" agent skill from https://github.com/EliasOulkadi/shokunin/tree/master/.pack/skills/component-forge into .gemini/skills/component-forge/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "component-forge", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install EliasOulkadi/shokunin component-forgeInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add EliasOulkadi/shokunin --skill component-forge -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/EliasOulkadi/shokunin.git skills-src && mkdir -p .github/skills && cp -r skills-src/.pack/skills/component-forge .github/skills/component-forge && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "component-forge" agent skill from https://github.com/EliasOulkadi/shokunin/tree/master/.pack/skills/component-forge into .github/skills/component-forge/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "component-forge", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add EliasOulkadi/shokunin --skill component-forge -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install EliasOulkadi/shokunin component-forge --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/EliasOulkadi/shokunin.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.pack/skills/component-forge .opencode/skills/component-forge && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "component-forge" agent skill from https://github.com/EliasOulkadi/shokunin/tree/master/.pack/skills/component-forge into .opencode/skills/component-forge/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "component-forge", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
component-forgeBuild production-grade components for React, Vue 3, and Svelte 5 with all states (loading, empty, error, success, idle), TypeScript strict, WCAG 2.2 accessibility, server components (RSC), and…
Component Forge is an agent skill from EliasOulkadi/shokunin. Build production-grade components for React, Vue 3, and Svelte 5 with all states (loading, empty, error, success, idle), TypeScript strict, WCAG 2.2 accessibility, server components (RSC), and compound component patterns. Includes scaffold script, reference patterns, and template files for React and Vue. Use when user asks to create a UI component, frontend module, or design system component. Do NOT use for page layouts (use landing-craft), routing, or state management architecture (global stores).
Its SKILL.md is about 3.6k tokens, which your agent loads only when the skill is triggered. The skill folder holds 8 other files, including scripts, reference files and assets (for example `references/a11y-patterns.md`, `references/react-patterns.md` and `scripts/scaffold-component.sh`). Compatibility notes: opencode
It sits in Frontend & Design, covering Accessibility and State management. It works with Vue.js, React, Svelte and TypeScript. The repository describes itself as: 職人 Shokunin 62 AI agent skills for OpenCode, Claude Code, Cursor, Windsurf. ChromaDB memory, MCP servers, declarative self-updates. Multi-model, open source, zero cost. The licence is MIT.
5 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 4c68e5b. It shows what the files ask for, not the result of running them.
Pre-approves these tools, so the agent can use them without asking each time:
ReadBashWriteGrepGlobFrom allowed-tools in the SKILL.md frontmatter.
Ships 1 file in scripts/ (Shell), which the agent can run.
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
opencode
From compatibility in the SKILL.md frontmatter.
Component Forge loads about 3.6k tokens when it runs, and up to ~8.9k if it reads all its reference files. Until then it costs about 130 tokens; SKILL.md has 981 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check noted patterns worth knowing about, such as sudo or a known installer.
allowed-tools: Read, Bash, Write, Grep, GlobAutomated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.
The full file from EliasOulkadi/shokunin at commit 4c68e5b, republished under its MIT licence (© EliasOulkadi). 981 words, ~3,604 tokens.
.claude/skills/component-forge/SKILL.md (or your agent's skills folder). This skill also uses 5 other files; get the full folder from GitHub.Build components that survive every state, at every screen size, under every edge case. Inspired by Heydon Pickering (Inclusive Components), React core team patterns, and Emil Kowalski's design engineering philosophy.
| Type | Description | Example |
|---|---|---|
| Presentational | Pure rendering, props-driven | Button, Card, Badge |
| Composable | Wraps children with behavior | Modal, Tooltip, Accordion |
| Data-fetching | Reads from API/store | UserProfile, OrderList |
| Layout | Arranges children | Sidebar, Grid, Stack |
| Form | Input + validation | LoginForm, SearchInput |
scripts/scaffold-component.sh Button react
scripts/scaffold-component.sh Modal vue
scripts/scaffold-component.sh Accordion svelteWindows: The scaffold script requires Git Bash or WSL. Not compatible with PowerShell or CMD.
Creates:
Button/
Button.tsx
Button.types.ts
Button.test.tsx
index.tstype State<T> =
| { status: 'idle' }
| { status: 'loading' }
| { status: 'empty' }
| { status: 'error'; error: Error }
| { status: 'success'; data: T }
function Profile({ userId }: { userId: string }) {
const [state, setState] = useState<State<User>>({ status: 'idle' })
if (state.status === 'loading') return <LoadingSkeleton />
if (state.status === 'error') return <ErrorState error={state.error} onRetry={fetch} />
if (state.status === 'empty') return <EmptyState message="No user found" />
if (state.status === 'success') return <UserProfile user={state.data} />
return null
}Every data-fetching component renders all five states.
aria-live="polite"role="alert"prefers-reduced-motion respectedSee references/a11y-patterns.md for roving tabindex, focus management, screen reader testing, and contrast ratios.
| Edge case | Symptom | Fix |
|---|---|---|
| Long text | Layout break | text-overflow: ellipsis, overflow-wrap: anywhere |
| Many items (100+) | Slow rendering | Virtualize (react-window, FlashList) |
| Network retry | Stale data | Show old data + loading indicator |
| Race condition | Wrong data after fast re-fetch | AbortController, cancel on unmount |
| null vs undefined vs [] | Wrong empty check | Handle all three explicitly |
See references/react-patterns.md for compound components, RSC patterns, error boundaries, and suspense.
Every button must feel responsive. Emil Kowalski's rule: scale(0.97) on press.
.button {
transition: transform 160ms cubic-bezier(0.23, 1, 0.32, 1);
}
.button:active {
transform: scale(0.97);
}Scale must be subtle: 0.95-0.98. Applied to all pressable elements.
| State | CSS |
|---|---|
| Default | background: var(--color-primary) |
| Hover | transform: translateY(-1px) 200ms |
| Active | transform: scale(0.97) 160ms |
| Focus | outline: 2px solid var(--accent); outline-offset: 2px |
| Disabled | opacity: 0.5; cursor: not-allowed |
| Loading | Replace text with spinner, keep width stable |
function Button({ children, loading, ...props }: ButtonProps) {
return (
<button
className="button"
aria-busy={loading}
aria-disabled={loading}
{...props}
>
{loading ? <Spinner /> : children}
</button>
)
}Popovers scale from their trigger. Modals stay centered.
/* Radix UI */
.popover {
transform-origin: var(--radix-popover-content-transform-origin);
}
/* Base UI */
.popover {
transform-origin: var(--transform-origin);
}
/* Modals - always centered */
.modal {
transform-origin: center;
}Whether the user notices individually does not matter. In the aggregate, unseen details compound.
Tools must delay before appearing (prevent accidental activation). But once one tooltip is open, adjacent tooltips appear instantly with no animation.
.tooltip {
transition: transform 125ms ease-out, opacity 125ms ease-out;
transform-origin: var(--transform-origin);
}
.tooltip[data-instant] {
transition-duration: 0ms;
}function Tooltip({ children, content }: TooltipProps) {
const [isOpen, setIsOpen] = useState(false)
const [isInstant, setIsInstant] = useState(false)
return (
<TooltipRoot
delayDuration={isInstant ? 0 : 500}
onOpenChange={(open) => {
setIsOpen(open)
if (!open) setIsInstant(false)
}}
>
<TooltipTrigger
onPointerEnter={() => { if (isAnyTooltipOpen()) setIsInstant(true) }}
>
{children}
</TooltipTrigger>
<TooltipContent data-instant={isInstant || undefined}>
{content}
</TooltipContent>
</TooltipRoot>
)
}| Phase | Duration | Easing |
|---|---|---|
| Enter | 200-300ms | cubic-bezier(0, 0, 0.2, 1) |
| Exit | 150-200ms | cubic-bezier(0.4, 0, 1, 1) |
Exit must ALWAYS be faster than enter.
function Modal({ open, onClose, children }: ModalProps) {
const overlayRef = useRef<HTMLDivElement>(null)
useEffect(() => {
if (!open) return
const previouslyFocused = document.activeElement as HTMLElement
const overlay = overlayRef.current
const handleKeyDown = (e: KeyboardEvent) => {
if (e.key === 'Escape') { onClose(); return }
if (e.key === 'Tab') {
const focusable = overlay!.querySelectorAll<HTMLElement>(
'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'
)
const first = focusable[0]
const last = focusable[focusable.length - 1]
if (e.shiftKey && document.activeElement === first) {
e.preventDefault(); last.focus()
} else if (!e.shiftKey && document.activeElement === last) {
e.preventDefault(); first.focus()
}
}
}
document.addEventListener('keydown', handleKeyDown)
return () => {
document.removeEventListener('keydown', handleKeyDown)
previouslyFocused?.focus()
}
}, [open, onClose])
if (!open) return null
return (
<div className="modal-overlay" ref={overlayRef} role="dialog" aria-modal="true">
<AnimatePresence>
{children}
</AnimatePresence>
</div>
)
}Skeleton loaders must match the layout dimensions of the content they replace.
function UserCardSkeleton() {
return (
<div className="card" aria-hidden="true">
<div className="skeleton skeleton-avatar" style={{ width: 48, height: 48, borderRadius: '50%' }} />
<div className="skeleton skeleton-text" style={{ width: '60%', height: 16, marginTop: 12 }} />
<div className="skeleton skeleton-text" style={{ width: '40%', height: 12, marginTop: 8 }} />
</div>
)
}.skeleton {
background: linear-gradient(
90deg,
var(--skeleton-base) 25%,
var(--skeleton-shine) 50%,
var(--skeleton-base) 75%
);
background-size: 200% 100%;
animation: shimmer 1.5s linear infinite;
}
@keyframes shimmer {
from { background-position: 200% 0; }
to { background-position: -200% 0; }
}When multiple children enter, stagger their appearance.
function List({ items }: { items: Item[] }) {
return (
<ul>
{items.map((item, i) => (
<motion.li
key={item.id}
initial={{ opacity: 0, transform: 'translateY(8px)' }}
animate={{ opacity: 1, transform: 'translateY(0)' }}
transition={{ delay: i * 0.05, duration: 0.3, ease: [0.23, 1, 0.32, 1] }}
>
<ItemCard item={item} />
</motion.li>
))}
</ul>
)
}Keep stagger delays 30-80ms. Never block interaction while stagger plays.
| Error | Cause | Fix |
|---|---|---|
| Component crashes on missing prop | Missing default value | Add defaultProps or default parameter |
| Infinite re-render | Missing dependency array | Add deps to useEffect/useMemo |
| Flash of unstyled content | CSS not loaded | Inline critical CSS, use CSS-in-JS or preload |
| ARIA live region not announcing | Wrong role/value | Use role="status" for loading, role="alert" for errors |
| Focus trap not working | Missing focusable element | Ensure at least one focusable child in trap |
| Skeleton layout shift | Skeleton doesn't match content dimensions | Match exact width/height. Use min-height blocks. |
| Stagger blocks interaction | Long delay on large lists | Cap total stagger at 400ms. Show remaining items instantly. |
| Modal focus lost after close | Focus not restored | Save document.activeElement before opening, restore after closing |
When reviewing component code, use a Before/After table:
| Before | After | Why |
|---|---|---|
| Missing loading state | { status: 'loading' } ? <Skeleton /> | Users see a blank screen otherwise |
aria-label missing on icon button | aria-label="Close dialog" | Screen reader announces "button" with no context |
ease-in on modal enter | cubic-bezier(0, 0, 0.2, 1) 250ms | Ease-in starts slow, feels sluggish on entering UI |
No :active state on button | transform: scale(0.97) 160ms ease-out | Buttons must feel responsive to press |
setState after unmount | useEffect cleanup + AbortController | Race condition - stale data overwrites fresh state |
h-screen for hero | min-h-[100dvh] | 100vh breaks on iOS Safari with URL bar visible |
| 500ms modal enter | 250ms | UI animations over 300ms feel slow |
| Focus not trapped in modal | Implement focus loop (Tab/Shift+Tab) | Keyboard users escape modal and get lost |
scale(0.97) on :active, 160ms ease-outtransform-origin anchors to trigger100dvh used instead of 100vh for full-screenprefers-reduced-motion respected| Anti-pattern | Fix |
|---|---|
| Default export | Named exports only |
any in props | Strict types, discriminated unions |
| Missing loading state | Every data-fetching component renders loading ? error ? success |
| useEffect for derived state | useMemo or computed property |
| Giant component > 200 lines | Split into sub-components |
| Inline handlers in render | Extract to useCallback |
| Mixing server/client without boundary | Clear 'use client' / 'use server' |
| Prop drilling > 3 levels | Context or composition |
ease-in on entering UI | Strong ease-out (cubic-bezier(0.23, 1, 0.32, 1)) |
| Modal exit same speed as enter | Exit must be faster |
| Skeleton different shape from content | Match dimensions exactly |
| Focus not restored after overlay close | Save and restore document.activeElement |
h-screen on mobile | min-h-[100dvh] |
| Gray text on gray background | WCAG AA 4.5:1 minimum |
| Touch targets under 44px | Minimum 44-44px |
© EliasOulkadi, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 5 other files (scripts, references, assets) in .pack/skills/component-forge of EliasOulkadi/shokunin.
Open the folder on GitHubat commit 4c68e5b
Component Forge next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Component Forge this skillEliasOulkadi/shokunin | 114 | — | ~3.6k | Automated safety check: Notes | MIT | |
| UI/UX Design System AdvisorGalaxy-Dawn/claude-scholar | 5.7k | 1 repos | ~1.1k | Automated safety check: Pass | MIT | |
| Monochromevaneenige/monochrome-ui | 132 | — | ~2.3k | Automated safety check: Pass | MIT | |
| Frontend Designjwynia/agent-skills | 169 | — | ~3.2k | Automated safety check: Pass | MIT | |
| Kb Web ScanningCommunity-Access/accessibility-agents | 423 | — | ~1.2k | Automated safety check: Pass | MIT | |
| UI CraftMemTensor/memmy-agent | 2.1k | — | ~2.9k | Automated safety check: Pass | MIT |
Galaxy-Dawn/claude-scholar
Turns a vague UI request into a concrete design system with style, palette, typography and layout guidance from a search script, plus stack-specific implementation advice.
vaneenige/monochrome-ui
Build accessible UI with monochrome, the framework-agnostic UI library for agents.
jwynia/agent-skills
Create distinctive, production-grade frontend interfaces with high design quality.
Community-Access/accessibility-agents
Reference data, not a reviewer. An agent skill from Community-Access/accessibility-agents.
MemTensor/memmy-agent
Design, build, redesign, or modify browser-visible web interfaces with product-quality composition, visual systems, interaction states, responsive behavior, accessibility, and browser visual QA.
getdokan/dokan
Add or modify Dokan frontend code (React, TypeScript, Vue, Tailwind).
EliasOulkadi/shokunin
Design CI/CD pipelines for GitHub Actions, GitLab CI, and CircleCI with matrix builds, test sharding, caching, Docker layer caching, OIDC auth, deployment strategies (rolling, blue-green, canary)…
EliasOulkadi/shokunin
PostgreSQL database administration — backup/restore (pgdump, PITR, WAL archiving), health monitoring (connections, bloat, cache hit ratio, dead tuples), connection pooling (PgBouncer), replication…
EliasOulkadi/shokunin
Design database schemas with Prisma/Drizzle, PostgreSQL index strategy (B-tree, GIN, GiST, BRIN, Hash), query optimization (EXPLAIN ANALYZE), migration safety (expand/contract, zero-downtime), and…
EliasOulkadi/shokunin
Optimize Docker images with multi-stage builds, distroless bases, BuildKit cache mounts, multi-arch builds, compose watch, security hardening (non-root, seccomp, capabilities drop), and…
EliasOulkadi/shokunin
Design error handling, structured logging, and observability with OpenTelemetry (traces, metrics, logs), error classification, recovery patterns (retry with jitter, circuit breaker, bulkhead…
EliasOulkadi/shokunin
Deploy, manage, and debug Kubernetes in production — Deployments, Services, Gateway API, Service Mesh (Istio/Linkerd/Cilium), eBPF observability (Cilium Hubble), security hardening (Pod Security…
Works with
Categories
Build production-grade components for React, Vue 3, and Svelte 5 with all states (loading, empty, error, success, idle), TypeScript strict, WCAG 2.2 accessibility, server components (RSC), and…. Component Forge is an agent skill from EliasOulkadi/shokunin.2 accessibility, server components (RSC), and compound component patterns.
Component Forge fits situations like: user asks to create a UI component; frontend module; design system component; page layouts (use landing-craft).
Run `npx skills add EliasOulkadi/shokunin --skill component-forge -a claude-code`. Or copy the skill folder (.pack/skills/component-forge in EliasOulkadi/shokunin) into .claude/skills/component-forge in your project. Claude Code loads it when a task matches its description.
Run `npx skills add EliasOulkadi/shokunin --skill component-forge -a codex`. Or copy the skill folder (.pack/skills/component-forge in EliasOulkadi/shokunin) into .agents/skills/component-forge in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add EliasOulkadi/shokunin --skill component-forge -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/component-forge, .gemini/skills/component-forge, .github/skills/component-forge and .opencode/skills/component-forge in your project.
Going by SKILL.md and its folder, Component Forge needs a shell for the scripts in its folder. Our summary lists: A Bash shell. Its frontmatter pre-approves these tools: Read, Bash, Write, Grep, Glob. Compatibility (from SKILL.md): opencode.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found notes only (pre-approves every shell command (allowed-tools: bash)), nothing it rates as a warning. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Component Forge is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.6k tokens (SKILL.md is roughly 14k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 5.3k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Component Forge: UI/UX Design System Advisor (Galaxy-Dawn/claude-scholar, 5.7k stars), Monochrome (vaneenige/monochrome-ui, 132 stars), Frontend Design (jwynia/agent-skills, 169 stars) and Kb Web Scanning (Community-Access/accessibility-agents, 423 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
EliasOulkadi (a GitHub user) maintains it in EliasOulkadi/shokunin, which has 114 GitHub stars. The repository holds 49 skills in this directory. The repository was last updated on October 5, 2026.
Source: EliasOulkadi/shokunin on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.