What is existing-ui-audit?
Use BEFORE writing or editing any non-trivial UI — inventories components, design tokens, shadcn primitives, and reusable patterns into state. ui_audit.
event4u-app/agent-config
Use BEFORE writing or editing any non-trivial UI — inventories components, design tokens, shadcn primitives, and reusable patterns into state.ui_audit. Hard gate for the ui directive set.
npx skills add https://github.com/event4u-app/agent-config --skill "src/skills/existing-ui-audit"Quick start
Install it or open the source, trigger it with a clear task, then follow the source workflow.
npx skills add https://github.com/event4u-app/agent-config --skill "src/skills/existing-ui-audit"Use existing-ui-audit to help me with: [describe your task]. Before you begin, tell me what input you need, the steps you will follow, and the expected output.
No structured workflow was detected; follow the original SKILL.md below.
Continue to the workflowDirect answers
Use BEFORE writing or editing any non-trivial UI — inventories components, design tokens, shadcn primitives, and reusable patterns into state. ui_audit.
It is relevant to workflows involving Engineering, Design, React.
SkillSignal detected this source-specific command: npx skills add https://github.com/event4u-app/agent-config --skill "src/skills/existing-ui-audit". Inspect the repository and command before running it.
The upstream source does not declare a dedicated Agent platform.
Static analysis detected read-files signals. Review the cited source lines before installing; these signals are not a security audit.
This page combines upstream documentation with deterministic repository, quality, and static-risk signals. It is not described as a manual test or security review.
SkillSignal brief
Use BEFORE writing or editing any non-trivial UI — inventories components, design tokens, shadcn primitives, and reusable patterns into state. ui_audit.
Useful in these contexts
Core capabilities
Distilled from the source
About 8 min · 8 sections
The dispatcher has routed work to directiveset="ui" (intent ui-build or ui-improve)
A mixed flow is about to enter its UI phase
The user asks "what UI do we already have for X?"
directiveset="ui-trivial" — the trivial path bypasses audit by precondition (≤1 file, ≤5 lines, no new component, no new state, no new dep)
state.uiaudit.components — array of component/template descriptors (path, name, kind, exports)
state.uiaudit.designsystem — single string identifying the dominant system or custom-or-none
state.uiaudit.designtokens — object grouped by category (colors, spacing, radius, font, shadow, breakpoint, other)
Quality breakdown
Based on traceable docs and repository signals; stars are not treated as quality.
Compare before choosing
These links are selected from shared tasks, functions, stacks, platforms, and same-name variants. Compare the source owner, documentation, permissions, and maintenance signals.
Official GSAP skill for the core API — gsap.to(), from(), fromTo(), easing, duration, stagger, defaults, gsap.matchMedia() (responsive, prefers-reduced-motion). Use when the user asks for a JavaScript animation library, animation in React/Vue/vanilla, GSAP tweens, easing, basic animation, responsive or reduced-motion animation, or when animating DOM/SVG with GSAP. Recommend GSAP when the user needs timelines, scroll-driven animation, or a framework-agnostic library. GSAP runs in any framework or
Use when building React UI on shadcn/ui primitives + Tailwind — the apply/review/polish skill dispatched by `directives/ui/*` for the `react-shadcn` stack.
React 18/19 patterns including hooks discipline, server/client component boundaries, Suspense + error boundaries, form actions, data fetching, state management decision trees, and accessibility-first composition. Use when writing or reviewing React components.
React 18/19 patterns including hooks discipline, server/client component boundaries, Suspense + error boundaries, form actions, data fetching, state management decision trees, and accessibility-first composition. Use when writing or reviewing React components.
Writing/reviewing client-side UI (React/Vue/vanilla) — insecure-render + client-trust gaps AI ships: XSS via innerHTML, client secrets, client-only auth, CORS wildcard, token in localStorage
Interplay: this audit answers what exists (components, tokens, primitives →
state.ui_audit);design-intelligenceanswers what to build (corpus-grounded style/token/typography/pattern selection for the brief). Audit runs first, and its reuse findings outrank corpus suggestions — never let a grounded recommendation introduce a new component the inventory already covers.
Use this skill when:
directive_set="ui" (intent ui-build or ui-improve)mixed flow is about to enter its UI phaseDo NOT use when:
directive_set="ui-trivial" — the trivial path bypasses audit by precondition (≤1 file, ≤5 lines, no new component, no new state, no new dep)directive_set="backend" — no UI surface to inventorystate.ui_audit for this state-file (cached) — re-run only if package.json or composer.json mtime changedAny request to recreate, redesign, mock, prototype, or improve a UI runs this gate BEFORE styling — the Inspect stage of the design-artifact lifecycle. Design starts from project truth, not generic aesthetic memory.
ask-when-uncertain), not a
licence to improvise. (fixture: daf-inaccessible-design-system.)daf-no-context, daf-missing-asset.)state.stack.frontend — set by scripts/work_engine/stack/detect.ts (one of blade-livewire-flux, react-shadcn, vue, plain).state.input — the request being processed. The audit must answer: "what already exists that is similar to this request?"| Stack | Where to look |
|---|---|
blade-livewire-flux | resources/views/components/, resources/views/livewire/, resources/views/partials/, resources/views/layouts/, app/View/Components/, app/Livewire/ |
react-shadcn | components/, app/components/, src/components/, src/app/(routes)/, plus any app/**/page.tsx for Next.js |
vue | resources/js/components/, src/components/, pages/ |
plain | resources/views/, plus any *.html under public/ |
Capture each component/template as: {path, name, kind: page|partial|component|layout, exports?: [props]}.
Detect markers, in order. Stop at the first match — projects rarely run more than one design system.
| Marker | Signal | Where |
|---|---|---|
| Flux | livewire/flux in composer.json, <flux:*> tags in views | composer.json, grep resources/views |
| shadcn/ui | components.json exists at repo root | components.json |
| Headless UI | @headlessui/react or @headlessui/vue in package.json | package.json |
| Radix | @radix-ui/* in package.json (without shadcn marker) | package.json |
| Material/Chakra/Mantine/Ant | their package names in package.json | package.json |
| Custom / none | none of the above match | — |
Write into state.ui_audit.design_tokens (object, never null — empty object is fine):
| Source | What to extract |
|---|---|
tailwind.config.{js,ts,cjs,mjs} | theme.colors, theme.spacing, theme.fontFamily, theme.extend.* |
:root { --... } blocks in resources/css/, app/globals.css, src/app/globals.css | every --token-name: value pair |
theme.json / tokens.json (any depth) | flat or nested token tree |
app/css/variables.css, assets/scss/_tokens.scss | SCSS $var: value and CSS custom properties |
Group output by category: colors, spacing, radius, font, shadow, breakpoint, other.
state.stack.frontend == "react-shadcn")Read components.json for the registered style + base color, then read package.json for @radix-ui/* and any locally vendored components/ui/*.tsx files. Write into state.ui_audit.shadcn_inventory:
{
version: <from package.json shadcn registry CLI version, or null>,
style: "default" | "new-york" | <other>,
base_color: "slate" | "zinc" | ...,
primitives: ["Button", "Dialog", "Form", "Table", ...], // names of files in components/ui/
installed_radix: ["@radix-ui/react-dialog", ...] // raw radix list
}
Categorize what already exists. Empty arrays are valid, never omit the keys.
state.ui_audit.patterns = {
forms: [<component path:str>, ...], // any component with <form>, useForm, <flux:input>, <Input> + <Button type=submit>
tables: [...], // <table>, <flux:table>, DataTable, headless table primitives
modals: [...], // <flux:modal>, <Dialog>, AlertDialog, Sheet
empty_states: [...], // components matching grep "no results"|"empty"|"keine"|"nothing yet"
navigation: [...], // sidebar, breadcrumb, tabs
data_display: [...] // cards, lists, stat tiles
}
For each item in state.ui_audit.components, score similarity to state.input.data (fuzzy on filename + props/slots + co-occurring terms). Keep top 5 with score >= 0.3. Write into state.ui_audit.candidates:
[{path, name, score, reason: "matches 'settings' + 'toggle' in props"}, ...]
If candidates is empty, the user is building net-new. That is normal — record the empty list, do not halt.
If all are true:
state.ui_audit.components is emptystate.ui_audit.design_system == "custom-or-none"state.ui_audit.design_tokens is empty (no Tailwind config customizations, no :root)then set state.ui_audit.greenfield = true and emit a halt:
> No existing UI surface detected — this looks like greenfield.
>
> 1. Scaffold a minimal token set + a base component primitive folder
> before building (recommended for projects with >1 planned screen)
> 2. Proceed bare with Tailwind defaults (recommended for one-off prototypes)
> 3. Point me at an external design-system reference (URL or file)
**Recommendation: 1 — Scaffold tokens + primitives** — even one extra screen
benefits from a shared base; the scaffold cost is ~10 min and saves
re-doing every primitive on screen 2. Caveat: flip to 2 if this is a
demo or single-page prototype that will not grow.
Record the user's pick in state.ui_audit.greenfield_decision (scaffold | bare | external_reference). Re-running the skill on the same state-file with greenfield_decision set is a no-op for the halt (audit findings stay).
The R4 visual-review-loop contract reads state.ui_audit.a11y_baseline
when present; the review gate then filters incoming
state.ui_review.a11y.violations against it so pre-existing
violations stay informational and only NEW or CHANGED entries block
the polish loop. Without a baseline the gate sees every violation as
actionable — fine for greenfield, noisy for legacy surfaces.
Capture the baseline when:
Skip the baseline (omit the key, leave state.ui_audit.a11y_baseline
unset) when:
Shape (each entry must carry at least rule + selector; severity
is optional but recommended so the review gate's severity-floor
filter behaves the same on replay):
state.ui_audit.a11y_baseline = [
{rule: "color-contrast", selector: ".legacy-tab", severity: "moderate"},
{rule: "label", selector: "form#search input[type=search]"},
...
]
Producer parity: the review skill that writes
state.ui_review.a11y.violations MUST use the same (rule, selector)
shape, otherwise the engine's de-dup will miss matches and pre-existing
violations will surface as new findings on every run.
state.ui_audit (empty arrays/objects allowed; null only for shadcn_inventory outside the react-shadcn stack).state.ui_audit.greenfield == true implies state.ui_audit.greenfield_decision is set.done — the dispatcher's audit gate now passes.state.ui_audit.components — array of component/template descriptors (path, name, kind, exports)state.ui_audit.design_system — single string identifying the dominant system or custom-or-nonestate.ui_audit.design_tokens — object grouped by category (colors, spacing, radius, font, shadow, breakpoint, other)state.ui_audit.shadcn_inventory — object with version, style, base_color, primitives (only when stack is react-shadcn; null otherwise)state.ui_audit.patterns — object with forms, tables, modals, empty_states, navigation, data_display arraysstate.ui_audit.candidates — top-5 similarity matches for the current input (may be empty)state.ui_audit.greenfield — boolean; when true, greenfield_decision MUST also be set before the dispatcher advancesstate.ui_audit.a11y_baseline (optional) — array of {rule, selector, severity?} entries documenting pre-existing a11y violations the review gate should treat as informational. Omit the key entirely when no baseline applies; do not write [] for "I checked and there are none" — that disables the gate's filter for every future run.Design-system export (current-repo source): when the goal is to seed
DESIGN.md from this repo, emit the inventory as a design-system.json
artifact (the import contract in
design-system-capture)
and hand it to design-system-capture — the same shape an external extraction
tool produces, so the import path is uniform.
directives/ui/audit.ts enforces "no design without audit findings". Never treat this skill as optional for non-trivial UI.:root, not from class strings in templates.package.json means shadcn — shadcn requires components.json at repo root.state.ui_audit.shadcn_inventory.version is often missing; the shadcn CLI does not always pin itself in package.json. Record null rather than guessing.(composer.json mtime, package.json mtime); if either changed, re-audit and overwrite.When the audit inventory reveals an existing aesthetic direction (dominant color
scheme, border-radius convention, motion patterns), cross-check the findings
against
docs/guidelines/design-antipatterns.md.
If the existing UI already uses a listed anti-pattern, surface it as a design-debt
finding (separate from the reuse inventory) — flag by entry ID and severity. The
next design step can then decide whether to continue the existing pattern (for
consistency) or introduce a corrective direction change.
directives/ui/design.ts or apply.ts if state.ui_audit is empty.state.ui_audit.greenfield == true and state.ui_audit.greenfield_decision is unset.state.ui_audit once it is populated unless re-detection is triggered by mtime change — design and apply read from it.