test(builtin-skills): batch 16 (3 files)

This commit is contained in:
YeonGyu-Kim
2026-05-30 19:12:04 +09:00
parent 2ede800d6c
commit 1a4b4efdd0
3 changed files with 44 additions and 24 deletions
+3 -4
View File
@@ -1,4 +1,4 @@
# src/features/builtin-skills/ — 10 Built-in Skill Files
# src/features/builtin-skills/ — Built-in Skill Files
**Generated:** 2026-05-15
@@ -11,7 +11,7 @@ Skills shipped inside the plugin (always available, no install). Registered via
```
builtin-skills/
├── index.ts # Barrel exports
├── skills.ts # createBuiltinSkills() factory — registers all 10 below
├── skills.ts # createBuiltinSkills() factory
├── types.ts # BuiltinSkill interface
├── skills/
│ ├── git-master.ts # 1111 LOC
@@ -21,7 +21,6 @@ builtin-skills/
│ ├── dev-browser.ts # Persistent page state
│ ├── frontend-ui-ux.ts # Design-first UI guidance
│ ├── review-work.ts # 5-agent post-implementation review
│ ├── ai-slop-remover.ts # Remove AI-generated code patterns
│ ├── team-mode.ts # 12 team_* tool documentation (gated)
│ ├── git-master-sections/ # Git-master prompt sub-sections
│ └── index.ts # skill barrel
@@ -42,7 +41,7 @@ builtin-skills/
| `dev-browser` | 221 | — | Persistent page state browser for dev work |
| `frontend-ui-ux` | 79 | — | Design-first UI development guidance |
| `review-work` | ~500 | — | Post-implementation review orchestrator (5 parallel agents) |
| `ai-slop-remover` | ~300 | — | Remove AI-generated code smells |
| `$omo:remove-ai-slops` | | — | Remove AI-generated code smells |
| `team-mode` | — | — | **Conditional** — only loaded when `team_mode.enabled`; documents the 12 `team_*` tools and lifecycle |
## BROWSER VARIANT SELECTION
+38 -18
View File
@@ -1,3 +1,5 @@
/// <reference path="../../../bun-test.d.ts" />
import { describe, test, expect } from "bun:test"
import { createBuiltinSkills } from "./skills"
@@ -83,7 +85,7 @@ describe("createBuiltinSkills", () => {
expect(agentBrowserSkill!.template).toContain("agent-browser snapshot")
})
test("always includes frontend-ui-ux, git-master, review-work, and ai-slop-remover skills", () => {
test("always includes frontend-ui-ux, git-master, review-work, remove-ai-slops, and init-deep skills", () => {
// given - both provider options
// when
@@ -96,11 +98,12 @@ describe("createBuiltinSkills", () => {
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()
expect(skills.find((s) => s.name === "remove-ai-slops")).toBeDefined()
expect(skills.find((s) => s.name === "init-deep")).toBeDefined()
}
})
test("returns exactly 5 skills regardless of provider", () => {
test("returns exactly 6 skills regardless of provider", () => {
// given
// when
@@ -109,9 +112,9 @@ describe("createBuiltinSkills", () => {
const devBrowserSkills = createBuiltinSkills({ browserProvider: "dev-browser" })
// then
expect(defaultSkills).toHaveLength(5)
expect(agentBrowserSkills).toHaveLength(5)
expect(devBrowserSkills).toHaveLength(5)
expect(defaultSkills).toHaveLength(6)
expect(agentBrowserSkills).toHaveLength(6)
expect(devBrowserSkills).toHaveLength(6)
})
test("should exclude playwright when it is in disabledSkills", () => {
@@ -127,8 +130,9 @@ describe("createBuiltinSkills", () => {
expect(skills.map((s) => s.name)).toContain("git-master")
expect(skills.map((s) => s.name)).not.toContain("dev-browser")
expect(skills.map((s) => s.name)).toContain("review-work")
expect(skills.map((s) => s.name)).toContain("ai-slop-remover")
expect(skills.length).toBe(4)
expect(skills.map((s) => s.name)).toContain("remove-ai-slops")
expect(skills.map((s) => s.name)).toContain("init-deep")
expect(skills.length).toBe(5)
})
test("should exclude multiple skills when they are in disabledSkills", () => {
@@ -144,13 +148,14 @@ describe("createBuiltinSkills", () => {
expect(skills.map((s) => s.name)).toContain("frontend-ui-ux")
expect(skills.map((s) => s.name)).not.toContain("dev-browser")
expect(skills.map((s) => s.name)).toContain("review-work")
expect(skills.map((s) => s.name)).toContain("ai-slop-remover")
expect(skills.length).toBe(3)
expect(skills.map((s) => s.name)).toContain("remove-ai-slops")
expect(skills.map((s) => s.name)).toContain("init-deep")
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", "review-work", "ai-slop-remover"]) }
const options = { disabledSkills: new Set(["playwright", "frontend-ui-ux", "git-master", "review-work", "remove-ai-slops", "init-deep"]) }
// #when
const skills = createBuiltinSkills(options)
@@ -167,7 +172,22 @@ describe("createBuiltinSkills", () => {
const skills = createBuiltinSkills(options)
// #then
expect(skills.length).toBe(5)
expect(skills.length).toBe(6)
})
test("init-deep skill has correct structure", () => {
// #given - default options
// #when
const skills = createBuiltinSkills()
const initDeep = skills.find((s) => s.name === "init-deep")
// #then
expect(initDeep).toBeDefined()
expect(initDeep!.description).toContain("hierarchical AGENTS.md")
expect(initDeep!.argumentHint).toBe("[--create-new] [--max-depth=N]")
expect(initDeep!.template).toContain("Generate hierarchical AGENTS.md files")
expect(initDeep!.template).toContain("Discovery + Analysis")
})
test("review-work skill has correct structure", () => {
@@ -202,18 +222,18 @@ describe("createBuiltinSkills", () => {
expect(compatibilityIndex < opencodeExampleIndex).toBe(true)
})
test("ai-slop-remover skill has correct structure", () => {
test("remove-ai-slops skill has correct structure", () => {
// #given - default options
// #when
const skills = createBuiltinSkills()
const aiSlopRemover = skills.find((s) => s.name === "ai-slop-remover")
const removeAiSlops = skills.find((s) => s.name === "remove-ai-slops")
// #then
expect(aiSlopRemover).toBeDefined()
expect(aiSlopRemover!.description).toContain("AI-generated code smells")
expect(aiSlopRemover!.template).toContain("DETECTION CRITERIA")
expect(aiSlopRemover!.template).toContain("SAFETY RULES")
expect(removeAiSlops).toBeDefined()
expect(removeAiSlops!.description).toContain("AI-generated code smells")
expect(removeAiSlops!.template).toContain("Remove AI Slops Skill")
expect(removeAiSlops!.template).toContain("$omo:remove-ai-slops")
})
test("returns playwright-cli skill when browserProvider is 'playwright-cli'", () => {
+3 -2
View File
@@ -8,8 +8,9 @@ import {
frontendUiUxSkill,
gitMasterSkill,
devBrowserSkill,
initDeepSkill,
removeAiSlopsSkill,
reviewWorkSkill,
aiSlopRemoverSkill,
teamModeSkill,
} from "./skills/index"
@@ -33,7 +34,7 @@ export function createBuiltinSkills(options: CreateBuiltinSkillsOptions = {}): B
browserSkill = playwrightSkill
}
const skills = [browserSkill, frontendUiUxSkill, gitMasterSkill, reviewWorkSkill, aiSlopRemoverSkill]
const skills = [browserSkill, frontendUiUxSkill, gitMasterSkill, reviewWorkSkill, removeAiSlopsSkill, initDeepSkill]
if (teamModeEnabled && !disabledSkills?.has("team-mode")) {
skills.push(teamModeSkill)