| name | component |
| description | Create UI component / widget / reusable piece. Triggers "create component", "new component", "add component", or naming a component (Button, Header, Card). |
| argument-hint | [ComponentName] |
Create Darkroom Component
Create a React component following Darkroom conventions. Detect the stack first — satus (Next.js) and novus (React Router) have different conventions for client/server boundaries, image/link wrappers, and path aliases.
Step 1 — Detect stack
Read package.json:
dependencies.next present → Next.js / satus conventions
dependencies["react-router"] or devDependencies["@react-router/dev"] → React Router / novus conventions
- Neither → ask user, or assume satus if unclear
Step 2 — Resolve target paths
| Stack | Component path | CSS module path | Image wrapper | Link wrapper | Path alias |
|---|
| satus (Next.js) | components/<name>/index.tsx | components/<name>/<name>.module.css | import { Image } from '@/components/image' | import { Link } from '@/components/link' | @/ |
| novus (React Router) | components/<name>/index.tsx | components/<name>/<name>.module.css | Native <img> (or project's wrapper if it exists) | import { Link } from 'react-router' | ~/ |
Step 3 — Emit template
satus / Next.js
import s from './<name>.module.css'
interface <Name>Props {
children?: React.ReactNode
className?: string
}
export function <Name>({ children, className }: <Name>Props) {
return (
<div className={`${s.<name>} ${className ?? ''}`}>
{children}
</div>
)
}
novus / React Router
import s from './<name>.module.css'
interface <Name>Props {
children?: React.ReactNode
className?: string
}
export function <Name>({ children, className }: <Name>Props) {
return (
<div className={`${s.<name>} ${className ?? ''}`}>
{children}
</div>
)
}
CSS module (both stacks)
.<name> {
}
Before you start
If this component wraps or uses an external library (Radix, Framer Motion, GSAP, etc.):
- Fetch docs first — use Context7 MCP (
mcp__context7__resolve-library-id → get-library-docs) for the current API.
- Check version — run
bun info <package> before installing.
Never implement against external library APIs from memory.
Conventions (both stacks)
- CSS Module as
s — always import as s for consistency.
- Props interface — define explicitly, include
className for composition.
- Named export — use
export function, not export default.
- No memoization — React Compiler handles it.
Conventions (satus only)
- Server Component by default — only add
'use client' if needed.
- Image wrapper —
import { Image } from '@/components/image'.
- Link wrapper —
import { Link } from '@/components/link'.
Conventions (novus only)
- Components are isomorphic — no
'use client' directive.
- Path alias is
~/, not @/.
- Link —
import { Link } from 'react-router' (declarative routing).
- Images — native
<img> with explicit width/height/fetchPriority. No project-level wrapper unless the project added one.
Arguments
$ARGUMENTS — Component name (e.g., "Button", "Header")
--client flag (Next.js only) — Force client component
Example
User: "create a Button component"
→ detect stack → satus → creates components/button/index.tsx + button.module.css with @/-aliased imports
User: "create a Button component" (in novus repo)
→ detect stack → novus → creates same files but with ~/-aliased imports and no 'use client' directive