mirror of
https://github.com/getcompanion-ai/co-mono.git
synced 2026-04-15 09:01:14 +00:00
fix(coding-agent): align auto-discovery with loader rules
This commit is contained in:
parent
b270e7b585
commit
585ce73be1
5 changed files with 139 additions and 63 deletions
|
|
@ -59,8 +59,9 @@ describe("DefaultPackageManager", () => {
|
|||
it("should resolve skill paths from settings", async () => {
|
||||
const skillDir = join(agentDir, "skills", "my-skill");
|
||||
mkdirSync(skillDir, { recursive: true });
|
||||
const skillFile = join(skillDir, "SKILL.md");
|
||||
writeFileSync(
|
||||
join(skillDir, "SKILL.md"),
|
||||
skillFile,
|
||||
`---
|
||||
name: test-skill
|
||||
description: A test skill
|
||||
|
|
@ -71,8 +72,8 @@ Content`,
|
|||
settingsManager.setSkillPaths(["skills"]);
|
||||
|
||||
const result = await packageManager.resolve();
|
||||
// Skills with SKILL.md are returned as directory paths
|
||||
expect(result.skills.some((r) => r.path === skillDir && r.enabled)).toBe(true);
|
||||
// Skills with SKILL.md are returned as file paths
|
||||
expect(result.skills.some((r) => r.path === skillFile && r.enabled)).toBe(true);
|
||||
});
|
||||
|
||||
it("should resolve project paths relative to .pi", async () => {
|
||||
|
|
@ -144,8 +145,10 @@ Content`,
|
|||
|
||||
const result = await packageManager.resolveExtensionSources([pkgDir]);
|
||||
expect(result.extensions.some((r) => r.path === join(pkgDir, "src", "index.ts") && r.enabled)).toBe(true);
|
||||
// Skills with SKILL.md are returned as directory paths
|
||||
expect(result.skills.some((r) => r.path === join(pkgDir, "skills", "my-skill") && r.enabled)).toBe(true);
|
||||
// Skills with SKILL.md are returned as file paths
|
||||
expect(result.skills.some((r) => r.path === join(pkgDir, "skills", "my-skill", "SKILL.md") && r.enabled)).toBe(
|
||||
true,
|
||||
);
|
||||
});
|
||||
|
||||
it("should handle directories with auto-discovery layout", async () => {
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ import { tmpdir } from "node:os";
|
|||
import { join } from "node:path";
|
||||
import { afterEach, beforeEach, describe, expect, it } from "vitest";
|
||||
import { DefaultResourceLoader } from "../src/core/resource-loader.js";
|
||||
import { SettingsManager } from "../src/core/settings-manager.js";
|
||||
import type { Skill } from "../src/core/skills.js";
|
||||
|
||||
describe("DefaultResourceLoader", () => {
|
||||
|
|
@ -51,6 +52,27 @@ Skill content here.`,
|
|||
expect(skills.some((s) => s.name === "test-skill")).toBe(true);
|
||||
});
|
||||
|
||||
it("should ignore extra markdown files in auto-discovered skill dirs", async () => {
|
||||
const skillDir = join(agentDir, "skills", "pi-skills", "browser-tools");
|
||||
mkdirSync(skillDir, { recursive: true });
|
||||
writeFileSync(
|
||||
join(skillDir, "SKILL.md"),
|
||||
`---
|
||||
name: browser-tools
|
||||
description: Browser tools
|
||||
---
|
||||
Skill content here.`,
|
||||
);
|
||||
writeFileSync(join(skillDir, "EFFICIENCY.md"), "No frontmatter here");
|
||||
|
||||
const loader = new DefaultResourceLoader({ cwd, agentDir });
|
||||
await loader.reload();
|
||||
|
||||
const { skills, diagnostics } = loader.getSkills();
|
||||
expect(skills.some((s) => s.name === "browser-tools")).toBe(true);
|
||||
expect(diagnostics.some((d) => d.path?.endsWith("EFFICIENCY.md"))).toBe(false);
|
||||
});
|
||||
|
||||
it("should discover prompts from agentDir", async () => {
|
||||
const promptsDir = join(agentDir, "prompts");
|
||||
mkdirSync(promptsDir, { recursive: true });
|
||||
|
|
@ -69,6 +91,50 @@ Prompt content.`,
|
|||
expect(prompts.some((p) => p.name === "test-prompt")).toBe(true);
|
||||
});
|
||||
|
||||
it("should honor overrides for auto-discovered resources", async () => {
|
||||
const settingsManager = SettingsManager.inMemory();
|
||||
settingsManager.setExtensionPaths(["-extensions/disabled.ts"]);
|
||||
settingsManager.setSkillPaths(["-skills/skip-skill"]);
|
||||
settingsManager.setPromptTemplatePaths(["-prompts/skip.md"]);
|
||||
settingsManager.setThemePaths(["-themes/skip.json"]);
|
||||
|
||||
const extensionsDir = join(agentDir, "extensions");
|
||||
mkdirSync(extensionsDir, { recursive: true });
|
||||
writeFileSync(join(extensionsDir, "disabled.ts"), "export default function() {}");
|
||||
|
||||
const skillDir = join(agentDir, "skills", "skip-skill");
|
||||
mkdirSync(skillDir, { recursive: true });
|
||||
writeFileSync(
|
||||
join(skillDir, "SKILL.md"),
|
||||
`---
|
||||
name: skip-skill
|
||||
description: Skip me
|
||||
---
|
||||
Content`,
|
||||
);
|
||||
|
||||
const promptsDir = join(agentDir, "prompts");
|
||||
mkdirSync(promptsDir, { recursive: true });
|
||||
writeFileSync(join(promptsDir, "skip.md"), "Skip prompt");
|
||||
|
||||
const themesDir = join(agentDir, "themes");
|
||||
mkdirSync(themesDir, { recursive: true });
|
||||
writeFileSync(join(themesDir, "skip.json"), "{}");
|
||||
|
||||
const loader = new DefaultResourceLoader({ cwd, agentDir, settingsManager });
|
||||
await loader.reload();
|
||||
|
||||
const { extensions } = loader.getExtensions();
|
||||
const { skills } = loader.getSkills();
|
||||
const { prompts } = loader.getPrompts();
|
||||
const { themes } = loader.getThemes();
|
||||
|
||||
expect(extensions.some((e) => e.path.endsWith("disabled.ts"))).toBe(false);
|
||||
expect(skills.some((s) => s.name === "skip-skill")).toBe(false);
|
||||
expect(prompts.some((p) => p.name === "skip")).toBe(false);
|
||||
expect(themes.some((t) => t.sourcePath?.endsWith("skip.json"))).toBe(false);
|
||||
});
|
||||
|
||||
it("should discover AGENTS.md context files", async () => {
|
||||
writeFileSync(join(cwd, "AGENTS.md"), "# Project Guidelines\n\nBe helpful.");
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue