fix(slashcommand): discover ancestor opencode commands

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
YeonGyu-Kim
2026-03-26 11:22:00 +09:00
parent 28bcab066e
commit b6ee7f09b1
2 changed files with 28 additions and 2 deletions
@@ -181,4 +181,27 @@ Use parent opencode commit command.
expect(commitCommand?.scope).toBe("opencode") expect(commitCommand?.scope).toBe("opencode")
expect(commitCommand?.content).toContain("Use parent opencode commit command.") 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.")
})
}) })
+5 -2
View File
@@ -3,6 +3,7 @@ import { basename, join } from "path"
import { import {
parseFrontmatter, parseFrontmatter,
sanitizeModelField, sanitizeModelField,
findProjectOpencodeCommandDirs,
getOpenCodeCommandDirs, getOpenCodeCommandDirs,
discoverPluginCommandDefinitions, discoverPluginCommandDefinitions,
} from "../../shared" } from "../../shared"
@@ -82,14 +83,16 @@ export function discoverCommandsSync(
const userCommandsDir = join(getClaudeConfigDir(), "commands") const userCommandsDir = join(getClaudeConfigDir(), "commands")
const projectCommandsDir = join(directory ?? process.cwd(), ".claude", "commands") const projectCommandsDir = join(directory ?? process.cwd(), ".claude", "commands")
const opencodeGlobalDirs = getOpenCodeCommandDirs({ binary: "opencode" }) 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 userCommands = discoverCommandsFromDir(userCommandsDir, "user")
const opencodeGlobalCommands = opencodeGlobalDirs.flatMap((commandsDir) => const opencodeGlobalCommands = opencodeGlobalDirs.flatMap((commandsDir) =>
discoverCommandsFromDir(commandsDir, "opencode") discoverCommandsFromDir(commandsDir, "opencode")
) )
const projectCommands = discoverCommandsFromDir(projectCommandsDir, "project") 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 pluginCommands = discoverPluginCommands(options)
const builtinCommandsMap = loadBuiltinCommands() const builtinCommandsMap = loadBuiltinCommands()