feat: add review-work and ai-slop-remover as built-in skills, add remove-ai-slops command

Embed user-level skills into the plugin's built-in system so they ship
with the product rather than requiring per-user configuration.

- review-work: 5-agent parallel post-implementation review orchestrator
- ai-slop-remover: per-file AI-generated code smell detector and remover
- /remove-ai-slops: command that orchestrates parallel ai-slop-remover runs
This commit is contained in:
YeonGyu-Kim
2026-03-31 17:22:34 -07:00
parent 0799b46d49
commit 92d70cff5b
10 changed files with 906 additions and 10 deletions
+46 -8
View File
@@ -61,7 +61,7 @@ describe("createBuiltinSkills", () => {
expect(agentBrowserSkill!.template).toContain("agent-browser snapshot")
})
test("always includes frontend-ui-ux and git-master skills", () => {
test("always includes frontend-ui-ux, git-master, review-work, and ai-slop-remover skills", () => {
// given - both provider options
// when
@@ -72,10 +72,12 @@ describe("createBuiltinSkills", () => {
for (const skills of [defaultSkills, agentBrowserSkills]) {
expect(skills.find((s) => s.name === "frontend-ui-ux")).toBeDefined()
expect(skills.find((s) => s.name === "git-master")).toBeDefined()
expect(skills.find((s) => s.name === "review-work")).toBeDefined()
expect(skills.find((s) => s.name === "ai-slop-remover")).toBeDefined()
}
})
test("returns exactly 4 skills regardless of provider", () => {
test("returns exactly 6 skills regardless of provider", () => {
// given
// when
@@ -83,8 +85,8 @@ describe("createBuiltinSkills", () => {
const agentBrowserSkills = createBuiltinSkills({ browserProvider: "agent-browser" })
// then
expect(defaultSkills).toHaveLength(4)
expect(agentBrowserSkills).toHaveLength(4)
expect(defaultSkills).toHaveLength(6)
expect(agentBrowserSkills).toHaveLength(6)
})
test("should exclude playwright when it is in disabledSkills", () => {
@@ -99,7 +101,9 @@ describe("createBuiltinSkills", () => {
expect(skills.map((s) => s.name)).toContain("frontend-ui-ux")
expect(skills.map((s) => s.name)).toContain("git-master")
expect(skills.map((s) => s.name)).toContain("dev-browser")
expect(skills.length).toBe(3)
expect(skills.map((s) => s.name)).toContain("review-work")
expect(skills.map((s) => s.name)).toContain("ai-slop-remover")
expect(skills.length).toBe(5)
})
test("should exclude multiple skills when they are in disabledSkills", () => {
@@ -114,13 +118,15 @@ describe("createBuiltinSkills", () => {
expect(skills.map((s) => s.name)).not.toContain("git-master")
expect(skills.map((s) => s.name)).toContain("frontend-ui-ux")
expect(skills.map((s) => s.name)).toContain("dev-browser")
expect(skills.length).toBe(2)
expect(skills.map((s) => s.name)).toContain("review-work")
expect(skills.map((s) => s.name)).toContain("ai-slop-remover")
expect(skills.length).toBe(4)
})
test("should return an empty array when all skills are disabled", () => {
// #given
const options = {
disabledSkills: new Set(["playwright", "frontend-ui-ux", "git-master", "dev-browser"]),
disabledSkills: new Set(["playwright", "frontend-ui-ux", "git-master", "dev-browser", "review-work", "ai-slop-remover"]),
}
// #when
@@ -138,7 +144,39 @@ describe("createBuiltinSkills", () => {
const skills = createBuiltinSkills(options)
// #then
expect(skills.length).toBe(4)
expect(skills.length).toBe(6)
})
test("review-work skill has correct structure", () => {
// #given - default options
// #when
const skills = createBuiltinSkills()
const reviewWork = skills.find((s) => s.name === "review-work")
// #then
expect(reviewWork).toBeDefined()
expect(reviewWork!.description).toContain("review")
expect(reviewWork!.template).toContain("5-Agent Parallel Review Orchestrator")
expect(reviewWork!.template).toContain("Goal & Constraint Verification")
expect(reviewWork!.template).toContain("QA")
expect(reviewWork!.template).toContain("Code Quality")
expect(reviewWork!.template).toContain("Security")
expect(reviewWork!.template).toContain("Context Mining")
})
test("ai-slop-remover skill has correct structure", () => {
// #given - default options
// #when
const skills = createBuiltinSkills()
const aiSlopRemover = skills.find((s) => s.name === "ai-slop-remover")
// #then
expect(aiSlopRemover).toBeDefined()
expect(aiSlopRemover!.description).toContain("AI-generated code smells")
expect(aiSlopRemover!.template).toContain("DETECTION CRITERIA")
expect(aiSlopRemover!.template).toContain("SAFETY RULES")
})
test("returns playwright-cli skill when browserProvider is 'playwright-cli'", () => {