fix(coding-agent): keep ~/.agents skills user-scoped\n\ncloses #1915

This commit is contained in:
Mario Zechner
2026-03-07 12:21:54 +01:00
parent c99b9940e1
commit e80692bcb6
3 changed files with 43 additions and 1 deletions

View File

@@ -2,6 +2,10 @@
## [Unreleased]
### Fixed
- Fixed `pi config` misclassifying `~/.agents/skills` as project-scoped in non-git directories under `$HOME`, so toggling those skills no longer writes project overrides to `.pi/settings.json` ([#1915](https://github.com/badlogic/pi-mono/issues/1915))
## [0.56.3] - 2026-03-06
### New Features

View File

@@ -1607,7 +1607,9 @@ export class DefaultPackageManager implements PackageManager {
themes: join(projectBaseDir, "themes"),
};
const userAgentsSkillsDir = join(homedir(), ".agents", "skills");
const projectAgentsSkillDirs = collectAncestorAgentsSkillDirs(this.cwd);
const projectAgentsSkillDirs = collectAncestorAgentsSkillDirs(this.cwd).filter(
(dir) => resolve(dir) !== resolve(userAgentsSkillsDir),
);
const addResources = (
resourceType: ResourceType,

View File

@@ -213,6 +213,42 @@ Content`,
expect(result.skills.some((r) => r.path === rootSkill && r.enabled)).toBe(true);
expect(result.skills.some((r) => r.path === middleSkill && r.enabled)).toBe(true);
});
it("should keep ~/.agents/skills user-scoped when cwd is under home in a non-git directory", async () => {
const previousHome = process.env.HOME;
process.env.HOME = tempDir;
try {
const cwd = join(tempDir, "scratch", "nested");
const localAgentDir = join(tempDir, ".pi", "agent");
const localSettingsManager = SettingsManager.inMemory();
mkdirSync(cwd, { recursive: true });
mkdirSync(localAgentDir, { recursive: true });
const homeSkill = join(tempDir, ".agents", "skills", "home-skill", "SKILL.md");
mkdirSync(join(tempDir, ".agents", "skills", "home-skill"), { recursive: true });
writeFileSync(homeSkill, "---\nname: home-skill\ndescription: home\n---\n");
const pm = new DefaultPackageManager({
cwd,
agentDir: localAgentDir,
settingsManager: localSettingsManager,
});
const result = await pm.resolve();
const matchingSkills = result.skills.filter((r) => r.path === homeSkill);
expect(matchingSkills).toHaveLength(1);
expect(matchingSkills[0]?.enabled).toBe(true);
expect(matchingSkills[0]?.metadata.scope).toBe("user");
expect(matchingSkills[0]?.metadata.source).toBe("auto");
} finally {
if (previousHome === undefined) {
delete process.env.HOME;
} else {
process.env.HOME = previousHome;
}
}
});
});
describe("ignore files", () => {