diff --git a/packages/coding-agent/CHANGELOG.md b/packages/coding-agent/CHANGELOG.md index b65ff1a6..30902977 100644 --- a/packages/coding-agent/CHANGELOG.md +++ b/packages/coding-agent/CHANGELOG.md @@ -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 diff --git a/packages/coding-agent/src/core/package-manager.ts b/packages/coding-agent/src/core/package-manager.ts index 43240821..48375820 100644 --- a/packages/coding-agent/src/core/package-manager.ts +++ b/packages/coding-agent/src/core/package-manager.ts @@ -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, diff --git a/packages/coding-agent/test/package-manager.test.ts b/packages/coding-agent/test/package-manager.test.ts index f427b339..91ec5955 100644 --- a/packages/coding-agent/test/package-manager.test.ts +++ b/packages/coding-agent/test/package-manager.test.ts @@ -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", () => {