feat(slashcommand): support parent opencode config dirs for command discovery

This commit is contained in:
YeonGyu-Kim
2026-03-12 18:17:34 +09:00
parent 8c2385fe31
commit b4e01e9987
2 changed files with 29 additions and 4 deletions
@@ -157,4 +157,28 @@ describe("slashcommand command discovery plugin integration", () => {
expect(names).not.toContain("daplug:run-prompt") expect(names).not.toContain("daplug:run-prompt")
expect(names).not.toContain("daplug:plugin-plan") expect(names).not.toContain("daplug:plugin-plan")
}) })
it("discovers parent opencode commands when profile config dir is active", () => {
const opencodeRootDir = join(tempDir, "opencode-root")
const profileConfigDir = join(opencodeRootDir, "profiles", "codex")
const globalCommandDir = join(opencodeRootDir, "command")
mkdirSync(profileConfigDir, { recursive: true })
mkdirSync(globalCommandDir, { recursive: true })
writeFileSync(
join(globalCommandDir, "commit.md"),
`---
description: Commit through parent opencode config
---
Use parent opencode commit command.
`
)
process.env.OPENCODE_CONFIG_DIR = profileConfigDir
const commands = discoverCommandsSync(projectDir)
const commitCommand = commands.find(command => command.name === "commit")
expect(commitCommand?.scope).toBe("opencode")
expect(commitCommand?.content).toContain("Use parent opencode commit command.")
})
}) })
+5 -4
View File
@@ -3,7 +3,7 @@ import { basename, join } from "path"
import { import {
parseFrontmatter, parseFrontmatter,
sanitizeModelField, sanitizeModelField,
getOpenCodeConfigDir, getOpenCodeCommandDirs,
discoverPluginCommandDefinitions, discoverPluginCommandDefinitions,
} from "../../shared" } from "../../shared"
import type { CommandFrontmatter } from "../../features/claude-code-command-loader/types" import type { CommandFrontmatter } from "../../features/claude-code-command-loader/types"
@@ -79,14 +79,15 @@ export function discoverCommandsSync(
directory?: string, directory?: string,
options?: CommandDiscoveryOptions, options?: CommandDiscoveryOptions,
): CommandInfo[] { ): CommandInfo[] {
const configDir = getOpenCodeConfigDir({ binary: "opencode" })
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 opencodeGlobalDir = join(configDir, "command") const opencodeGlobalDirs = getOpenCodeCommandDirs({ binary: "opencode" })
const opencodeProjectDir = join(directory ?? process.cwd(), ".opencode", "command") const opencodeProjectDir = join(directory ?? process.cwd(), ".opencode", "command")
const userCommands = discoverCommandsFromDir(userCommandsDir, "user") const userCommands = discoverCommandsFromDir(userCommandsDir, "user")
const opencodeGlobalCommands = discoverCommandsFromDir(opencodeGlobalDir, "opencode") const opencodeGlobalCommands = opencodeGlobalDirs.flatMap((commandsDir) =>
discoverCommandsFromDir(commandsDir, "opencode")
)
const projectCommands = discoverCommandsFromDir(projectCommandsDir, "project") const projectCommands = discoverCommandsFromDir(projectCommandsDir, "project")
const opencodeProjectCommands = discoverCommandsFromDir(opencodeProjectDir, "opencode-project") const opencodeProjectCommands = discoverCommandsFromDir(opencodeProjectDir, "opencode-project")
const pluginCommands = discoverPluginCommands(options) const pluginCommands = discoverPluginCommands(options)