From 9af5922fa8b9ad09462d2ede8ec086c0f4d6ca91 Mon Sep 17 00:00:00 2001 From: William Thorsen Date: Tue, 16 Jun 2026 11:39:49 -0700 Subject: [PATCH] agents|refactor: Rename PlatformConfig dir-name fields to *DirName Renames the directory-name fields on the platform configuration so their names no longer collide with the resolved absolute paths derived from them. The field name alone now distinguishes a bare directory name from a fully-resolved path, and the manual alias that existed only to work around the collision is removed. --- packages/agents/src/commands/install.ts | 7 +++---- .../agents/src/lib/__tests__/platform.test.ts | 14 ++++++++------ packages/agents/src/lib/platform.ts | 18 +++++++++--------- packages/agents/src/lib/types.ts | 12 ++++++------ 4 files changed, 26 insertions(+), 25 deletions(-) diff --git a/packages/agents/src/commands/install.ts b/packages/agents/src/commands/install.ts index 864f2d7c..04d16554 100644 --- a/packages/agents/src/commands/install.ts +++ b/packages/agents/src/commands/install.ts @@ -88,7 +88,7 @@ export async function installCommand( const toolMapping = loadToolMapping(overlayYaml); // Install skills (shared + platform-specific) - const skillsPrefix = `${platformConfig.homeDir}/${platformConfig.skillsDir}`; + const skillsPrefix = `${platformConfig.homeDir}/${platformConfig.skillsDirName}`; const skillEntries = await installSkills( contentDir, paths.skillsDir, @@ -420,7 +420,6 @@ async function installSubagents( const platformConfig = PLATFORMS[platformId]; const dirEntries = await readdir(subagentsSrcDir); - const subagentsDirName = platformConfig.subagentsDir; const entries: Array = []; for (const entry of dirEntries) { @@ -430,7 +429,7 @@ async function installSubagents( const srcPath = path.join(subagentsSrcDir, entry); const destPath = path.join(platformPaths.subagentsDir, entry); - const relativePath = `${subagentsDirName}/${entry}`; + const relativePath = `${platformConfig.subagentsDirName}/${entry}`; // Resolve include directives at source-tree level. Run before the dry-run gate so missing targets, cycles, and // out-of-tree references surface even when no files are written. Mirrors the ordering in installPlatformGuidance. @@ -652,7 +651,7 @@ async function installScripts( continue; } const destPath = path.join(scriptsDestDir, entry); - const relativePath = `${platformConfig.scriptsDir}/${entry}`; + const relativePath = `${platformConfig.scriptsDirName}/${entry}`; if (options.dryRun) { const action = options.link ? 'link' : 'copy'; diff --git a/packages/agents/src/lib/__tests__/platform.test.ts b/packages/agents/src/lib/__tests__/platform.test.ts index d24b1291..3ca66a63 100644 --- a/packages/agents/src/lib/__tests__/platform.test.ts +++ b/packages/agents/src/lib/__tests__/platform.test.ts @@ -52,18 +52,20 @@ describe('platform', () => { const result = resolvePlatformPaths('claude', tempDir); expect(result.platformHome).toBe(path.join(tempDir, PLATFORMS.claude.homeDir)); - expect(result.skillsDir).toBe(path.join(tempDir, PLATFORMS.claude.homeDir, PLATFORMS.claude.skillsDir)); - expect(result.subagentsDir).toBe(path.join(tempDir, PLATFORMS.claude.homeDir, PLATFORMS.claude.subagentsDir)); - expect(result.scriptsDir).toBe(path.join(tempDir, PLATFORMS.claude.homeDir, PLATFORMS.claude.scriptsDir)); + expect(result.skillsDir).toBe(path.join(tempDir, PLATFORMS.claude.homeDir, PLATFORMS.claude.skillsDirName)); + expect(result.subagentsDir).toBe(path.join(tempDir, PLATFORMS.claude.homeDir, PLATFORMS.claude.subagentsDirName)); + expect(result.scriptsDir).toBe(path.join(tempDir, PLATFORMS.claude.homeDir, PLATFORMS.claude.scriptsDirName)); }); it('should resolve correct paths for rovodev platform', () => { const result = resolvePlatformPaths('rovodev', tempDir); expect(result.platformHome).toBe(path.join(tempDir, PLATFORMS.rovodev.homeDir)); - expect(result.skillsDir).toBe(path.join(tempDir, PLATFORMS.rovodev.homeDir, PLATFORMS.rovodev.skillsDir)); - expect(result.subagentsDir).toBe(path.join(tempDir, PLATFORMS.rovodev.homeDir, PLATFORMS.rovodev.subagentsDir)); - expect(result.scriptsDir).toBe(path.join(tempDir, PLATFORMS.rovodev.homeDir, PLATFORMS.rovodev.scriptsDir)); + expect(result.skillsDir).toBe(path.join(tempDir, PLATFORMS.rovodev.homeDir, PLATFORMS.rovodev.skillsDirName)); + expect(result.subagentsDir).toBe( + path.join(tempDir, PLATFORMS.rovodev.homeDir, PLATFORMS.rovodev.subagentsDirName), + ); + expect(result.scriptsDir).toBe(path.join(tempDir, PLATFORMS.rovodev.homeDir, PLATFORMS.rovodev.scriptsDirName)); }); it('should produce absolute paths containing the platform home directory', () => { diff --git a/packages/agents/src/lib/platform.ts b/packages/agents/src/lib/platform.ts index d9845826..cd0d4e24 100644 --- a/packages/agents/src/lib/platform.ts +++ b/packages/agents/src/lib/platform.ts @@ -9,17 +9,17 @@ export const PLATFORMS: Record = { claude: { id: 'claude', homeDir: '.claude', - skillsDir: 'skills', - subagentsDir: 'agents', - scriptsDir: 'scripts', + skillsDirName: 'skills', + subagentsDirName: 'agents', + scriptsDirName: 'scripts', frontmatterFile: 'claude.yaml', }, rovodev: { id: 'rovodev', homeDir: '.rovodev', - skillsDir: 'skills', - subagentsDir: 'subagents', - scriptsDir: 'scripts', + skillsDirName: 'skills', + subagentsDirName: 'subagents', + scriptsDirName: 'scripts', frontmatterFile: 'rovodev.yaml', }, }; @@ -57,9 +57,9 @@ export function resolvePlatformPaths( const platformHome = path.join(home, config.homeDir); return { platformHome, - skillsDir: path.join(platformHome, config.skillsDir), - subagentsDir: path.join(platformHome, config.subagentsDir), - scriptsDir: path.join(platformHome, config.scriptsDir), + skillsDir: path.join(platformHome, config.skillsDirName), + subagentsDir: path.join(platformHome, config.subagentsDirName), + scriptsDir: path.join(platformHome, config.scriptsDirName), }; } diff --git a/packages/agents/src/lib/types.ts b/packages/agents/src/lib/types.ts index d4392771..b7861f0b 100644 --- a/packages/agents/src/lib/types.ts +++ b/packages/agents/src/lib/types.ts @@ -6,12 +6,12 @@ export interface PlatformConfig { readonly id: PlatformId; /** Relative path from home to the platform's dot directory (e.g., `.claude`). */ readonly homeDir: string; - /** Relative path from the platform home to the skills directory. */ - readonly skillsDir: string; - /** Relative path from the platform home to the subagents directory. */ - readonly subagentsDir: string; - /** Relative path from the platform home to the scripts directory. */ - readonly scriptsDir: string; + /** Name of the skills directory under the platform home. */ + readonly skillsDirName: string; + /** Name of the subagents directory under the platform home. */ + readonly subagentsDirName: string; + /** Name of the scripts directory under the platform home. */ + readonly scriptsDirName: string; /** Filename of the frontmatter overlay YAML for this platform. */ readonly frontmatterFile: string; }