tests / activation.test.ts
import { describe, expect, it } from "vitest";
import { isValidSkillName, parseActivation } from "../src/activation";
describe("isValidSkillName", () => {
it("accepts names that parseActivation can match", () => {
expect(isValidSkillName("pdf")).toBe(true);
expect(isValidSkillName("typesafe-ai_2")).toBe(true);
});
it("rejects names with spaces, dots or a leading dash", () => {
expect(isValidSkillName("PDF Tools")).toBe(false);
expect(isValidSkillName("my.skill")).toBe(false);
expect(isValidSkillName("-bad")).toBe(false);
expect(isValidSkillName("")).toBe(false);
});
});
describe("parseActivation", () => {
it("parses /name followed by a task", () => {
expect(parseActivation("/typesafe-ai build a router")).toEqual({ name: "typesafe-ai", rest: "build a router" });
});
it("parses $name as well", () => {
expect(parseActivation("$pdf merge these")).toEqual({ name: "pdf", rest: "merge these" });
});
it("returns empty rest for a bare /name", () => {
expect(parseActivation("/pdf")).toEqual({ name: "pdf", rest: "" });
expect(parseActivation("/pdf ")).toEqual({ name: "pdf", rest: "" });
});
it("tolerates leading whitespace and multi-line rest", () => {
expect(parseActivation(" /pdf\nmerge a.pdf\nand b.pdf")).toEqual({ name: "pdf", rest: "merge a.pdf\nand b.pdf" });
});
it("ignores a slash or dollar mid-sentence", () => {
expect(parseActivation("open /etc/hosts")).toBeNull();
expect(parseActivation("costs $5")).toBeNull();
});
it("rejects names with invalid characters or paths", () => {
expect(parseActivation("/etc/hosts")).toBeNull();
expect(parseActivation("/-bad")).toBeNull();
expect(parseActivation("/")).toBeNull();
});
});
tests / activation.test.ts
import { describe, expect, it } from "vitest";
import { isValidSkillName, parseActivation } from "../src/activation";
describe("isValidSkillName", () => {
it("accepts names that parseActivation can match", () => {
expect(isValidSkillName("pdf")).toBe(true);
expect(isValidSkillName("typesafe-ai_2")).toBe(true);
});
it("rejects names with spaces, dots or a leading dash", () => {
expect(isValidSkillName("PDF Tools")).toBe(false);
expect(isValidSkillName("my.skill")).toBe(false);
expect(isValidSkillName("-bad")).toBe(false);
expect(isValidSkillName("")).toBe(false);
});
});
describe("parseActivation", () => {
it("parses /name followed by a task", () => {
expect(parseActivation("/typesafe-ai build a router")).toEqual({ name: "typesafe-ai", rest: "build a router" });
});
it("parses $name as well", () => {
expect(parseActivation("$pdf merge these")).toEqual({ name: "pdf", rest: "merge these" });
});
it("returns empty rest for a bare /name", () => {
expect(parseActivation("/pdf")).toEqual({ name: "pdf", rest: "" });
expect(parseActivation("/pdf ")).toEqual({ name: "pdf", rest: "" });
});
it("tolerates leading whitespace and multi-line rest", () => {
expect(parseActivation(" /pdf\nmerge a.pdf\nand b.pdf")).toEqual({ name: "pdf", rest: "merge a.pdf\nand b.pdf" });
});
it("ignores a slash or dollar mid-sentence", () => {
expect(parseActivation("open /etc/hosts")).toBeNull();
expect(parseActivation("costs $5")).toBeNull();
});
it("rejects names with invalid characters or paths", () => {
expect(parseActivation("/etc/hosts")).toBeNull();
expect(parseActivation("/-bad")).toBeNull();
expect(parseActivation("/")).toBeNull();
});
});