mirror of
https://github.com/openclaw/openclaw.git
synced 2026-03-23 16:01:17 +00:00
95 lines
3.2 KiB
TypeScript
95 lines
3.2 KiB
TypeScript
import fs from "node:fs/promises";
|
|
import path from "node:path";
|
|
import { afterEach, describe, expect, it } from "vitest";
|
|
import { captureEnv } from "../test-utils/env.js";
|
|
import { loadEnabledClaudeBundleCommands } from "./bundle-commands.js";
|
|
import { createBundleMcpTempHarness } from "./bundle-mcp.test-support.js";
|
|
|
|
const tempHarness = createBundleMcpTempHarness();
|
|
|
|
afterEach(async () => {
|
|
await tempHarness.cleanup();
|
|
});
|
|
|
|
describe("loadEnabledClaudeBundleCommands", () => {
|
|
it("loads enabled Claude bundle markdown commands and skips disabled-model-invocation entries", async () => {
|
|
const env = captureEnv(["HOME", "USERPROFILE", "OPENCLAW_HOME", "OPENCLAW_STATE_DIR"]);
|
|
try {
|
|
const homeDir = await tempHarness.createTempDir("openclaw-bundle-commands-home-");
|
|
const workspaceDir = await tempHarness.createTempDir("openclaw-bundle-commands-workspace-");
|
|
process.env.HOME = homeDir;
|
|
process.env.USERPROFILE = homeDir;
|
|
delete process.env.OPENCLAW_HOME;
|
|
delete process.env.OPENCLAW_STATE_DIR;
|
|
|
|
const pluginRoot = path.join(homeDir, ".openclaw", "extensions", "compound-bundle");
|
|
await fs.mkdir(path.join(pluginRoot, ".claude-plugin"), { recursive: true });
|
|
await fs.mkdir(path.join(pluginRoot, "commands", "workflows"), { recursive: true });
|
|
await fs.writeFile(
|
|
path.join(pluginRoot, ".claude-plugin", "plugin.json"),
|
|
`${JSON.stringify({ name: "compound-bundle" }, null, 2)}\n`,
|
|
"utf-8",
|
|
);
|
|
await fs.writeFile(
|
|
path.join(pluginRoot, "commands", "office-hours.md"),
|
|
[
|
|
"---",
|
|
"description: Help with scoping and architecture",
|
|
"---",
|
|
"Give direct engineering advice.",
|
|
"",
|
|
].join("\n"),
|
|
"utf-8",
|
|
);
|
|
await fs.writeFile(
|
|
path.join(pluginRoot, "commands", "workflows", "review.md"),
|
|
[
|
|
"---",
|
|
"name: workflows:review",
|
|
"description: Run a structured review",
|
|
"---",
|
|
"Review the code. $ARGUMENTS",
|
|
"",
|
|
].join("\n"),
|
|
"utf-8",
|
|
);
|
|
await fs.writeFile(
|
|
path.join(pluginRoot, "commands", "disabled.md"),
|
|
["---", "disable-model-invocation: true", "---", "Do not load me.", ""].join("\n"),
|
|
"utf-8",
|
|
);
|
|
|
|
const commands = loadEnabledClaudeBundleCommands({
|
|
workspaceDir,
|
|
cfg: {
|
|
plugins: {
|
|
entries: {
|
|
"compound-bundle": { enabled: true },
|
|
},
|
|
},
|
|
},
|
|
});
|
|
|
|
expect(commands).toEqual(
|
|
expect.arrayContaining([
|
|
expect.objectContaining({
|
|
pluginId: "compound-bundle",
|
|
rawName: "office-hours",
|
|
description: "Help with scoping and architecture",
|
|
promptTemplate: "Give direct engineering advice.",
|
|
}),
|
|
expect.objectContaining({
|
|
pluginId: "compound-bundle",
|
|
rawName: "workflows:review",
|
|
description: "Run a structured review",
|
|
promptTemplate: "Review the code. $ARGUMENTS",
|
|
}),
|
|
]),
|
|
);
|
|
expect(commands.some((entry) => entry.rawName === "disabled")).toBe(false);
|
|
} finally {
|
|
env.restore();
|
|
}
|
|
});
|
|
});
|