feat(agent): per-agent skill allowlist + Skill selection UI - #5301
feat(agent): per-agent skill allowlist + Skill selection UI#5301sloppamadewithlove wants to merge 1 commit into
Conversation
Add a per-agent skill allowlist so each agent starts with zero skills and only explicitly enabled skills are exposed via the load_skill tool. - Add skills_allowlist to Config, parsed from BUZZ_AGENT_SKILLS env - Gate hint discovery by the allowlist (default empty = none) - New Tauri command list_installed_skills: union of all runtime skill dirs (codex, claude, goose, .agents/skills, .buzz/.agents/skills) - SkillSelectionPanel: fixed-height scrollable box at the bottom of the agent runtime tab, on/off Switch per skill, all-off default - Persistence rides the existing spawn env (BUZZ_AGENT_SKILLS) Co-authored-by: sloppa <sloppawithlove@gmail.com> Signed-off-by: sloppa <sloppawithlove@gmail.com>
|
I like the user-facing direction here: an agent should only get the Skills selected for it. I have restacked #4600 as the shared content and identity layer underneath this. It provides one Agent Skills parser, exact directory content, and a stable digest, so this PR can stop maintaining a second parser without making a local path or same-named folder the portable identity. Two boundaries look important:
If that split makes sense, I can help wire this branch to the shared parser while you keep the selection UI and runtime gating here. |
wolfyy970
left a comment
There was a problem hiding this comment.
I like the direction, but I don’t think this is safe to merge as an agent-wide control yet.
The switch currently changes Buzz Agent only. Codex, Claude, Goose, Pi and Hermes still discover Skills through their own runtimes, so Desktop can show zero enabled while those agents can use everything on disk. The list also comes from Desktop’s home, not the agent’s workspace or execution target, which makes it wrong for project Skills and remote agents.
Name-only selection is the other hard boundary. Desktop and Buzz Agent scan different roots in different orders, so a project Skill can silently replace the same-named global Skill the owner reviewed. Existing agents also have no migration: an unset env value changes from all Skills to none, while unset and explicit none cannot be distinguished.
I think this should build on #4600. Persist reviewed Skill references and digests in the agent definition, resolve them on the execution target, then generate runtime-specific launch input. The UI can show missing Skills, restart required, and whether the running generation applied the selection. I would land Buzz Agent enforcement first behind that migrated typed field, then add each runtime when it has a real enforcement path.
I checked the current head locally. TypeScript compiles; Rust formatting currently fails, but that is mechanical rather than the product blocker.
Summary
Adds a per-agent skill allowlist so each agent starts with zero skills and only explicitly enabled skills are exposed via the built-in
load_skilltool. This is the backend + desktop UI for per-agent skill selection.Motivation
Today every Buzz agent auto-loads every skill found on disk. This adds a "Skill selection" panel at the very bottom of each agent's runtime tab so a user can toggle exactly which skills an agent has access to, starting all-off.
Changes
crates/buzz-agent— newskills_allowlistonConfig, parsed fromBUZZ_AGENT_SKILLSenv (comma/space-separated skill names). Default is empty = zero skills. Discovery +load_skillgated by the allowlist.list_installed_skillscommand enumerating all skills across the runtime skill dirs (.agents/,.codex/,.claude/,.goose/,.buzz/.agents/), deduped + sorted by frontmatter name/description.SkillSelectionPanel: fixed-height scrollable box at the bottom of the agent runtime tab, one on/offSwitchper skill, all-off default. Writes the enabled set toBUZZ_AGENT_SKILLS, riding the existing spawn-env path.Notes / review asks
buzz-acpbinary that only exists in the project's build/CI environment). This PR relies on CI to typecheck the desktop changes.load_skillonly; they do not rewrite each runtime'sconfig.toml.