Show skill autocomplete anywhere in prompts
This commit is contained in:
@@ -1,6 +1,11 @@
|
||||
import { describe, expect, it } from "vitest";
|
||||
|
||||
import { filterAndRankCommandAutocompleteEntries } from "./agent-command-autocomplete";
|
||||
import {
|
||||
applySlashCommandReplacement,
|
||||
filterAndRankCommandAutocompleteEntries,
|
||||
filterInlineSkillCommandEntries,
|
||||
findActiveSlashCommand,
|
||||
} from "./agent-command-autocomplete";
|
||||
|
||||
describe("filterAndRankCommandAutocompleteEntries", () => {
|
||||
const entries = [
|
||||
@@ -27,3 +32,81 @@ describe("filterAndRankCommandAutocompleteEntries", () => {
|
||||
expect(result.map((entry) => entry.command.name)).toEqual(["exit"]);
|
||||
});
|
||||
});
|
||||
|
||||
describe("findActiveSlashCommand", () => {
|
||||
it("detects a slash command token in the middle of the prompt", () => {
|
||||
const text = "use /tas before implementation";
|
||||
|
||||
expect(
|
||||
findActiveSlashCommand({
|
||||
text,
|
||||
cursorIndex: "use /tas".length,
|
||||
}),
|
||||
).toEqual({
|
||||
start: 4,
|
||||
end: "use /tas".length,
|
||||
query: "tas",
|
||||
position: "inline",
|
||||
});
|
||||
});
|
||||
|
||||
it("classifies a slash command token at the prompt start", () => {
|
||||
expect(
|
||||
findActiveSlashCommand({
|
||||
text: "/rew",
|
||||
cursorIndex: "/rew".length,
|
||||
}),
|
||||
).toEqual({
|
||||
start: 0,
|
||||
end: "/rew".length,
|
||||
query: "rew",
|
||||
position: "start",
|
||||
});
|
||||
});
|
||||
|
||||
it("returns null when the cursor is outside the slash token", () => {
|
||||
expect(
|
||||
findActiveSlashCommand({
|
||||
text: "use /taste now",
|
||||
cursorIndex: "use /taste now".length,
|
||||
}),
|
||||
).toBeNull();
|
||||
});
|
||||
|
||||
it("returns null for slash-delimited paths", () => {
|
||||
expect(
|
||||
findActiveSlashCommand({
|
||||
text: "read /tmp/project",
|
||||
cursorIndex: "read /tmp/project".length,
|
||||
}),
|
||||
).toBeNull();
|
||||
});
|
||||
});
|
||||
|
||||
describe("applySlashCommandReplacement", () => {
|
||||
it("replaces only the active slash token", () => {
|
||||
const text = "use /tas before implementation";
|
||||
|
||||
expect(
|
||||
applySlashCommandReplacement({
|
||||
text,
|
||||
command: { start: 4, end: "use /tas".length, query: "tas", position: "inline" },
|
||||
commandName: "taste",
|
||||
}),
|
||||
).toBe("use /taste before implementation");
|
||||
});
|
||||
});
|
||||
|
||||
describe("filterInlineSkillCommandEntries", () => {
|
||||
it("keeps provider skills and drops executable commands", () => {
|
||||
const entries = [
|
||||
{ source: "client" as const, command: { name: "clear", kind: "command" } },
|
||||
{ source: "provider" as const, command: { name: "compact", kind: "command" } },
|
||||
{ source: "provider" as const, command: { name: "taste", kind: "skill" } },
|
||||
];
|
||||
|
||||
expect(filterInlineSkillCommandEntries(entries).map((entry) => entry.command.name)).toEqual([
|
||||
"taste",
|
||||
]);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user