summaryrefslogtreecommitdiffhomepage
path: root/packages/skills/src/pure.test.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/skills/src/pure.test.ts')
-rw-r--r--packages/skills/src/pure.test.ts300
1 files changed, 150 insertions, 150 deletions
diff --git a/packages/skills/src/pure.test.ts b/packages/skills/src/pure.test.ts
index a8c6af5..1fdadfd 100644
--- a/packages/skills/src/pure.test.ts
+++ b/packages/skills/src/pure.test.ts
@@ -1,174 +1,174 @@
import { describe, expect, it } from "vitest";
import {
- isPathWithinDir,
- isValidSkillName,
- mergeCatalog,
- parseSkillMeta,
- renderDescription,
- stripLoadedBody,
+ isPathWithinDir,
+ isValidSkillName,
+ mergeCatalog,
+ parseSkillMeta,
+ renderDescription,
+ stripLoadedBody,
} from "./pure.js";
describe("parseSkillMeta", () => {
- it("extracts summary when line 2 is ---", () => {
- const content = "Use this for web searches\n---\nBody content here";
- const result = parseSkillMeta(content);
- expect(result.hasMeta).toBe(true);
- expect(result.summary).toBe("Use this for web searches");
- });
-
- it("extracts summary with trailing whitespace on separator", () => {
- const content = "Summary text\n--- \nBody";
- const result = parseSkillMeta(content);
- expect(result.hasMeta).toBe(true);
- expect(result.summary).toBe("Summary text");
- });
-
- it("reports no metadata when line 2 is not ---", () => {
- const content = "Some content\nNot a separator\nBody";
- const result = parseSkillMeta(content);
- expect(result.hasMeta).toBe(false);
- expect(result.summary).toBeUndefined();
- });
-
- it("reports no metadata for single-line content", () => {
- const content = "Only one line";
- const result = parseSkillMeta(content);
- expect(result.hasMeta).toBe(false);
- });
-
- it("reports no metadata for empty content", () => {
- const result = parseSkillMeta("");
- expect(result.hasMeta).toBe(false);
- });
-
- it("treats empty summary as undefined", () => {
- const content = "\n---\nBody";
- const result = parseSkillMeta(content);
- expect(result.hasMeta).toBe(true);
- expect(result.summary).toBeUndefined();
- });
+ it("extracts summary when line 2 is ---", () => {
+ const content = "Use this for web searches\n---\nBody content here";
+ const result = parseSkillMeta(content);
+ expect(result.hasMeta).toBe(true);
+ expect(result.summary).toBe("Use this for web searches");
+ });
+
+ it("extracts summary with trailing whitespace on separator", () => {
+ const content = "Summary text\n--- \nBody";
+ const result = parseSkillMeta(content);
+ expect(result.hasMeta).toBe(true);
+ expect(result.summary).toBe("Summary text");
+ });
+
+ it("reports no metadata when line 2 is not ---", () => {
+ const content = "Some content\nNot a separator\nBody";
+ const result = parseSkillMeta(content);
+ expect(result.hasMeta).toBe(false);
+ expect(result.summary).toBeUndefined();
+ });
+
+ it("reports no metadata for single-line content", () => {
+ const content = "Only one line";
+ const result = parseSkillMeta(content);
+ expect(result.hasMeta).toBe(false);
+ });
+
+ it("reports no metadata for empty content", () => {
+ const result = parseSkillMeta("");
+ expect(result.hasMeta).toBe(false);
+ });
+
+ it("treats empty summary as undefined", () => {
+ const content = "\n---\nBody";
+ const result = parseSkillMeta(content);
+ expect(result.hasMeta).toBe(true);
+ expect(result.summary).toBeUndefined();
+ });
});
describe("stripLoadedBody", () => {
- it("removes the first two lines when metadata is present", () => {
- const content = "Summary\n---\nLine 3\nLine 4";
- const result = stripLoadedBody(content, true);
- expect(result).toBe("Line 3\nLine 4");
- });
-
- it("returns the whole file when malformed", () => {
- const content = "No metadata here\nJust content";
- const result = stripLoadedBody(content, false);
- expect(result).toBe("No metadata here\nJust content");
- });
-
- it("handles file with only metadata and no body", () => {
- const content = "Summary\n---\n";
- const result = stripLoadedBody(content, true);
- expect(result).toBe("");
- });
+ it("removes the first two lines when metadata is present", () => {
+ const content = "Summary\n---\nLine 3\nLine 4";
+ const result = stripLoadedBody(content, true);
+ expect(result).toBe("Line 3\nLine 4");
+ });
+
+ it("returns the whole file when malformed", () => {
+ const content = "No metadata here\nJust content";
+ const result = stripLoadedBody(content, false);
+ expect(result).toBe("No metadata here\nJust content");
+ });
+
+ it("handles file with only metadata and no body", () => {
+ const content = "Summary\n---\n";
+ const result = stripLoadedBody(content, true);
+ expect(result).toBe("");
+ });
});
describe("mergeCatalog", () => {
- it("merges disjoint entries", () => {
- const home = [{ name: "a" }, { name: "b" }];
- const cwd = [{ name: "c" }];
- const result = mergeCatalog(home, cwd);
- expect(result.map((e) => e.name)).toEqual(["a", "b", "c"]);
- });
-
- it("cwd skill shadows home skill of the same name", () => {
- const home = [{ name: "shared", summary: "home summary" }];
- const cwd = [{ name: "shared", summary: "cwd summary" }];
- const result = mergeCatalog(home, cwd);
- expect(result).toHaveLength(1);
- expect(result[0]?.summary).toBe("cwd summary");
- });
-
- it("sorts by name", () => {
- const home = [{ name: "z" }, { name: "a" }];
- const cwd = [{ name: "m" }];
- const result = mergeCatalog(home, cwd);
- expect(result.map((e) => e.name)).toEqual(["a", "m", "z"]);
- });
-
- it("handles empty inputs", () => {
- expect(mergeCatalog([], [])).toEqual([]);
- });
+ it("merges disjoint entries", () => {
+ const home = [{ name: "a" }, { name: "b" }];
+ const cwd = [{ name: "c" }];
+ const result = mergeCatalog(home, cwd);
+ expect(result.map((e) => e.name)).toEqual(["a", "b", "c"]);
+ });
+
+ it("cwd skill shadows home skill of the same name", () => {
+ const home = [{ name: "shared", summary: "home summary" }];
+ const cwd = [{ name: "shared", summary: "cwd summary" }];
+ const result = mergeCatalog(home, cwd);
+ expect(result).toHaveLength(1);
+ expect(result[0]?.summary).toBe("cwd summary");
+ });
+
+ it("sorts by name", () => {
+ const home = [{ name: "z" }, { name: "a" }];
+ const cwd = [{ name: "m" }];
+ const result = mergeCatalog(home, cwd);
+ expect(result.map((e) => e.name)).toEqual(["a", "m", "z"]);
+ });
+
+ it("handles empty inputs", () => {
+ expect(mergeCatalog([], [])).toEqual([]);
+ });
});
describe("renderDescription", () => {
- it("lists all skills by name and appends summaries only for valid ones", () => {
- const catalog = [
- { name: "web-search", summary: "Use for web searches" },
- { name: "malformed-skill" },
- ];
- const result = renderDescription(catalog);
- expect(result).toBe(
- "Load a skill by name. Available skills:\n- web-search: Use for web searches\n- malformed-skill",
- );
- });
-
- it("returns a plain message when no skills are available", () => {
- const result = renderDescription([]);
- expect(result).toBe("Load a skill by name. No skills are currently available.");
- });
-
- it("lists skills with summaries and without", () => {
- const catalog = [
- { name: "alpha", summary: "First skill" },
- { name: "beta" },
- { name: "gamma", summary: "Third skill" },
- ];
- const result = renderDescription(catalog);
- expect(result).toContain("- alpha: First skill");
- expect(result).toContain("- beta");
- expect(result).toContain("- gamma: Third skill");
- });
+ it("lists all skills by name and appends summaries only for valid ones", () => {
+ const catalog = [
+ { name: "web-search", summary: "Use for web searches" },
+ { name: "malformed-skill" },
+ ];
+ const result = renderDescription(catalog);
+ expect(result).toBe(
+ "Load a skill by name. Available skills:\n- web-search: Use for web searches\n- malformed-skill",
+ );
+ });
+
+ it("returns a plain message when no skills are available", () => {
+ const result = renderDescription([]);
+ expect(result).toBe("Load a skill by name. No skills are currently available.");
+ });
+
+ it("lists skills with summaries and without", () => {
+ const catalog = [
+ { name: "alpha", summary: "First skill" },
+ { name: "beta" },
+ { name: "gamma", summary: "Third skill" },
+ ];
+ const result = renderDescription(catalog);
+ expect(result).toContain("- alpha: First skill");
+ expect(result).toContain("- beta");
+ expect(result).toContain("- gamma: Third skill");
+ });
});
describe("isValidSkillName", () => {
- it("accepts a bare skill name", () => {
- expect(isValidSkillName("web-search")).toBe(true);
- });
-
- it("rejects a name containing /", () => {
- expect(isValidSkillName("../escape")).toBe(false);
- });
-
- it("rejects a name containing \\", () => {
- expect(isValidSkillName("path\\name")).toBe(false);
- });
-
- it("rejects a name containing ..", () => {
- expect(isValidSkillName("skill..evil")).toBe(false);
- });
-
- it("rejects an empty string", () => {
- expect(isValidSkillName("")).toBe(false);
- });
-
- it("rejects a non-string value", () => {
- expect(isValidSkillName(123)).toBe(false);
- expect(isValidSkillName(null)).toBe(false);
- expect(isValidSkillName(undefined)).toBe(false);
- });
+ it("accepts a bare skill name", () => {
+ expect(isValidSkillName("web-search")).toBe(true);
+ });
+
+ it("rejects a name containing /", () => {
+ expect(isValidSkillName("../escape")).toBe(false);
+ });
+
+ it("rejects a name containing \\", () => {
+ expect(isValidSkillName("path\\name")).toBe(false);
+ });
+
+ it("rejects a name containing ..", () => {
+ expect(isValidSkillName("skill..evil")).toBe(false);
+ });
+
+ it("rejects an empty string", () => {
+ expect(isValidSkillName("")).toBe(false);
+ });
+
+ it("rejects a non-string value", () => {
+ expect(isValidSkillName(123)).toBe(false);
+ expect(isValidSkillName(null)).toBe(false);
+ expect(isValidSkillName(undefined)).toBe(false);
+ });
});
describe("isPathWithinDir", () => {
- it("accepts a path within the directory", () => {
- expect(isPathWithinDir("/tmp/base/file.txt", "/tmp/base")).toBe(true);
- });
+ it("accepts a path within the directory", () => {
+ expect(isPathWithinDir("/tmp/base/file.txt", "/tmp/base")).toBe(true);
+ });
- it("accepts the directory itself", () => {
- expect(isPathWithinDir("/tmp/base", "/tmp/base")).toBe(true);
- });
+ it("accepts the directory itself", () => {
+ expect(isPathWithinDir("/tmp/base", "/tmp/base")).toBe(true);
+ });
- it("rejects a path outside the directory", () => {
- expect(isPathWithinDir("/tmp/other/file.txt", "/tmp/base")).toBe(false);
- });
+ it("rejects a path outside the directory", () => {
+ expect(isPathWithinDir("/tmp/other/file.txt", "/tmp/base")).toBe(false);
+ });
- it("rejects a prefix attack", () => {
- expect(isPathWithinDir("/tmp/base-evil/file.txt", "/tmp/base")).toBe(false);
- });
+ it("rejects a prefix attack", () => {
+ expect(isPathWithinDir("/tmp/base-evil/file.txt", "/tmp/base")).toBe(false);
+ });
});