Files
tutti/packages/agent/gui/agent-gui/agentGuiNode/model/agentComposerTriggerQueries.spec.ts
agent-radar 2ed3415fb7
Publish Claude Code Binaries / Stage and publish binaries (push) Canceled after 0s
Publish Tutti App Runtime / Build darwin-arm64 (push) Canceled after 0s
Publish Tutti App Runtime / Build darwin-amd64 (push) Canceled after 0s
Publish Tutti App Runtime / Build linux-amd64 (push) Canceled after 0s
Publish Tutti App Runtime / Build windows-amd64 (push) Canceled after 0s
Sync Tutti Agent Skills / sync (push) Canceled after 0s
Windows Agent Adapters / Test Windows agent adapters (push) Canceled after 0s
Windows Daemon Adapters / Test Windows daemon adapters (push) Canceled after 0s
Publish Tutti App Runtime / Publish runtime catalog (push) Canceled after 0s
源码快照 @ 2026-09-01 (source-only, 剔除非源码素材)
2026-09-01 20:17:27 +08:00

117 lines
3.5 KiB
TypeScript

import { describe, expect, it } from "vitest";
import {
draftForProviderSkillTrigger,
filterProviderSkillsForTrigger,
getAgentComposerTriggerQueryMatch,
getPromptStartSlashCommandQuery
} from "./agentComposerTriggerQueries";
describe("agentComposerTriggerQueries", () => {
it("matches prompt-start slash command queries through rich text trigger config", () => {
expect(getPromptStartSlashCommandQuery("/")).toBe("");
expect(getPromptStartSlashCommandQuery("/we")).toBe("we");
expect(getPromptStartSlashCommandQuery(" /we")).toBe("we");
expect(getPromptStartSlashCommandQuery("/web query")).toBeNull();
expect(getPromptStartSlashCommandQuery("hello/web")).toBeNull();
expect(getPromptStartSlashCommandQuery("hello /re")).toBeNull();
expect(getPromptStartSlashCommandQuery("hello\n/re")).toBeNull();
expect(getPromptStartSlashCommandQuery("`/re`")).toBeNull();
});
it("matches provider skill triggers at whitespace boundaries", () => {
expect(getAgentComposerTriggerQueryMatch("$ar")).toEqual({
end: 3,
prefix: "$",
query: "ar",
start: 0
});
expect(getAgentComposerTriggerQueryMatch("please use $ar")).toEqual({
end: 14,
prefix: "$",
query: "ar",
start: 11
});
expect(getAgentComposerTriggerQueryMatch("please$ar")).toBeNull();
expect(getAgentComposerTriggerQueryMatch("please use /ar")).toEqual({
end: 14,
prefix: "/",
query: "ar",
start: 11
});
});
it("replaces the active skill token in the draft", () => {
const match = getAgentComposerTriggerQueryMatch("please use $ar");
expect(
draftForProviderSkillTrigger({
skill: {
name: "architecture-review",
trigger: "$architecture-review",
sourceKind: "project"
},
currentDraft: "please use $ar",
match
})
).toBe("please use $architecture-review ");
});
it("uses the active prefix when inserting a provider skill", () => {
const codexSlashMatch = getAgentComposerTriggerQueryMatch("/ar");
expect(
draftForProviderSkillTrigger({
skill: {
name: "architecture-review",
trigger: "$architecture-review",
sourceKind: "project"
},
currentDraft: "/ar",
match: codexSlashMatch
})
).toBe("/architecture-review ");
const claudeDollarMatch = getAgentComposerTriggerQueryMatch("$front");
expect(
draftForProviderSkillTrigger({
skill: {
name: "frontend-design",
trigger: "/product-design:frontend-design",
sourceKind: "plugin"
},
currentDraft: "$front",
match: claudeDollarMatch
})
).toBe("$product-design:frontend-design ");
});
it("filters provider skills through slash and dollar aliases", () => {
expect(
filterProviderSkillsForTrigger({
skills: [
{
name: "architecture-review",
trigger: "$architecture-review",
sourceKind: "project"
}
],
query: "arch",
triggerPrefix: "/"
}).map((skill) => skill.name)
).toEqual(["architecture-review"]);
expect(
filterProviderSkillsForTrigger({
skills: [
{
name: "frontend-design",
trigger: "/product-design:frontend-design",
sourceKind: "plugin"
}
],
query: "product",
triggerPrefix: "$"
}).map((skill) => skill.name)
).toEqual(["frontend-design"]);
});
});