Connect the existing plugin loader infrastructure to both slash command dispatch paths (executor and slashcommand tool), enabling namespaced commands like /daplug:run-prompt to resolve and execute. - Add plugin discovery to executor.ts discoverAllCommands() - Add plugin discovery to command-discovery.ts discoverCommandsSync() - Add "plugin" to CommandScope type - Remove blanket colon-rejection error (replaced with standard not-found) - Update slash command regex to accept namespaced commands - Thread claude_code.plugins config toggle through dispatch chain - Add unit tests for plugin command discovery and dispatch Closes #2019 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: Codex <noreply@openai.com>
50 lines
1.7 KiB
TypeScript
50 lines
1.7 KiB
TypeScript
import type { AvailableSkill } from "../../agents/dynamic-agent-prompt-builder"
|
|
import type { HookName, OhMyOpenCodeConfig } from "../../config"
|
|
import type { LoadedSkill } from "../../features/opencode-skill-loader/types"
|
|
import type { PluginContext } from "../types"
|
|
|
|
import { createAutoSlashCommandHook, createCategorySkillReminderHook } from "../../hooks"
|
|
import { safeCreateHook } from "../../shared/safe-create-hook"
|
|
|
|
export type SkillHooks = {
|
|
categorySkillReminder: ReturnType<typeof createCategorySkillReminderHook> | null
|
|
autoSlashCommand: ReturnType<typeof createAutoSlashCommandHook> | null
|
|
}
|
|
|
|
export function createSkillHooks(args: {
|
|
ctx: PluginContext
|
|
pluginConfig: OhMyOpenCodeConfig
|
|
isHookEnabled: (hookName: HookName) => boolean
|
|
safeHookEnabled: boolean
|
|
mergedSkills: LoadedSkill[]
|
|
availableSkills: AvailableSkill[]
|
|
}): SkillHooks {
|
|
const {
|
|
ctx,
|
|
pluginConfig,
|
|
isHookEnabled,
|
|
safeHookEnabled,
|
|
mergedSkills,
|
|
availableSkills,
|
|
} = args
|
|
|
|
const safeHook = <T>(hookName: HookName, factory: () => T): T | null =>
|
|
safeCreateHook(hookName, factory, { enabled: safeHookEnabled })
|
|
|
|
const categorySkillReminder = isHookEnabled("category-skill-reminder")
|
|
? safeHook("category-skill-reminder", () =>
|
|
createCategorySkillReminderHook(ctx, availableSkills))
|
|
: null
|
|
|
|
const autoSlashCommand = isHookEnabled("auto-slash-command")
|
|
? safeHook("auto-slash-command", () =>
|
|
createAutoSlashCommandHook({
|
|
skills: mergedSkills,
|
|
pluginsEnabled: pluginConfig.claude_code?.plugins ?? true,
|
|
enabledPluginsOverride: pluginConfig.claude_code?.plugins_override,
|
|
}))
|
|
: null
|
|
|
|
return { categorySkillReminder, autoSlashCommand }
|
|
}
|