fix(slashcommand): discover nested 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 12:15:47 +09:00
parent 12a4318439
commit b20a34bfa7
2 changed files with 36 additions and 2 deletions

View File

@@ -235,4 +235,24 @@ Use plural command.
expect(duplicates).toHaveLength(1)
expect(duplicates[0]?.content).toContain("Use plural command.")
})
it("discovers nested opencode project commands", () => {
const commandsDir = join(projectDir, ".opencode", "commands", "refactor")
mkdirSync(commandsDir, { recursive: true })
writeFileSync(
join(commandsDir, "code.md"),
`---
description: Nested command
---
Use nested command.
`,
)
const commands = discoverCommandsSync(projectDir)
const nestedCommand = commands.find((command) => command.name === "refactor:code")
expect(nestedCommand?.content).toContain("Use nested command.")
expect(nestedCommand?.scope).toBe("opencode-project")
})
})

View File

@@ -18,17 +18,31 @@ export interface CommandDiscoveryOptions {
enabledPluginsOverride?: Record<string, boolean>
}
function discoverCommandsFromDir(commandsDir: string, scope: CommandScope): CommandInfo[] {
function discoverCommandsFromDir(
commandsDir: string,
scope: CommandScope,
prefix = "",
): CommandInfo[] {
if (!existsSync(commandsDir)) return []
const entries = readdirSync(commandsDir, { withFileTypes: true })
const commands: CommandInfo[] = []
for (const entry of entries) {
if (entry.isDirectory()) {
if (entry.name.startsWith(".")) continue
const nestedPrefix = prefix ? `${prefix}:${entry.name}` : entry.name
commands.push(
...discoverCommandsFromDir(join(commandsDir, entry.name), scope, nestedPrefix),
)
continue
}
if (!isMarkdownFile(entry)) continue
const commandPath = join(commandsDir, entry.name)
const commandName = basename(entry.name, ".md")
const baseCommandName = basename(entry.name, ".md")
const commandName = prefix ? `${prefix}:${baseCommandName}` : baseCommandName
try {
const content = readFileSync(commandPath, "utf-8")