feat: add coding-agent skill and anyBins gating

Co-authored-by: Sreekaran Srinath <ss@sreekaran.com>
This commit is contained in:
Sreekaran Srinath
2026-01-02 15:40:03 -08:00
committed by GitHub
parent 59601eb99c
commit 0ac30afb29
4 changed files with 94 additions and 0 deletions

View File

@@ -215,6 +215,12 @@ describe("buildWorkspaceSkillsPrompt", () => {
description: "Needs a bin",
metadata: '{"clawdis":{"requires":{"bins":["fakebin"]}}}',
});
await writeSkill({
dir: path.join(skillsDir, "anybin-skill"),
name: "anybin-skill",
description: "Needs any bin",
metadata: '{"clawdis":{"requires":{"anyBins":["missingbin","fakebin"]}}}',
});
await writeSkill({
dir: path.join(skillsDir, "config-skill"),
name: "config-skill",
@@ -242,6 +248,7 @@ describe("buildWorkspaceSkillsPrompt", () => {
expect(defaultPrompt).toContain("always-skill");
expect(defaultPrompt).toContain("config-skill");
expect(defaultPrompt).not.toContain("bin-skill");
expect(defaultPrompt).not.toContain("anybin-skill");
expect(defaultPrompt).not.toContain("env-skill");
await fs.mkdir(binDir, { recursive: true });
@@ -258,6 +265,7 @@ describe("buildWorkspaceSkillsPrompt", () => {
},
});
expect(gatedPrompt).toContain("bin-skill");
expect(gatedPrompt).toContain("anybin-skill");
expect(gatedPrompt).toContain("env-skill");
expect(gatedPrompt).toContain("always-skill");
expect(gatedPrompt).not.toContain("config-skill");

View File

@@ -30,6 +30,7 @@ export type ClawdisSkillMetadata = {
os?: string[];
requires?: {
bins?: string[];
anyBins?: string[];
env?: string[];
config?: string[];
};
@@ -307,6 +308,7 @@ function resolveClawdisMetadata(
requires: requiresRaw
? {
bins: normalizeStringList(requiresRaw.bins),
anyBins: normalizeStringList(requiresRaw.anyBins),
env: normalizeStringList(requiresRaw.env),
config: normalizeStringList(requiresRaw.config),
}
@@ -347,6 +349,11 @@ function shouldIncludeSkill(params: {
if (!hasBinary(bin)) return false;
}
}
const requiredAnyBins = entry.clawdis?.requires?.anyBins ?? [];
if (requiredAnyBins.length > 0) {
const anyFound = requiredAnyBins.some((bin) => hasBinary(bin));
if (!anyFound) return false;
}
const requiredEnv = entry.clawdis?.requires?.env ?? [];
if (requiredEnv.length > 0) {