| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209 |
- import { describe, expect, test } from "bun:test"
- import {
- getBuiltinSkills,
- getSkillByName,
- getSkillsForAgent,
- canAgentUseSkill,
- DEFAULT_AGENT_SKILLS,
- } from "./builtin"
- import type { PluginConfig } from "../../config/schema"
- describe("getBuiltinSkills", () => {
- test("returns all builtin skills", () => {
- const skills = getBuiltinSkills()
- expect(skills.length).toBeGreaterThan(0)
-
- const names = skills.map(s => s.name)
- expect(names).toContain("yagni-enforcement")
- expect(names).toContain("playwright")
- })
- })
- describe("getSkillByName", () => {
- test("returns skill by exact name", () => {
- const skill = getSkillByName("yagni-enforcement")
- expect(skill).toBeDefined()
- expect(skill?.name).toBe("yagni-enforcement")
- })
- test("returns undefined for unknown skill", () => {
- const skill = getSkillByName("nonexistent-skill")
- expect(skill).toBeUndefined()
- })
- test("returns playwright skill with mcpConfig", () => {
- const skill = getSkillByName("playwright")
- expect(skill).toBeDefined()
- expect(skill?.mcpConfig).toBeDefined()
- expect(skill?.mcpConfig?.playwright).toBeDefined()
- })
- })
- describe("DEFAULT_AGENT_SKILLS", () => {
- test("orchestrator has wildcard access", () => {
- expect(DEFAULT_AGENT_SKILLS.orchestrator).toContain("*")
- })
- test("designer has playwright skill", () => {
- expect(DEFAULT_AGENT_SKILLS.designer).toContain("playwright")
- })
- test("oracle has no skills by default", () => {
- expect(DEFAULT_AGENT_SKILLS.oracle).toEqual([])
- })
- test("librarian has no skills by default", () => {
- expect(DEFAULT_AGENT_SKILLS.librarian).toEqual([])
- })
- test("explorer has no skills by default", () => {
- expect(DEFAULT_AGENT_SKILLS.explorer).toEqual([])
- })
- test("fixer has no skills by default", () => {
- expect(DEFAULT_AGENT_SKILLS.fixer).toEqual([])
- })
- })
- describe("getSkillsForAgent", () => {
- test("returns all skills for orchestrator (wildcard)", () => {
- const skills = getSkillsForAgent("orchestrator")
- const allSkills = getBuiltinSkills()
- expect(skills.length).toBe(allSkills.length)
- })
- test("returns playwright for designer", () => {
- const skills = getSkillsForAgent("designer")
- const names = skills.map(s => s.name)
- expect(names).toContain("playwright")
- })
- test("returns empty for oracle", () => {
- const skills = getSkillsForAgent("oracle")
- expect(skills).toEqual([])
- })
- test("respects config override for agent skills", () => {
- const config: PluginConfig = {
- agents: {
- oracle: { skills: ["yagni-enforcement"] },
- },
- }
- const skills = getSkillsForAgent("oracle", config)
- expect(skills.length).toBe(1)
- expect(skills[0].name).toBe("yagni-enforcement")
- })
- test("config wildcard overrides default", () => {
- const config: PluginConfig = {
- agents: {
- explorer: { skills: ["*"] },
- },
- }
- const skills = getSkillsForAgent("explorer", config)
- const allSkills = getBuiltinSkills()
- expect(skills.length).toBe(allSkills.length)
- })
- test("config empty array removes default skills", () => {
- const config: PluginConfig = {
- agents: {
- designer: { skills: [] },
- },
- }
- const skills = getSkillsForAgent("designer", config)
- expect(skills).toEqual([])
- })
- test("backward compat: 'explore' alias config applies to explorer", () => {
- const config: PluginConfig = {
- agents: {
- explore: { skills: ["playwright"] },
- },
- }
- const skills = getSkillsForAgent("explorer", config)
- expect(skills.length).toBe(1)
- expect(skills[0].name).toBe("playwright")
- })
- test("backward compat: 'frontend-ui-ux-engineer' alias applies to designer", () => {
- const config: PluginConfig = {
- agents: {
- "frontend-ui-ux-engineer": { skills: ["yagni-enforcement"] },
- },
- }
- const skills = getSkillsForAgent("designer", config)
- expect(skills.length).toBe(1)
- expect(skills[0].name).toBe("yagni-enforcement")
- })
- test("returns empty for unknown agent without config", () => {
- const skills = getSkillsForAgent("unknown-agent")
- expect(skills).toEqual([])
- })
- })
- describe("canAgentUseSkill", () => {
- test("orchestrator can use any skill (wildcard)", () => {
- expect(canAgentUseSkill("orchestrator", "yagni-enforcement")).toBe(true)
- expect(canAgentUseSkill("orchestrator", "playwright")).toBe(true)
- expect(canAgentUseSkill("orchestrator", "any-skill")).toBe(true)
- })
- test("designer can use playwright", () => {
- expect(canAgentUseSkill("designer", "playwright")).toBe(true)
- })
- test("designer cannot use yagni-enforcement by default", () => {
- expect(canAgentUseSkill("designer", "yagni-enforcement")).toBe(false)
- })
- test("oracle cannot use any skill by default", () => {
- expect(canAgentUseSkill("oracle", "yagni-enforcement")).toBe(false)
- expect(canAgentUseSkill("oracle", "playwright")).toBe(false)
- })
- test("respects config override", () => {
- const config: PluginConfig = {
- agents: {
- oracle: { skills: ["yagni-enforcement"] },
- },
- }
- expect(canAgentUseSkill("oracle", "yagni-enforcement", config)).toBe(true)
- expect(canAgentUseSkill("oracle", "playwright", config)).toBe(false)
- })
- test("config wildcard grants all permissions", () => {
- const config: PluginConfig = {
- agents: {
- librarian: { skills: ["*"] },
- },
- }
- expect(canAgentUseSkill("librarian", "yagni-enforcement", config)).toBe(true)
- expect(canAgentUseSkill("librarian", "playwright", config)).toBe(true)
- expect(canAgentUseSkill("librarian", "any-other-skill", config)).toBe(true)
- })
- test("config empty array denies all", () => {
- const config: PluginConfig = {
- agents: {
- designer: { skills: [] },
- },
- }
- expect(canAgentUseSkill("designer", "playwright", config)).toBe(false)
- })
- test("backward compat: alias config affects agent permissions", () => {
- const config: PluginConfig = {
- agents: {
- explore: { skills: ["playwright"] },
- },
- }
- expect(canAgentUseSkill("explorer", "playwright", config)).toBe(true)
- expect(canAgentUseSkill("explorer", "yagni-enforcement", config)).toBe(false)
- })
- test("unknown agent returns false without config", () => {
- expect(canAgentUseSkill("unknown-agent", "playwright")).toBe(false)
- })
- })
|