




















@@ -7,6 +7,7 @@ import { buildWorkspaceSkillStatus } from "./skills-status.js";
77import { writeSkill } from "./skills.e2e-test-helpers.js";
88import { createCanonicalFixtureSkill } from "./skills.test-helpers.js";
99import type { SkillEntry } from "./skills/types.js";
10+import { loadWorkspaceSkillEntries } from "./skills/workspace.js";
10111112const tempDirs: string[] = [];
1213@@ -166,6 +167,63 @@ describe("buildWorkspaceSkillStatus", () => {
166167expect(skill?.bundled).toBe(true);
167168});
168169170+it("requires explicit enablement before exposing bundled coding-agent", async () => {
171+const workspaceDir = await createTempWorkspaceDir();
172+const bundledSkillsDir = path.resolve("skills");
173+const entries = loadWorkspaceSkillEntries(workspaceDir, {
174+managedSkillsDir: path.join(workspaceDir, ".managed"),
175+ bundledSkillsDir,
176+config: {
177+skills: {
178+allowBundled: ["coding-agent"],
179+},
180+},
181+});
182+const codingAgent = entries.find((entry) => entry.skill.name === "coding-agent");
183+expect(codingAgent).toBeDefined();
184+185+const eligibility = {
186+remote: {
187+platforms: [process.platform],
188+hasBin: () => false,
189+hasAnyBin: (bins: string[]) => bins.includes("codex"),
190+},
191+};
192+const defaultReport = withEnv({ PATH: "" }, () =>
193+buildWorkspaceSkillStatus(workspaceDir, {
194+entries: [codingAgent as SkillEntry],
195+config: {
196+skills: {
197+allowBundled: ["coding-agent"],
198+},
199+},
200+ eligibility,
201+}),
202+);
203+const defaultStatus = defaultReport.skills[0];
204+expect(defaultStatus?.eligible).toBe(false);
205+expect(defaultStatus?.requirements.config).toEqual(["skills.entries.coding-agent.enabled"]);
206+expect(defaultStatus?.missing.config).toEqual(["skills.entries.coding-agent.enabled"]);
207+208+const enabledReport = withEnv({ PATH: "" }, () =>
209+buildWorkspaceSkillStatus(workspaceDir, {
210+entries: [codingAgent as SkillEntry],
211+config: {
212+skills: {
213+allowBundled: ["coding-agent"],
214+entries: {
215+"coding-agent": { enabled: true },
216+},
217+},
218+},
219+ eligibility,
220+}),
221+);
222+const enabledStatus = enabledReport.skills[0];
223+expect(enabledStatus?.eligible).toBe(true);
224+expect(enabledStatus?.missing.config).toEqual([]);
225+});
226+169227it("does not mark an overridden workspace skill as bundled by bundled name alone", async () => {
170228const bundledDir = await fs.mkdtemp(path.join(os.tmpdir(), "openclaw-bundled-"));
171229tempDirs.push(bundledDir);
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。