diff --git a/src/security/audit.test.ts b/src/security/audit.test.ts index f22e9725745..8eb3ff71aba 100644 --- a/src/security/audit.test.ts +++ b/src/security/audit.test.ts @@ -1156,6 +1156,45 @@ description: test skill expect(finding?.severity).toBe("warn"); expect(finding?.detail).toContain("system.*"); expect(finding?.detail).toContain("system.runx"); + expect(finding?.detail).toContain("did you mean"); + expect(finding?.detail).toContain("system.run"); + }); + + it("suggests prefix-matching commands for unknown denyCommands entries", async () => { + const cfg: OpenClawConfig = { + gateway: { + nodes: { + denyCommands: ["system.run.prep"], + }, + }, + }; + + const res = await audit(cfg); + const finding = res.findings.find( + (f) => f.checkId === "gateway.nodes.deny_commands_ineffective", + ); + expect(finding?.severity).toBe("warn"); + expect(finding?.detail).toContain("system.run.prep"); + expect(finding?.detail).toContain("did you mean"); + expect(finding?.detail).toContain("system.run.prepare"); + }); + + it("keeps unknown denyCommands entries without suggestions when no close command exists", async () => { + const cfg: OpenClawConfig = { + gateway: { + nodes: { + denyCommands: ["zzzzzzzzzzzzzz"], + }, + }, + }; + + const res = await audit(cfg); + const finding = res.findings.find( + (f) => f.checkId === "gateway.nodes.deny_commands_ineffective", + ); + expect(finding?.severity).toBe("warn"); + expect(finding?.detail).toContain("zzzzzzzzzzzzzz"); + expect(finding?.detail).not.toContain("did you mean"); }); it("scores dangerous gateway.nodes.allowCommands by exposure", async () => {