






























1+// Qqbot tests cover group command visibility classification.
2+import { describe, expect, it } from "vitest";
3+import { classifyCoreCommandForGroup, parseSlashCommandName } from "./command-visibility.js";
4+5+describe("QQBot command visibility", () => {
6+it("parses slash command names case-insensitively", () => {
7+expect(parseSlashCommandName(" /NEW now ")).toBe("new");
8+expect(parseSlashCommandName("/CONFIG: show")).toBe("config");
9+expect(parseSlashCommandName("/config:show")).toBe("config");
10+expect(parseSlashCommandName("/config@bot show")).toBe("config");
11+expect(parseSlashCommandName("hello")).toBeUndefined();
12+});
13+14+it("keeps safe collaboration commands visible in groups", () => {
15+for (const command of ["/help", "/btw side question", "/stop"]) {
16+expect(classifyCoreCommandForGroup(command).visibility).toBe("group");
17+}
18+});
19+20+it("keeps group-session controls callable but hidden from group menus", () => {
21+for (const command of ["/new", "/reset", "/name", "/compact"]) {
22+expect(classifyCoreCommandForGroup(command).visibility).toBe("hidden");
23+}
24+expect(classifyCoreCommandForGroup("/name", "safety").visibility).toBe("hidden");
25+});
26+27+it("marks sensitive core commands as private-only in groups", () => {
28+for (const command of [
29+"/config",
30+"/bash",
31+"/export-session",
32+"/diagnostics",
33+"/tts",
34+"/steer",
35+"/tell",
36+"/model",
37+"/models",
38+"/status",
39+"/verbose",
40+"/v",
41+"/config: show",
42+"/model@bot sonnet",
43+]) {
44+expect(classifyCoreCommandForGroup(command, "safety").visibility).toBe("private");
45+}
46+});
47+48+it("keeps omitted command level compatible with all mode", () => {
49+for (const command of ["/config", "/bash", "/new", "/status"]) {
50+expect(classifyCoreCommandForGroup(command).visibility).not.toBe("private");
51+}
52+});
53+54+it("allows every recognized core command in all mode", () => {
55+for (const command of ["/config", "/bash", "/new", "/name", "/status"]) {
56+expect(classifyCoreCommandForGroup(command, "all").visibility).not.toBe("private");
57+}
58+});
59+60+it("keeps urgent stop callable in strict mode", () => {
61+expect(classifyCoreCommandForGroup("/stop", "strict").visibility).toBe("group");
62+});
63+64+it("limits other core commands in strict mode", () => {
65+expect(classifyCoreCommandForGroup("/new", "strict").visibility).toBe("hidden");
66+expect(classifyCoreCommandForGroup("/reset", "strict").visibility).toBe("hidden");
67+expect(classifyCoreCommandForGroup("/name", "strict").visibility).toBe("private");
68+expect(classifyCoreCommandForGroup("/status", "strict").visibility).toBe("private");
69+expect(classifyCoreCommandForGroup("/config", "strict").visibility).toBe("private");
70+});
71+72+it("keeps strict mode fail-closed for unclassified slash commands", () => {
73+expect(classifyCoreCommandForGroup("/bot-dynamic", "strict").visibility).toBe("private");
74+expect(classifyCoreCommandForGroup("/unknown", "strict").visibility).toBe("private");
75+});
76+77+it("does not make plugin and unknown slash commands private in all mode", () => {
78+expect(classifyCoreCommandForGroup("/bot-help").visibility).not.toBe("private");
79+expect(classifyCoreCommandForGroup("/unknown").visibility).not.toBe("private");
80+});
81+82+it("leaves plugin and unknown slash commands to their existing dispatch path in safety mode", () => {
83+expect(classifyCoreCommandForGroup("/bot-help", "safety").visibility).toBe("unknown");
84+expect(classifyCoreCommandForGroup("/unknown", "safety").visibility).toBe("unknown");
85+});
86+});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。