From b6ee7f09b1a35a219dd8b7782fda49e1896b5d0b Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Thu, 26 Mar 2026 11:22:00 +0900 Subject: [PATCH] fix(slashcommand): discover ancestor opencode commands Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus --- .../slashcommand/command-discovery.test.ts | 23 +++++++++++++++++++ src/tools/slashcommand/command-discovery.ts | 7 ++++-- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/tools/slashcommand/command-discovery.test.ts b/src/tools/slashcommand/command-discovery.test.ts index 36e59ba0c..1ebf65c97 100644 --- a/src/tools/slashcommand/command-discovery.test.ts +++ b/src/tools/slashcommand/command-discovery.test.ts @@ -181,4 +181,27 @@ Use parent opencode commit command. expect(commitCommand?.scope).toBe("opencode") expect(commitCommand?.content).toContain("Use parent opencode commit command.") }) + + it("discovers ancestor project opencode commands from plural commands directory", () => { + const projectRoot = join(projectDir, "workspace") + const childDir = join(projectRoot, "apps", "cli") + const commandsDir = join(projectRoot, ".opencode", "commands") + + mkdirSync(childDir, { recursive: true }) + mkdirSync(commandsDir, { recursive: true }) + writeFileSync( + join(commandsDir, "ancestor.md"), + `--- +description: Discover command from ancestor plural directory +--- +Use ancestor command. +`, + ) + + const commands = discoverCommandsSync(childDir) + const ancestorCommand = commands.find((command) => command.name === "ancestor") + + expect(ancestorCommand?.scope).toBe("opencode-project") + expect(ancestorCommand?.content).toContain("Use ancestor command.") + }) }) diff --git a/src/tools/slashcommand/command-discovery.ts b/src/tools/slashcommand/command-discovery.ts index 7fb96c322..ad8e23130 100644 --- a/src/tools/slashcommand/command-discovery.ts +++ b/src/tools/slashcommand/command-discovery.ts @@ -3,6 +3,7 @@ import { basename, join } from "path" import { parseFrontmatter, sanitizeModelField, + findProjectOpencodeCommandDirs, getOpenCodeCommandDirs, discoverPluginCommandDefinitions, } from "../../shared" @@ -82,14 +83,16 @@ export function discoverCommandsSync( const userCommandsDir = join(getClaudeConfigDir(), "commands") const projectCommandsDir = join(directory ?? process.cwd(), ".claude", "commands") const opencodeGlobalDirs = getOpenCodeCommandDirs({ binary: "opencode" }) - const opencodeProjectDir = join(directory ?? process.cwd(), ".opencode", "command") + const opencodeProjectDirs = findProjectOpencodeCommandDirs(directory ?? process.cwd()) const userCommands = discoverCommandsFromDir(userCommandsDir, "user") const opencodeGlobalCommands = opencodeGlobalDirs.flatMap((commandsDir) => discoverCommandsFromDir(commandsDir, "opencode") ) const projectCommands = discoverCommandsFromDir(projectCommandsDir, "project") - const opencodeProjectCommands = discoverCommandsFromDir(opencodeProjectDir, "opencode-project") + const opencodeProjectCommands = opencodeProjectDirs.flatMap((commandsDir) => + discoverCommandsFromDir(commandsDir, "opencode-project"), + ) const pluginCommands = discoverPluginCommands(options) const builtinCommandsMap = loadBuiltinCommands()