From a8a18d27e9f540a899ea4747cf4561eba81a01d2 Mon Sep 17 00:00:00 2001 From: alexion Date: Mon, 14 Sep 2026 10:57:18 -0400 Subject: [PATCH] fix(pi): discover ancestor project resources --- .../coding-agent/src/core/package-manager.ts | 97 +++++++++---------- 1 file changed, 46 insertions(+), 51 deletions(-) diff --git a/third_party/pi/packages/coding-agent/src/core/package-manager.ts b/third_party/pi/packages/coding-agent/src/core/package-manager.ts index d65386c..dc57e09 100644 --- a/third_party/pi/packages/coding-agent/src/core/package-manager.ts +++ b/third_party/pi/packages/coding-agent/src/core/package-manager.ts @@ -459,14 +459,14 @@ function findGitRepoRoot(startDir: string): string | null { } } -function collectAncestorAgentsSkillDirs(startDir: string): string[] { - const skillDirs: string[] = []; +function collectAncestorConfigDirs(startDir: string, configDirName: string): string[] { + const configDirs: string[] = []; const resolvedStartDir = resolve(startDir); const gitRepoRoot = findGitRepoRoot(resolvedStartDir); let dir = resolvedStartDir; while (true) { - skillDirs.push(join(dir, ".agents", "skills")); + configDirs.push(join(dir, configDirName)); if (gitRepoRoot && dir === gitRepoRoot) { break; } @@ -477,7 +477,7 @@ function collectAncestorAgentsSkillDirs(startDir: string): string[] { dir = parent; } - return skillDirs; + return configDirs; } function collectAutoPromptEntries(dir: string): string[] { @@ -2388,16 +2388,13 @@ export class DefaultPackageManager implements PackageManager { prompts: join(globalBaseDir, "prompts"), themes: join(globalBaseDir, "themes"), }; - const projectDirs = { - extensions: join(projectBaseDir, "extensions"), - skills: join(projectBaseDir, "skills"), - prompts: join(projectBaseDir, "prompts"), - themes: join(projectBaseDir, "themes"), - }; const userAgentsSkillsDir = join(getHomeDir(), ".agents", "skills"); const projectTrusted = this.settingsManager.isProjectTrusted(); - const projectAgentsSkillDirs = projectTrusted - ? collectAncestorAgentsSkillDirs(this.cwd).filter((dir) => resolve(dir) !== resolve(userAgentsSkillsDir)) + const projectConfigDirs = projectTrusted + ? collectAncestorConfigDirs(this.cwd, CONFIG_DIR_NAME).filter((dir) => resolve(dir) !== resolve(globalBaseDir)) + : []; + const projectAgentsDirs = projectTrusted + ? collectAncestorConfigDirs(this.cwd, ".agents").filter((dir) => resolve(dir) !== resolve(dirname(userAgentsSkillsDir))) : []; const addResources = ( @@ -2414,56 +2411,54 @@ export class DefaultPackageManager implements PackageManager { } }; - if (projectTrusted) { - // Project extensions from .pi/ - addResources( - "extensions", - collectAutoExtensionEntries(projectDirs.extensions), - projectMetadata, - projectOverrides.extensions, - projectBaseDir, - ); - - // Project skills from .pi/ - addResources( - "skills", - collectAutoSkillEntries(projectDirs.skills, "pi"), - projectMetadata, - projectOverrides.skills, - projectBaseDir, - ); - } - - // Project skills from .agents/ (each with its own baseDir) - for (const agentsSkillsDir of projectAgentsSkillDirs) { - const agentsBaseDir = dirname(agentsSkillsDir); // the .agents directory - const agentsMetadata: PathMetadata = { + // Project resources from .pi/ in cwd and ancestors. + for (const configDir of projectConfigDirs) { + const configMetadata: PathMetadata = { ...projectMetadata, - baseDir: agentsBaseDir, + baseDir: configDir, }; addResources( - "skills", - collectAutoSkillEntries(agentsSkillsDir, "agents"), - agentsMetadata, - projectOverrides.skills, - agentsBaseDir, + "extensions", + collectAutoExtensionEntries(join(configDir, "extensions")), + configMetadata, + projectOverrides.extensions, + configDir, + ); + addResources( + "skills", + collectAutoSkillEntries(join(configDir, "skills"), "pi"), + configMetadata, + projectOverrides.skills, + configDir, ); - } - - if (projectTrusted) { addResources( "prompts", - collectAutoPromptEntries(projectDirs.prompts), - projectMetadata, + collectAutoPromptEntries(join(configDir, "prompts")), + configMetadata, projectOverrides.prompts, - projectBaseDir, + configDir, ); addResources( "themes", - collectAutoThemeEntries(projectDirs.themes), - projectMetadata, + collectAutoThemeEntries(join(configDir, "themes")), + configMetadata, projectOverrides.themes, - projectBaseDir, + configDir, + ); + } + + // Project skills from .agents/ in cwd and ancestors. + for (const agentsDir of projectAgentsDirs) { + const agentsMetadata: PathMetadata = { + ...projectMetadata, + baseDir: agentsDir, + }; + addResources( + "skills", + collectAutoSkillEntries(join(agentsDir, "skills"), "agents"), + agentsMetadata, + projectOverrides.skills, + agentsDir, ); }