diff --git a/src/features/claude-code-agent-loader/loader.ts b/src/features/claude-code-agent-loader/loader.ts index 0f6ef2150..407525687 100644 --- a/src/features/claude-code-agent-loader/loader.ts +++ b/src/features/claude-code-agent-loader/loader.ts @@ -78,8 +78,8 @@ export function loadUserAgents(): Record { return result } -export function loadProjectAgents(): Record { - const projectAgentsDir = join(process.cwd(), ".claude", "agents") +export function loadProjectAgents(directory?: string): Record { + const projectAgentsDir = join(directory ?? process.cwd(), ".claude", "agents") const agents = loadAgentsFromDir(projectAgentsDir, "project") const result: Record = {} diff --git a/src/features/claude-code-command-loader/loader.ts b/src/features/claude-code-command-loader/loader.ts index 4ce62c949..adf2cc4c1 100644 --- a/src/features/claude-code-command-loader/loader.ts +++ b/src/features/claude-code-command-loader/loader.ts @@ -114,8 +114,8 @@ export async function loadUserCommands(): Promise> { - const projectCommandsDir = join(process.cwd(), ".claude", "commands") +export async function loadProjectCommands(directory?: string): Promise> { + const projectCommandsDir = join(directory ?? process.cwd(), ".claude", "commands") const commands = await loadCommandsFromDir(projectCommandsDir, "project") return commandsToRecord(commands) } @@ -127,18 +127,18 @@ export async function loadOpencodeGlobalCommands(): Promise> { - const opencodeProjectDir = join(process.cwd(), ".opencode", "command") +export async function loadOpencodeProjectCommands(directory?: string): Promise> { + const opencodeProjectDir = join(directory ?? process.cwd(), ".opencode", "command") const commands = await loadCommandsFromDir(opencodeProjectDir, "opencode-project") return commandsToRecord(commands) } -export async function loadAllCommands(): Promise> { +export async function loadAllCommands(directory?: string): Promise> { const [user, project, global, projectOpencode] = await Promise.all([ loadUserCommands(), - loadProjectCommands(), + loadProjectCommands(directory), loadOpencodeGlobalCommands(), - loadOpencodeProjectCommands(), + loadOpencodeProjectCommands(directory), ]) return { ...projectOpencode, ...global, ...project, ...user } } diff --git a/src/features/opencode-skill-loader/loader.ts b/src/features/opencode-skill-loader/loader.ts index 2eebc0077..81591dfa1 100644 --- a/src/features/opencode-skill-loader/loader.ts +++ b/src/features/opencode-skill-loader/loader.ts @@ -13,8 +13,8 @@ export async function loadUserSkills(): Promise> { - const projectSkillsDir = join(process.cwd(), ".claude", "skills") +export async function loadProjectSkills(directory?: string): Promise> { + const projectSkillsDir = join(directory ?? process.cwd(), ".claude", "skills") const skills = await loadSkillsFromDir({ skillsDir: projectSkillsDir, scope: "project" }) return skillsToCommandDefinitionRecord(skills) } @@ -26,21 +26,22 @@ export async function loadOpencodeGlobalSkills(): Promise> { - const opencodeProjectDir = join(process.cwd(), ".opencode", "skills") +export async function loadOpencodeProjectSkills(directory?: string): Promise> { + const opencodeProjectDir = join(directory ?? process.cwd(), ".opencode", "skills") const skills = await loadSkillsFromDir({ skillsDir: opencodeProjectDir, scope: "opencode-project" }) return skillsToCommandDefinitionRecord(skills) } export interface DiscoverSkillsOptions { includeClaudeCodePaths?: boolean + directory?: string } -export async function discoverAllSkills(): Promise { +export async function discoverAllSkills(directory?: string): Promise { const [opencodeProjectSkills, opencodeGlobalSkills, projectSkills, userSkills] = await Promise.all([ - discoverOpencodeProjectSkills(), + discoverOpencodeProjectSkills(directory), discoverOpencodeGlobalSkills(), - discoverProjectClaudeSkills(), + discoverProjectClaudeSkills(directory), discoverUserClaudeSkills(), ]) @@ -49,10 +50,10 @@ export async function discoverAllSkills(): Promise { } export async function discoverSkills(options: DiscoverSkillsOptions = {}): Promise { - const { includeClaudeCodePaths = true } = options + const { includeClaudeCodePaths = true, directory } = options const [opencodeProjectSkills, opencodeGlobalSkills] = await Promise.all([ - discoverOpencodeProjectSkills(), + discoverOpencodeProjectSkills(directory), discoverOpencodeGlobalSkills(), ]) @@ -62,7 +63,7 @@ export async function discoverSkills(options: DiscoverSkillsOptions = {}): Promi } const [projectSkills, userSkills] = await Promise.all([ - discoverProjectClaudeSkills(), + discoverProjectClaudeSkills(directory), discoverUserClaudeSkills(), ]) @@ -80,8 +81,8 @@ export async function discoverUserClaudeSkills(): Promise { return loadSkillsFromDir({ skillsDir: userSkillsDir, scope: "user" }) } -export async function discoverProjectClaudeSkills(): Promise { - const projectSkillsDir = join(process.cwd(), ".claude", "skills") +export async function discoverProjectClaudeSkills(directory?: string): Promise { + const projectSkillsDir = join(directory ?? process.cwd(), ".claude", "skills") return loadSkillsFromDir({ skillsDir: projectSkillsDir, scope: "project" }) } @@ -91,7 +92,7 @@ export async function discoverOpencodeGlobalSkills(): Promise { return loadSkillsFromDir({ skillsDir: opencodeSkillsDir, scope: "opencode" }) } -export async function discoverOpencodeProjectSkills(): Promise { - const opencodeProjectDir = join(process.cwd(), ".opencode", "skills") +export async function discoverOpencodeProjectSkills(directory?: string): Promise { + const opencodeProjectDir = join(directory ?? process.cwd(), ".opencode", "skills") return loadSkillsFromDir({ skillsDir: opencodeProjectDir, scope: "opencode-project" }) } diff --git a/src/features/opencode-skill-loader/skill-discovery.ts b/src/features/opencode-skill-loader/skill-discovery.ts index 2154b06ea..fb991e44a 100644 --- a/src/features/opencode-skill-loader/skill-discovery.ts +++ b/src/features/opencode-skill-loader/skill-discovery.ts @@ -20,7 +20,7 @@ export async function getAllSkills(options?: SkillResolutionOptions): Promise + /** Project directory to discover project-level skills from. Falls back to process.cwd() if not provided. */ + directory?: string } diff --git a/src/plugin-handlers/agent-config-handler.ts b/src/plugin-handlers/agent-config-handler.ts index d08094551..c2c993ba6 100644 --- a/src/plugin-handlers/agent-config-handler.ts +++ b/src/plugin-handlers/agent-config-handler.ts @@ -47,10 +47,10 @@ export async function applyAgentConfig(params: { }), includeClaudeSkillsForAwareness ? discoverUserClaudeSkills() : Promise.resolve([]), includeClaudeSkillsForAwareness - ? discoverProjectClaudeSkills() - : Promise.resolve([]), + ? discoverProjectClaudeSkills(params.ctx.directory) + : Promise.resolve([]), discoverOpencodeGlobalSkills(), - discoverOpencodeProjectSkills(), + discoverOpencodeProjectSkills(params.ctx.directory), ]); const allDiscoveredSkills = [ @@ -84,7 +84,7 @@ export async function applyAgentConfig(params: { const includeClaudeAgents = params.pluginConfig.claude_code?.agents ?? true; const userAgents = includeClaudeAgents ? loadUserAgents() : {}; - const projectAgents = includeClaudeAgents ? loadProjectAgents() : {}; + const projectAgents = includeClaudeAgents ? loadProjectAgents(params.ctx.directory) : {}; const rawPluginAgents = params.pluginComponents.agents; const pluginAgents = Object.fromEntries( diff --git a/src/plugin-handlers/command-config-handler.ts b/src/plugin-handlers/command-config-handler.ts index 983c25a04..1ef73df3c 100644 --- a/src/plugin-handlers/command-config-handler.ts +++ b/src/plugin-handlers/command-config-handler.ts @@ -44,13 +44,13 @@ export async function applyCommandConfig(params: { configDir: params.ctx.directory, }), includeClaudeCommands ? loadUserCommands() : Promise.resolve({}), - includeClaudeCommands ? loadProjectCommands() : Promise.resolve({}), + includeClaudeCommands ? loadProjectCommands(params.ctx.directory) : Promise.resolve({}), loadOpencodeGlobalCommands(), - loadOpencodeProjectCommands(), + loadOpencodeProjectCommands(params.ctx.directory), includeClaudeSkills ? loadUserSkills() : Promise.resolve({}), - includeClaudeSkills ? loadProjectSkills() : Promise.resolve({}), + includeClaudeSkills ? loadProjectSkills(params.ctx.directory) : Promise.resolve({}), loadOpencodeGlobalSkills(), - loadOpencodeProjectSkills(), + loadOpencodeProjectSkills(params.ctx.directory), ]); params.config.command = { diff --git a/src/plugin/skill-context.ts b/src/plugin/skill-context.ts index 630cc2085..a1b89f84b 100644 --- a/src/plugin/skill-context.ts +++ b/src/plugin/skill-context.ts @@ -63,8 +63,8 @@ export async function createSkillContext(args: { }), includeClaudeSkills ? discoverUserClaudeSkills() : Promise.resolve([]), discoverOpencodeGlobalSkills(), - includeClaudeSkills ? discoverProjectClaudeSkills() : Promise.resolve([]), - discoverOpencodeProjectSkills(), + includeClaudeSkills ? discoverProjectClaudeSkills(directory) : Promise.resolve([]), + discoverOpencodeProjectSkills(directory), ]) const mergedSkills = mergeSkills( diff --git a/src/plugin/tool-registry.ts b/src/plugin/tool-registry.ts index 7236ddc48..14267fe0a 100644 --- a/src/plugin/tool-registry.ts +++ b/src/plugin/tool-registry.ts @@ -101,7 +101,7 @@ export function createToolRegistry(args: { getSessionID: getSessionIDForMcp, }) - const commands = discoverCommandsSync() + const commands = discoverCommandsSync(ctx.directory) const slashcommandTool = createSlashcommandTool({ commands, skills: skillContext.mergedSkills, diff --git a/src/tools/slashcommand/command-discovery.ts b/src/tools/slashcommand/command-discovery.ts index b44581af7..50be5d024 100644 --- a/src/tools/slashcommand/command-discovery.ts +++ b/src/tools/slashcommand/command-discovery.ts @@ -48,12 +48,12 @@ function discoverCommandsFromDir(commandsDir: string, scope: CommandScope): Comm return commands } -export function discoverCommandsSync(): CommandInfo[] { +export function discoverCommandsSync(directory?: string): CommandInfo[] { const configDir = getOpenCodeConfigDir({ binary: "opencode" }) const userCommandsDir = join(getClaudeConfigDir(), "commands") - const projectCommandsDir = join(process.cwd(), ".claude", "commands") + const projectCommandsDir = join(directory ?? process.cwd(), ".claude", "commands") const opencodeGlobalDir = join(configDir, "command") - const opencodeProjectDir = join(process.cwd(), ".opencode", "command") + const opencodeProjectDir = join(directory ?? process.cwd(), ".opencode", "command") const userCommands = discoverCommandsFromDir(userCommandsDir, "user") const opencodeGlobalCommands = discoverCommandsFromDir(opencodeGlobalDir, "opencode")