affectUI › Screens › App screens

Agent / Skills

What your agent knows how to do – your skills as calm cards with a switch, filtered by what they're for; skills to discover below whose Install fills a ring and lands among yours; and each skill with two weeks of runs, when it steps in, its steps and what it needs.

Part of affectUI Pro. Install: npx shadcn@latest add https://www.affectui.com/r/agent-skills.json · Import from @/components/ui/agent-skills

When to use

  • Showing what an agent knows how to do – the skills it has, where they come from and how often they run
  • Adding skills from a catalog, and switching ones off without removing them
  • Answering when a skill steps in and what it needs before you turn it on

When not to use

  • What the agent may do in your apps – use Agent / Permissions
  • What it knows about you – use Agent / Memory
  • Connecting apps – use Integrations

Usage

import { AgentSkillsScreen } from "@/components/ui/agent-skills";

export default function Page() {
  const [skills, setSkills] = useState(initialSkills);
  return (
    <AgentSkillsScreen
      skills={skills}                              // installed and not – Discover shows the rest
      onInstall={(id) => api.installSkill(id)}     // a promise keeps the ring filling until it settles
      onToggle={(id, enabled) => api.setSkill(id, { enabled })}
      onRemove={(id) => api.removeSkill(id)}
      onCreate={(skill) => api.createSkill(skill)}  // from the New skill window
      onNavigate={(label) => router.push(routes[label])}
    />
  );
}

Props

NameTypeDefaultDescription
skills{ id; name; description; category; icon?; tone?; source: "builtin" | "yours" | "community"; author?; version?; installed?; enabled?; uses?; installs?; triggers?; steps?; needs?; usedIn?: { task; at }[] }[]Every skill. Installed ones are calm cards with a switch under Installed, the rest cards with a + under Discover; the categories become filters above. triggers are things you might say that make it step in; steps what it does; daily runs per day for the last 14 days (the bars in the panel); needs the apps and rights it uses (with a way to Permissions); uses how often it ran this week; installs how many people use a community skill. Pass a stable array (state)
defaultSelectedstring | null"voice"The skill open on the right when the screen starts
onInstall(id) => void | PromiseCalled with Install – the ring fills for at least 1.4 seconds and until a returned promise settles; then the skill joins Installed
onToggle(id, enabled) => voidCalled when a skill is switched on or off
onRemove(id) => voidCalled with Remove – yours and community skills; built-in ones can only be turned off
onCreate(skill: Skill) => voidCalled with a skill made in New skill – described to the agent (it drafts name, use and steps to check), written by hand or read from an uploaded SKILL.md; it lands among yours and opens on the right
onSelect(id) => voidCalled when a skill is opened
onNavigate(label: string) => voidCalled with the label of a sidebar item – and with "Permissions" from What it needs
labels{ skills?; installed?; discover?; install?; installing?; done?; runsWhen?; steps?; needs?; … }Labels, e.g. for a translation
classNamestringExtra class on the root

Keyboard

  • J / K / ← / → / ↑ / ↓: From skill to skill – through Installed, then Discover
  • Enter: Open the skill on the right
  • Space: On a switch: turn the skill on or off
  • ↑ / ↓: In New skill: from way to way – Esc closes, ⌘ Enter writes or creates
  • /: Search – Esc clears it, ↓ steps into the results
  • ← / →: On the filters: from category to category

Accessibility

  • Each skill is a button named with what it does, where it comes from, how often it ran and whether it's off; the switch is a role="switch" named with the skill
  • Install says what happens – "Installing Slide deck", then "Slide deck: Installed" – through a polite live region
  • Rings show for the keyboard only and sit inside rows and cards; the search only firms up its edge

Responsive

  • Your skills and Discover share one grid – tiles fill the width in as many columns as fit; the category filters scroll sideways when they don't fit
  • Discover cards fill the width in as many columns as fit; one column on phones
  • Below 560px everything is one column, the search folds to its icon until you type and New skill to its +
  • Touch targets grow to 36px and the switch to 40 × 24 on touch screens
  • Dark mode built in: switches when an ancestor (usually <html>) has the class dark or data-theme="dark"

Requirements

  • React 19
  • @hugeicons/react
  • @hugeicons/core-free-icons
  • App Shell (installed with it)

Related

  • Agent / Permissions – What your agent may do without asking – one choice on top (Careful, Balanced, Hands-off) said in plain words, the apps it works in, the red lines that always ask, and each app with its actions grouped Reads, Changes, Needs care
  • Agent / Memory – What your agent knows about you and your work – grouped by where it applies, each with where it came from and where it was used; a memory it recalls lights up while it works, and what it picks up on its own waits for your OK
  • Integrations – App directory with a sticky header, categories, search and connect states