export type HookEventName = string export const HookType: Record export interface ClaudeAdapter { name: 'claude' listNativeEvents(): string[] getCanonical(native: string): string | null getNative(canonical: string): string | null eventSupportsMatcher(native: string): boolean isPermissionDecisionEvent(native: string): boolean isTopLevelDecisionEvent(native: string): boolean matches(matcher: string | undefined, target: string): boolean } export const claudeAdapter: ClaudeAdapter export interface FrontmatterDoc { name: string; file: string; fields: Record; body: string; description: string } export interface SkillDoc extends FrontmatterDoc { dir: string } export interface HookHandler { type: 'command' | 'http' | 'mcp_tool' | 'prompt' | 'agent'; [k: string]: unknown } export interface HookGroup { matcher?: string; hooks: HookHandler[] } export type HookConfig = Record export interface Plugin { root: string format: string manifest: Record & { name: string } hooks: HookConfig skills: SkillDoc[] commands: FrontmatterDoc[] agents: FrontmatterDoc[] mcpServers: Record; cwd?: string }> lspServers: Record; [k: string]: unknown }> monitors: Array<{ name: string; command: string; description: string; when?: string }> themes: Array<{ slug: string; file: string; name: string; base: 'dark' | 'light'; overrides?: Record }> outputStyles: FrontmatterDoc[] settings: Record userConfig: Record channels: unknown[] dependencies: unknown[] bin: string | null } export function loadClaudePlugin(dir: string): Plugin export function loadClaudeMarketplace(dir: string): { root: string; catalog: Record; plugins: Array<{ entry: Record; plugin: Plugin | null }> } export function parseFrontmatter(text: string): { fields: Record; body: string } export interface HostCallbacks { onSkill?(plugin: Plugin, skill: SkillDoc): void onAgent?(plugin: Plugin, agent: FrontmatterDoc): void onCommand?(plugin: Plugin, command: FrontmatterDoc): void onTheme?(plugin: Plugin, theme: { slug: string; name: string; base: 'dark' | 'light'; overrides?: Record }): void onOutputStyle?(plugin: Plugin, style: FrontmatterDoc): void onChannel?(plugin: Plugin, channel: unknown): void onSetting?(plugin: Plugin, settings: Record): void onBin?(plugin: Plugin, dir: string): void onLsp?(plugin: Plugin, lang: string, cfg: unknown): void onMcpTool?(plugin: Plugin, server: string, tool: { name: string; description?: string }, call: (args: unknown) => Promise): void onMonitorLine?(plugin: Plugin, monitor: { name: string }, line: string): void } export interface HostDispatchResult { results: Array<{ plugin: string; exitCode: number; output: unknown }> unhandled: Array<{ plugin: string; handler: HookHandler }> decision?: 'block' reason?: string hookSpecificOutput?: { hookEventName: string; permissionDecision?: string; additionalContext?: string; updatedInput?: Record } continue?: false stopReason?: string suppressOutput?: true systemMessage?: string } export interface Host { plugins(): Plugin[] use(plugin: Plugin): Promise dispatch(eventName: string, payload?: Record): Promise notifySkillInvoked(pluginName: string, skillName: string): void shutdown(): Promise subst(str: string, plugin: Plugin): string childEnv(plugin: Plugin, extra?: Record): Record } export function createHost(opts?: { on?: HostCallbacks; dataRoot?: string; env?: Record; timeout?: number }): Host