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:
@@ -235,4 +235,24 @@ Use plural command.
|
|||||||
expect(duplicates).toHaveLength(1)
|
expect(duplicates).toHaveLength(1)
|
||||||
expect(duplicates[0]?.content).toContain("Use plural command.")
|
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")
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -18,17 +18,31 @@ export interface CommandDiscoveryOptions {
|
|||||||
enabledPluginsOverride?: Record<string, boolean>
|
enabledPluginsOverride?: Record<string, boolean>
|
||||||
}
|
}
|
||||||
|
|
||||||
function discoverCommandsFromDir(commandsDir: string, scope: CommandScope): CommandInfo[] {
|
function discoverCommandsFromDir(
|
||||||
|
commandsDir: string,
|
||||||
|
scope: CommandScope,
|
||||||
|
prefix = "",
|
||||||
|
): CommandInfo[] {
|
||||||
if (!existsSync(commandsDir)) return []
|
if (!existsSync(commandsDir)) return []
|
||||||
|
|
||||||
const entries = readdirSync(commandsDir, { withFileTypes: true })
|
const entries = readdirSync(commandsDir, { withFileTypes: true })
|
||||||
const commands: CommandInfo[] = []
|
const commands: CommandInfo[] = []
|
||||||
|
|
||||||
for (const entry of entries) {
|
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
|
if (!isMarkdownFile(entry)) continue
|
||||||
|
|
||||||
const commandPath = join(commandsDir, entry.name)
|
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 {
|
try {
|
||||||
const content = readFileSync(commandPath, "utf-8")
|
const content = readFileSync(commandPath, "utf-8")
|
||||||
|
|||||||
Reference in New Issue
Block a user