Merge pull request #4299 from aliou/fix/resource-location-in-config-tui
fix(coding-agent): preserve .agents provenance in skill metadata
This commit is contained in:
@@ -274,6 +274,94 @@ Content`,
|
||||
});
|
||||
});
|
||||
|
||||
describe("auto-discovered skill metadata", () => {
|
||||
it("should use the agent dir as baseDir for user .pi/agent skills", async () => {
|
||||
const skillPath = join(agentDir, "skills", "user-pi", "SKILL.md");
|
||||
mkdirSync(join(agentDir, "skills", "user-pi"), { recursive: true });
|
||||
writeFileSync(skillPath, "---\nname: user-pi\ndescription: user pi\n---\n");
|
||||
|
||||
const result = await packageManager.resolve();
|
||||
const skill = result.skills.find((r) => r.path === skillPath);
|
||||
|
||||
expect(skill?.metadata.source).toBe("auto");
|
||||
expect(skill?.metadata.scope).toBe("user");
|
||||
expect(skill?.metadata.baseDir).toBe(agentDir);
|
||||
});
|
||||
|
||||
it("should use the project .pi dir as baseDir for project .pi skills", async () => {
|
||||
const projectBaseDir = join(tempDir, ".pi");
|
||||
const skillPath = join(projectBaseDir, "skills", "project-pi", "SKILL.md");
|
||||
mkdirSync(join(projectBaseDir, "skills", "project-pi"), { recursive: true });
|
||||
writeFileSync(skillPath, "---\nname: project-pi\ndescription: project pi\n---\n");
|
||||
|
||||
const result = await packageManager.resolve();
|
||||
const skill = result.skills.find((r) => r.path === skillPath);
|
||||
|
||||
expect(skill?.metadata.source).toBe("auto");
|
||||
expect(skill?.metadata.scope).toBe("project");
|
||||
expect(skill?.metadata.baseDir).toBe(projectBaseDir);
|
||||
});
|
||||
|
||||
it("should use ~/.agents as baseDir for user .agents skills", async () => {
|
||||
const previousHome = process.env.HOME;
|
||||
process.env.HOME = tempDir;
|
||||
|
||||
try {
|
||||
const agentsBaseDir = join(tempDir, ".agents");
|
||||
const skillPath = join(agentsBaseDir, "skills", "user-agents", "SKILL.md");
|
||||
mkdirSync(join(agentsBaseDir, "skills", "user-agents"), { recursive: true });
|
||||
writeFileSync(skillPath, "---\nname: user-agents\ndescription: user agents\n---\n");
|
||||
|
||||
const result = await packageManager.resolve();
|
||||
const skill = result.skills.find((r) => r.path === skillPath);
|
||||
|
||||
expect(skill?.metadata.source).toBe("auto");
|
||||
expect(skill?.metadata.scope).toBe("user");
|
||||
expect(skill?.metadata.baseDir).toBe(agentsBaseDir);
|
||||
} finally {
|
||||
if (previousHome === undefined) {
|
||||
delete process.env.HOME;
|
||||
} else {
|
||||
process.env.HOME = previousHome;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
it("should use each project .agents dir as baseDir for project .agents skills", async () => {
|
||||
const repoRoot = join(tempDir, "repo");
|
||||
const nestedCwd = join(repoRoot, "packages", "feature");
|
||||
mkdirSync(nestedCwd, { recursive: true });
|
||||
mkdirSync(join(repoRoot, ".git"), { recursive: true });
|
||||
|
||||
const repoAgentsBaseDir = join(repoRoot, ".agents");
|
||||
const repoSkill = join(repoAgentsBaseDir, "skills", "repo", "SKILL.md");
|
||||
mkdirSync(join(repoAgentsBaseDir, "skills", "repo"), { recursive: true });
|
||||
writeFileSync(repoSkill, "---\nname: repo\ndescription: repo\n---\n");
|
||||
|
||||
const packageAgentsBaseDir = join(repoRoot, "packages", ".agents");
|
||||
const packageSkill = join(packageAgentsBaseDir, "skills", "package", "SKILL.md");
|
||||
mkdirSync(join(packageAgentsBaseDir, "skills", "package"), { recursive: true });
|
||||
writeFileSync(packageSkill, "---\nname: package\ndescription: package\n---\n");
|
||||
|
||||
const pm = new DefaultPackageManager({
|
||||
cwd: nestedCwd,
|
||||
agentDir,
|
||||
settingsManager,
|
||||
});
|
||||
|
||||
const result = await pm.resolve();
|
||||
const resolvedRepoSkill = result.skills.find((r) => r.path === repoSkill);
|
||||
const resolvedPackageSkill = result.skills.find((r) => r.path === packageSkill);
|
||||
|
||||
expect(resolvedRepoSkill?.metadata.source).toBe("auto");
|
||||
expect(resolvedRepoSkill?.metadata.scope).toBe("project");
|
||||
expect(resolvedRepoSkill?.metadata.baseDir).toBe(repoAgentsBaseDir);
|
||||
expect(resolvedPackageSkill?.metadata.source).toBe("auto");
|
||||
expect(resolvedPackageSkill?.metadata.scope).toBe("project");
|
||||
expect(resolvedPackageSkill?.metadata.baseDir).toBe(packageAgentsBaseDir);
|
||||
});
|
||||
});
|
||||
|
||||
describe(".agents/skills auto-discovery", () => {
|
||||
it("should scan .agents/skills from cwd up to git repo root", async () => {
|
||||
const repoRoot = join(tempDir, "repo");
|
||||
|
||||
Reference in New Issue
Block a user