Skip to content

Commit de652b2

Browse files
committed
Flatten the ponytail skill description for discovery
1 parent b38339a commit de652b2

4 files changed

Lines changed: 45 additions & 13 deletions

File tree

plugins/corbits-skills/skills/ponytail/SKILL.md

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,7 @@
11
---
22
name: ponytail
33
user-invocable: false
4-
description: >
5-
Forces the laziest solution that actually works, simplest, shortest, most
6-
minimal. Channels a senior dev who has seen everything: question whether the
7-
task needs to exist at all (YAGNI), reach for the standard library before
8-
custom code, native platform features before dependencies, one line before
9-
fifty. Supports intensity levels: lite, full (default), ultra. Use on ANY
10-
coding task: writing, adding, refactoring, fixing, reviewing, or designing
11-
code, and choosing libraries or dependencies. Also use whenever the user
12-
says "ponytail", "be lazy", "lazy mode", "simplest solution", "minimal
13-
solution", "yagni", "do less", or "shortest path", or complains about
14-
over-engineering, bloat, boilerplate, or unnecessary dependencies. Do NOT
15-
use for non-coding requests (general knowledge, prose, translation,
16-
summaries, recipes).
4+
description: Less-is-more quality bar: YAGNI, reuse, shortest working diff. Baked into implement and critic; load when writing or reviewing product code.
175
argument-hint: "[lite|full|ultra]"
186
license: MIT
197
---

src/agent/directors/identity.test.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,18 @@ describe("formatDirectorSystemPrompt", () => {
6363
expect(text).toContain(ponytail);
6464
});
6565

66+
test("bakes real ponytail body for critic including Corbits host", () => {
67+
const text = formatDirectorSystemPrompt(DIRECTOR_REGISTRY.critic);
68+
const ponytail = stripFrontmatter(
69+
readFileSync(
70+
join(import.meta.dirname, "../../../plugins/corbits-skills/skills/ponytail/SKILL.md"),
71+
"utf8",
72+
),
73+
);
74+
expect(text).toContain(ponytail);
75+
expect(text).toContain("## Corbits host");
76+
});
77+
6678
test("does not bake skill bodies when optionalSkills is empty", () => {
6779
const text = formatDirectorSystemPrompt(DIRECTOR_REGISTRY.intern);
6880
expect(text).not.toContain("# Baked skill guidance");

src/agent/directors/skywalker/package.test.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,4 +207,10 @@ describe("skywalkerPackage", () => {
207207
expect(p).toContain("ship → verify → fix → re-verify");
208208
expect(p).toContain("Cap re-fix rounds");
209209
});
210+
211+
test("systemPrompt treats implement read-first as expected progress", () => {
212+
expect(skywalkerPackage.systemPrompt).toContain(
213+
"Implement's bounded read-first phase is expected progress",
214+
);
215+
});
210216
});

tests/unit/corbits-skills-catalog.test.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { existsSync } from "node:fs";
22
import { readdir } from "node:fs/promises";
33
import { join } from "node:path";
44
import { expect, test } from "bun:test";
5+
import { discoverSkills } from "../../src/extensions/skills.js";
56
import { loadSkillCommands } from "../../src/plugins/skill-commands.js";
67

78
const pluginRoot = join(import.meta.dirname, "../../plugins/corbits-skills");
@@ -305,4 +306,29 @@ test("ponytail skill is use-skill-only with a Corbits host addendum", async () =
305306
const skill = await Bun.file(join(pluginRoot, "skills/ponytail/SKILL.md")).text();
306307
expect(skill).toContain(USER_INVOCABLE_FALSE);
307308
expect(skill).toContain("## Corbits host");
309+
const descLine = skill.split("\n").find((line) => line.startsWith("description:"));
310+
expect(descLine).toBeDefined();
311+
if (descLine === undefined) return;
312+
const value = descLine.slice("description:".length).trim();
313+
expect(value).not.toBe(">");
314+
expect(value).not.toBe("|");
315+
expect(value).toBe(
316+
"Less-is-more quality bar: YAGNI, reuse, shortest working diff. Baked into implement and critic; load when writing or reviewing product code.",
317+
);
318+
});
319+
320+
test("discoverSkills lists one-line skill descriptions, not YAML fold markers", async () => {
321+
const skills = await discoverSkills(".", [pluginRoot]);
322+
const ponytail = skills.find((s) => s.name === "ponytail");
323+
expect(ponytail).toBeDefined();
324+
if (ponytail === undefined) return;
325+
expect(ponytail.description).toBe(
326+
"Less-is-more quality bar: YAGNI, reuse, shortest working diff. Baked into implement and critic; load when writing or reviewing product code.",
327+
);
328+
expect(ponytail.description.length).toBeGreaterThan(8);
329+
expect(ponytail.description).not.toContain("\n");
330+
for (const skill of skills) {
331+
expect(skill.description).not.toBe(">");
332+
expect(skill.description).not.toBe("|");
333+
}
308334
});

0 commit comments

Comments
 (0)