@premierstudio/ai-hooks 1.1.2 → 1.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/all.js +2 -2056
- package/dist/adapters/all.js.map +1 -1
- package/dist/adapters/index.js +1 -120
- package/dist/adapters/index.js.map +1 -1
- package/dist/chunk-DSRP646D.js +100 -0
- package/dist/chunk-DSRP646D.js.map +1 -0
- package/dist/chunk-FHFRGMW6.js +122 -0
- package/dist/chunk-FHFRGMW6.js.map +1 -0
- package/dist/chunk-HCEOWJK3.js +261 -0
- package/dist/chunk-HCEOWJK3.js.map +1 -0
- package/dist/chunk-N7ASBTX5.js +63 -0
- package/dist/chunk-N7ASBTX5.js.map +1 -0
- package/dist/chunk-ZOWUSGNF.js +1945 -0
- package/dist/chunk-ZOWUSGNF.js.map +1 -0
- package/dist/cli/index.js +31 -2338
- package/dist/cli/index.js.map +1 -1
- package/dist/hooks/index.js +2 -153
- package/dist/hooks/index.js.map +1 -1
- package/dist/index.js +4 -528
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/config/loader.ts","../../src/types/hooks.ts","../../src/runtime/chain.ts","../../src/runtime/engine.ts","../../src/adapters/registry.ts","../../src/adapters/base.ts","../../src/adapters/amp.ts","../../src/adapters/claude-code.ts","../../src/adapters/cline.ts","../../src/adapters/codex.ts","../../src/adapters/cursor.ts","../../src/adapters/droid.ts","../../src/adapters/gemini-cli.ts","../../src/adapters/kiro.ts","../../src/adapters/opencode.ts","../../src/cli/index.ts"],"names":["hook","adapter","resolve","existsSync","EVENT_MAP","REVERSE_MAP","readFile","writeFile","mkdir","dirname"],"mappings":"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","file":"index.js","sourcesContent":["import { pathToFileURL } from \"node:url\";\nimport { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport type { AiHooksConfig } from \"../types/index.js\";\n\nconst CONFIG_FILENAMES = [\n \"ai-hooks.config.ts\",\n \"ai-hooks.config.js\",\n \"ai-hooks.config.mjs\",\n \"ai-hooks.config.mts\",\n];\n\n/**\n * Find the ai-hooks config file in the given directory.\n */\nexport function findConfigFile(cwd: string = process.cwd()): string | null {\n for (const name of CONFIG_FILENAMES) {\n const fullPath = resolve(cwd, name);\n if (existsSync(fullPath)) {\n return fullPath;\n }\n }\n return null;\n}\n\n/**\n * Load and resolve an ai-hooks config from a file path.\n *\n * Supports both .ts and .js files. For TypeScript files,\n * requires a runtime that supports TS (Node 22+ with --experimental-strip-types,\n * tsx, or bun).\n */\nexport async function loadConfig(configPath?: string, cwd?: string): Promise<AiHooksConfig> {\n const resolvedPath = configPath ?? findConfigFile(cwd);\n\n if (!resolvedPath) {\n throw new ConfigNotFoundError(cwd ?? process.cwd());\n }\n\n if (!existsSync(resolvedPath)) {\n throw new ConfigNotFoundError(resolvedPath);\n }\n\n const fileUrl = pathToFileURL(resolve(resolvedPath)).href;\n const mod = await import(fileUrl);\n\n const config: AiHooksConfig = mod.default ?? mod;\n\n if (!config.hooks || !Array.isArray(config.hooks)) {\n throw new ConfigValidationError(\n \"Config must have a `hooks` array. Did you forget to use `defineConfig()`?\",\n );\n }\n\n // Resolve extends (recursively merge presets)\n if (config.extends && config.extends.length > 0) {\n const mergedHooks = [...config.extends.flatMap((preset) => preset.hooks), ...config.hooks];\n return { ...config, hooks: mergedHooks, extends: undefined };\n }\n\n return config;\n}\n\nexport class ConfigNotFoundError extends Error {\n constructor(searchPath: string) {\n super(\n `No ai-hooks config found. Searched in: ${searchPath}\\n` +\n `Create an ai-hooks.config.ts file or run: ai-hooks init`,\n );\n this.name = \"ConfigNotFoundError\";\n }\n}\n\nexport class ConfigValidationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ConfigValidationError\";\n }\n}\n","import type { HookEvent, HookEventType, EventOf, BeforeEvent } from \"./events.js\";\n\n// Re-export for direct import paths\nexport type { HookEventType } from \"./events.js\";\n\n/**\n * Result of a \"before\" hook. Controls whether the event proceeds.\n */\nexport type HookResult = {\n /** If true, the event is blocked and won't proceed to the tool. */\n blocked?: boolean;\n /** Reason for blocking (shown to the user/tool). */\n reason?: string;\n /** Modified event data to pass forward (mutation). */\n mutated?: Partial<HookEvent>;\n /** Arbitrary data to attach to the hook context. */\n data?: Record<string, unknown>;\n};\n\n/**\n * The context object passed to every hook function.\n * Inspired by Express.js req/res pattern but adapted for AI tools.\n */\nexport type HookContext<T extends HookEventType = HookEventType> = {\n /** The event that triggered this hook. */\n event: EventOf<T>;\n /** The AI tool that emitted this event. */\n tool: {\n name: string;\n version: string;\n };\n /** Working directory where the tool is running. */\n cwd: string;\n /** Shared state bag for passing data between hooks in a chain. */\n state: Map<string, unknown>;\n /** Accumulated results from previous hooks in the chain. */\n results: HookResult[];\n /** Timestamp of when the hook chain started. */\n startedAt: number;\n};\n\n/**\n * A \"before\" hook function. Runs before the event is processed.\n * Can block, mutate, or pass through.\n */\nexport type BeforeHookFn<T extends HookEventType = HookEventType> = (\n ctx: HookContext<T>,\n next: () => Promise<void>,\n) => Promise<void> | void;\n\n/**\n * An \"after\" hook function. Runs after the event is processed.\n * Cannot block (event already happened), but can observe and react.\n */\nexport type AfterHookFn<T extends HookEventType = HookEventType> = (\n ctx: HookContext<T>,\n next: () => Promise<void>,\n) => Promise<void> | void;\n\n/**\n * A hook definition with metadata.\n *\n * The generic parameter provides type safety when creating hooks\n * for specific events. For collections/storage, use the non-generic\n * default which accepts any event type.\n */\nexport type HookDefinition = {\n /** Unique identifier for this hook. */\n id: string;\n /** Human-readable name. */\n name: string;\n /** Description of what this hook does. */\n description?: string;\n /** Which event types this hook listens to. */\n events: HookEventType[];\n /** The hook function. Takes the widest context; narrowing happens at creation time via hook(). */\n handler: (ctx: HookContext, next: () => Promise<void>) => Promise<void> | void;\n /** Priority (lower = runs first). Default: 100. */\n priority?: number;\n /** Whether this hook runs \"before\" or \"after\" the event. */\n phase: \"before\" | \"after\";\n /** Optional filter to narrow when this hook runs. */\n filter?: (event: HookEvent) => boolean;\n /** Whether this hook is enabled. Default: true. */\n enabled?: boolean;\n};\n\n/**\n * Type guard: is this a \"before\" event type?\n */\nexport function isBeforeEvent(event: HookEvent): event is BeforeEvent {\n return (\n event.type === \"session:start\" ||\n event.type === \"prompt:submit\" ||\n event.type === \"tool:before\" ||\n event.type === \"file:write\" ||\n event.type === \"file:edit\" ||\n event.type === \"file:delete\" ||\n event.type === \"shell:before\" ||\n event.type === \"mcp:before\"\n );\n}\n","import type { HookDefinition, HookContext, HookResult } from \"../types/index.js\";\n\n/**\n * Execute a chain of hooks in priority order with Express.js-style next() flow.\n *\n * Each hook calls `next()` to pass control to the next hook in the chain.\n * If a hook doesn't call `next()`, the chain stops (short-circuit).\n * Before hooks can block events by setting `ctx.results` with `blocked: true`.\n */\nexport async function executeChain(\n hooks: HookDefinition[],\n ctx: HookContext,\n timeout: number,\n): Promise<HookResult[]> {\n const sorted = [...hooks].toSorted((a, b) => (a.priority ?? 100) - (b.priority ?? 100));\n\n let index = 0;\n\n const next = async (): Promise<void> => {\n if (index >= sorted.length) return;\n\n const hook = sorted[index];\n /* v8 ignore next -- unreachable: guarded by index >= sorted.length above */\n if (!hook) return;\n index++;\n\n // Skip disabled hooks\n if (hook.enabled === false) {\n await next();\n return;\n }\n\n // Skip if filter doesn't match\n if (hook.filter && !hook.filter(ctx.event)) {\n await next();\n return;\n }\n\n // Check if a previous hook already blocked\n const blocked = ctx.results.some((r) => r.blocked);\n if (blocked && hook.phase === \"before\") {\n return; // Stop chain on block\n }\n\n await Promise.race([\n Promise.resolve(hook.handler(ctx, next)),\n new Promise<never>((_, reject) =>\n setTimeout(() => reject(new HookTimeoutError(hook.id, timeout)), timeout),\n ),\n ]);\n };\n\n try {\n await next();\n } catch (error) {\n if (error instanceof HookTimeoutError) {\n ctx.results.push({\n blocked: false,\n reason: `Hook \"${error.hookId}\" timed out after ${error.timeout}ms`,\n });\n } else {\n throw error;\n }\n }\n\n return ctx.results;\n}\n\nexport class HookTimeoutError extends Error {\n constructor(\n public readonly hookId: string,\n public readonly timeout: number,\n ) {\n super(`Hook \"${hookId}\" timed out after ${timeout}ms`);\n this.name = \"HookTimeoutError\";\n }\n}\n","import type {\n HookDefinition,\n HookContext,\n HookResult,\n HookEvent,\n HookEventType,\n AiHooksConfig,\n ConfigSettings,\n} from \"../types/index.js\";\nimport { isBeforeEvent } from \"../types/index.js\";\nimport { executeChain } from \"./chain.js\";\n\nconst DEFAULT_SETTINGS: Required<ConfigSettings> = {\n cwd: process.cwd(),\n logLevel: \"warn\",\n hookTimeout: 5000,\n failMode: \"open\",\n telemetry: false,\n};\n\n/**\n * The ai-hooks runtime engine.\n *\n * Manages hook registration, event dispatch, and chain execution.\n * This is the core orchestrator - adapters feed events into this engine,\n * and it runs the appropriate hook chains.\n */\nexport class HookEngine {\n private hooks: Map<HookEventType, HookDefinition[]> = new Map();\n private settings: Required<ConfigSettings>;\n\n constructor(config?: AiHooksConfig) {\n this.settings = { ...DEFAULT_SETTINGS, ...config?.settings };\n\n if (config) {\n // Apply presets first (in order)\n if (config.extends) {\n for (const preset of config.extends) {\n this.registerAll(preset.hooks);\n }\n }\n // Then apply local hooks (override presets)\n this.registerAll(config.hooks);\n }\n }\n\n /**\n * Register a single hook definition.\n */\n register(hook: HookDefinition): void {\n for (const event of hook.events) {\n const existing = this.hooks.get(event) ?? [];\n existing.push(hook);\n this.hooks.set(event, existing);\n }\n }\n\n /**\n * Register multiple hook definitions.\n */\n registerAll(hooks: HookDefinition[]): void {\n for (const hook of hooks) {\n this.register(hook);\n }\n }\n\n /**\n * Unregister a hook by ID.\n */\n unregister(hookId: string): void {\n for (const [event, hooks] of this.hooks) {\n const filtered = hooks.filter((h) => h.id !== hookId);\n if (filtered.length === 0) {\n this.hooks.delete(event);\n } else {\n this.hooks.set(event, filtered);\n }\n }\n }\n\n /**\n * Emit an event and run the matching hook chain.\n *\n * For \"before\" events: returns results that may include blocks.\n * For \"after\" events: returns observation results (no blocking).\n */\n async emit(event: HookEvent, toolInfo: { name: string; version: string }): Promise<HookResult[]> {\n const eventType = event.type as HookEventType;\n const phase = isBeforeEvent(event) ? \"before\" : \"after\";\n\n const allHooks = this.hooks.get(eventType) ?? [];\n const phaseHooks = allHooks.filter((h) => h.phase === phase);\n\n if (phaseHooks.length === 0) {\n return [];\n }\n\n const ctx: HookContext = {\n event,\n tool: toolInfo,\n cwd: this.settings.cwd,\n state: new Map(),\n results: [],\n startedAt: Date.now(),\n };\n\n try {\n return await executeChain(phaseHooks, ctx, this.settings.hookTimeout);\n } catch (error) {\n if (this.settings.failMode === \"open\") {\n this.log(\"error\", `Hook chain error (fail-open): ${error}`);\n return [];\n }\n // fail-closed: treat as blocked\n return [\n {\n blocked: true,\n reason: `Hook chain error (fail-closed): ${error}`,\n },\n ];\n }\n }\n\n /**\n * Check if an event is blocked by running before hooks.\n * Convenience wrapper around emit().\n */\n async isBlocked(\n event: HookEvent,\n toolInfo: { name: string; version: string },\n ): Promise<{ blocked: boolean; reason?: string }> {\n if (!isBeforeEvent(event)) {\n return { blocked: false };\n }\n\n const results = await this.emit(event, toolInfo);\n const blockResult = results.find((r) => r.blocked);\n\n return blockResult ? { blocked: true, reason: blockResult.reason } : { blocked: false };\n }\n\n /**\n * Get all registered hooks, optionally filtered by event type.\n */\n getHooks(eventType?: HookEventType): HookDefinition[] {\n if (eventType) {\n return this.hooks.get(eventType) ?? [];\n }\n const all: HookDefinition[] = [];\n const seen = new Set<string>();\n for (const hooks of this.hooks.values()) {\n for (const hook of hooks) {\n if (!seen.has(hook.id)) {\n seen.add(hook.id);\n all.push(hook);\n }\n }\n }\n return all;\n }\n\n /**\n * Get current engine settings.\n */\n getSettings(): Required<ConfigSettings> {\n return { ...this.settings };\n }\n\n private log(level: \"error\" | \"warn\" | \"info\" | \"debug\", message: string): void {\n const levels = { silent: 0, error: 1, warn: 2, info: 3, debug: 4 };\n const threshold = levels[this.settings.logLevel];\n const messageLevel = levels[level];\n\n if (messageLevel <= threshold) {\n const prefix = `[ai-hooks:${level}]`;\n if (level === \"error\") {\n console.error(prefix, message);\n } else if (level === \"warn\") {\n console.warn(prefix, message);\n } else {\n console.log(prefix, message);\n }\n }\n }\n}\n","import type { Adapter, AdapterFactory } from \"../types/index.js\";\n\n/**\n * Global adapter registry.\n * Adapters register themselves when imported, or can be manually added.\n */\nclass AdapterRegistry {\n private adapters: Map<string, Adapter> = new Map();\n private factories: Map<string, AdapterFactory> = new Map();\n\n /**\n * Register an adapter instance.\n */\n register(adapter: Adapter): void {\n this.adapters.set(adapter.id, adapter);\n }\n\n /**\n * Register an adapter factory for lazy instantiation.\n */\n registerFactory(id: string, factory: AdapterFactory): void {\n this.factories.set(id, factory);\n }\n\n /**\n * Get a registered adapter by ID.\n */\n get(id: string): Adapter | undefined {\n const existing = this.adapters.get(id);\n if (existing) return existing;\n\n // Try factory\n const factory = this.factories.get(id);\n if (factory) {\n const adapter = factory();\n this.adapters.set(id, adapter);\n return adapter;\n }\n\n return undefined;\n }\n\n /**\n * Get all registered adapter IDs.\n */\n list(): string[] {\n return [...new Set([...this.adapters.keys(), ...this.factories.keys()])];\n }\n\n /**\n * Detect which tools are available in the current environment.\n * Returns adapters that successfully detect their tool.\n */\n async detectAll(): Promise<Adapter[]> {\n const detected: Adapter[] = [];\n\n for (const id of this.list()) {\n const adapter = this.get(id);\n if (adapter) {\n try {\n const found = await adapter.detect();\n if (found) {\n detected.push(adapter);\n }\n } catch {\n // Detection failed, skip this adapter\n }\n }\n }\n\n return detected;\n }\n\n /**\n * Clear the registry. Useful for testing.\n */\n clear(): void {\n this.adapters.clear();\n this.factories.clear();\n }\n}\n\nexport const registry = new AdapterRegistry();\n","import { existsSync } from \"node:fs\";\nimport { readFile, writeFile, mkdir, rm } from \"node:fs/promises\";\nimport { dirname, resolve } from \"node:path\";\nimport type {\n Adapter,\n AdapterCapabilities,\n GeneratedConfig,\n HookDefinition,\n HookEventType,\n} from \"../types/index.js\";\n\n/**\n * Base adapter class with shared utilities.\n * Tool-specific adapters extend this and implement the abstract methods.\n */\nexport abstract class BaseAdapter implements Adapter {\n abstract readonly id: string;\n abstract readonly name: string;\n abstract readonly version: string;\n abstract readonly capabilities: AdapterCapabilities;\n\n abstract detect(): Promise<boolean>;\n abstract generate(hooks: HookDefinition[]): Promise<GeneratedConfig[]>;\n abstract mapEvent(event: HookEventType): string[];\n abstract mapNativeEvent(nativeEvent: string): HookEventType[];\n\n /**\n * Default install: write generated configs to disk.\n */\n async install(configs: GeneratedConfig[]): Promise<void> {\n for (const config of configs) {\n const fullPath = resolve(process.cwd(), config.path);\n await mkdir(dirname(fullPath), { recursive: true });\n await writeFile(fullPath, config.content, \"utf-8\");\n }\n }\n\n /**\n * Default uninstall: remove generated config files.\n */\n async uninstall(): Promise<void> {\n // Subclasses should override with specific file paths\n }\n\n // ── Utility Methods ───────────────────────────────────────\n\n protected async fileExists(path: string): Promise<boolean> {\n return existsSync(resolve(process.cwd(), path));\n }\n\n protected async readJsonFile<T>(path: string): Promise<T | null> {\n const fullPath = resolve(process.cwd(), path);\n if (!existsSync(fullPath)) return null;\n const content = await readFile(fullPath, \"utf-8\");\n return JSON.parse(content) as T;\n }\n\n protected async writeJsonFile(path: string, data: unknown): Promise<void> {\n const fullPath = resolve(process.cwd(), path);\n await mkdir(dirname(fullPath), { recursive: true });\n await writeFile(fullPath, JSON.stringify(data, null, 2) + \"\\n\", \"utf-8\");\n }\n\n protected async removeFile(path: string): Promise<void> {\n const fullPath = resolve(process.cwd(), path);\n if (existsSync(fullPath)) {\n await rm(fullPath);\n }\n }\n\n /**\n * Check if a CLI command exists on PATH.\n */\n protected async commandExists(command: string): Promise<boolean> {\n const { exec } = await import(\"node:child_process\");\n return new Promise((resolve) => {\n exec(`which ${command}`, (error) => {\n resolve(!error);\n });\n });\n }\n}\n","import { BaseAdapter, registry } from \"./index.js\";\nimport type {\n AdapterCapabilities,\n GeneratedConfig,\n HookDefinition,\n HookEventType,\n} from \"../types/index.js\";\nimport { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\n\n/**\n * Event mapping: ai-hooks universal events -> Amp native hooks.\n *\n * Amp (Sourcegraph) supports a limited hooks system via amp.hooks\n * settings, with events like \"tool:post-execute\". However, the hooks\n * API is not yet comprehensive, so this adapter primarily relies on\n * MCP for event delivery and uses the hooks system where available.\n *\n * Reference: https://ampcode.com/manual\n */\nconst EVENT_MAP: Record<string, string[]> = {\n \"session:start\": [],\n \"session:end\": [],\n \"prompt:submit\": [],\n \"prompt:response\": [],\n \"tool:before\": [\"tool:pre-execute\"],\n \"tool:after\": [\"tool:post-execute\"],\n \"file:write\": [\"tool:pre-execute\"],\n \"file:edit\": [\"tool:pre-execute\"],\n \"file:delete\": [\"tool:pre-execute\"],\n \"shell:before\": [\"tool:pre-execute\"],\n \"shell:after\": [\"tool:post-execute\"],\n \"mcp:before\": [\"tool:pre-execute\"],\n \"mcp:after\": [\"tool:post-execute\"],\n};\n\nconst REVERSE_MAP: Record<string, HookEventType[]> = {\n \"tool:pre-execute\": [\n \"tool:before\",\n \"file:write\",\n \"file:edit\",\n \"file:delete\",\n \"shell:before\",\n \"mcp:before\",\n ],\n \"tool:post-execute\": [\"tool:after\", \"shell:after\", \"mcp:after\"],\n};\n\n/**\n * Amp adapter for ai-hooks.\n *\n * Amp (Sourcegraph) has a growing hooks system and strong MCP support.\n * This adapter generates an MCP server configuration that the ai-hooks\n * MCP server provides, enabling tools management, event emission, and\n * hook control through MCP tool calls.\n *\n * The adapter also generates amp.hooks entries where the native system\n * supports tool pre/post-execute events.\n *\n * Reference: https://ampcode.com/manual\n */\nclass AmpAdapter extends BaseAdapter {\n readonly id = \"amp\";\n readonly name = \"Amp\";\n readonly version = \"1.0\";\n\n readonly capabilities: AdapterCapabilities = {\n beforeHooks: false,\n afterHooks: true,\n mcp: true,\n configFile: true,\n supportedEvents: [\n \"tool:before\",\n \"tool:after\",\n \"file:write\",\n \"file:edit\",\n \"file:delete\",\n \"shell:before\",\n \"shell:after\",\n \"mcp:before\",\n \"mcp:after\",\n ],\n blockableEvents: [],\n };\n\n async detect(): Promise<boolean> {\n const hasCommand = await this.commandExists(\"amp\");\n const hasDir = existsSync(resolve(process.cwd(), \".amp\"));\n return hasCommand || hasDir;\n }\n\n async generate(hooks: HookDefinition[]): Promise<GeneratedConfig[]> {\n const configs: GeneratedConfig[] = [];\n\n // Generate MCP server configuration for ai-hooks\n const mcpConfig = {\n mcpServers: {\n \"ai-hooks\": {\n command: \"npx\",\n args: [\"@premierstudio/mcp-server\"],\n env: {\n AI_HOOKS_CONFIG: resolve(process.cwd(), \"ai-hooks.config.ts\"),\n },\n },\n },\n };\n\n configs.push({\n path: \".amp/mcp.json\",\n content: JSON.stringify(mcpConfig, null, 2) + \"\\n\",\n format: \"json\",\n });\n\n // If any hooks need tool:pre/post-execute, note which events\n const neededEvents = new Set<string>();\n for (const hook of hooks) {\n for (const event of hook.events) {\n const nativeEvents = this.mapEvent(event);\n for (const ne of nativeEvents) {\n neededEvents.add(ne);\n }\n }\n }\n\n // Generate a summary of configured hooks for reference\n const hooksList = hooks.map((h) => ({\n id: h.id,\n name: h.name,\n events: h.events,\n phase: h.phase,\n nativeEvents: h.events.flatMap((e) => this.mapEvent(e)),\n }));\n\n configs.push({\n path: \".amp/ai-hooks-manifest.json\",\n content:\n JSON.stringify(\n {\n adapter: \"amp\",\n version: \"1.0\",\n hooks: hooksList,\n nativeEvents: [...neededEvents],\n mcpServer: \"@premierstudio/mcp-server\",\n },\n null,\n 2,\n ) + \"\\n\",\n format: \"json\",\n });\n\n return configs;\n }\n\n mapEvent(event: HookEventType): string[] {\n return EVENT_MAP[event] ?? [];\n }\n\n mapNativeEvent(nativeEvent: string): HookEventType[] {\n return REVERSE_MAP[nativeEvent] ?? [];\n }\n\n async uninstall(): Promise<void> {\n await this.removeFile(\".amp/mcp.json\");\n await this.removeFile(\".amp/ai-hooks-manifest.json\");\n }\n}\n\n// Auto-register\nconst adapter = new AmpAdapter();\nregistry.register(adapter);\n\nexport { AmpAdapter };\nexport default adapter;\n","import { BaseAdapter, registry } from \"./index.js\";\nimport type {\n AdapterCapabilities,\n GeneratedConfig,\n HookDefinition,\n HookEventType,\n} from \"../types/index.js\";\nimport { resolve } from \"node:path\";\nimport { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\n\n/**\n * Event mapping: ai-hooks universal events -> Claude Code native hooks.\n */\nconst EVENT_MAP: Record<string, string[]> = {\n \"session:start\": [\"SessionStart\"],\n \"session:end\": [],\n \"prompt:submit\": [\"UserPromptSubmit\"],\n \"prompt:response\": [\"PostToolUse\"], // approximate - Claude doesn't expose response directly\n \"tool:before\": [\"PreToolUse\"],\n \"tool:after\": [\"PostToolUse\"],\n \"file:read\": [\"PreToolUse\"], // Read tool\n \"file:write\": [\"PreToolUse\"], // Write tool\n \"file:edit\": [\"PreToolUse\"], // Edit tool\n \"file:delete\": [\"PreToolUse\"],\n \"shell:before\": [\"PreToolUse\"], // Bash tool\n \"shell:after\": [\"PostToolUse\"], // Bash tool\n \"mcp:before\": [\"PreToolUse\"],\n \"mcp:after\": [\"PostToolUse\"],\n notification: [\"Notification\"],\n};\n\nconst REVERSE_MAP: Record<string, HookEventType[]> = {\n SessionStart: [\"session:start\"],\n UserPromptSubmit: [\"prompt:submit\"],\n PreToolUse: [\n \"tool:before\",\n \"file:write\",\n \"file:edit\",\n \"file:delete\",\n \"shell:before\",\n \"mcp:before\",\n ],\n PostToolUse: [\"tool:after\", \"shell:after\", \"mcp:after\"],\n Notification: [\"notification\"],\n};\n\n/**\n * Claude Code adapter for ai-hooks.\n *\n * Generates `.claude/settings.json` hook entries and shell scripts\n * that delegate to the ai-hooks runtime.\n */\nclass ClaudeCodeAdapter extends BaseAdapter {\n readonly id = \"claude-code\";\n readonly name = \"Claude Code\";\n readonly version = \"1.0\";\n\n readonly capabilities: AdapterCapabilities = {\n beforeHooks: true,\n afterHooks: true,\n mcp: true,\n configFile: true,\n supportedEvents: [\n \"session:start\",\n \"prompt:submit\",\n \"tool:before\",\n \"tool:after\",\n \"file:read\",\n \"file:write\",\n \"file:edit\",\n \"file:delete\",\n \"shell:before\",\n \"shell:after\",\n \"mcp:before\",\n \"mcp:after\",\n \"notification\",\n ],\n blockableEvents: [\n \"prompt:submit\",\n \"tool:before\",\n \"file:write\",\n \"file:edit\",\n \"file:delete\",\n \"shell:before\",\n \"mcp:before\",\n ],\n };\n\n async detect(): Promise<boolean> {\n // Check for claude CLI command\n const hasCommand = await this.commandExists(\"claude\");\n\n // Also check for .claude directory (may not have CLI but has project config)\n const hasDir = existsSync(resolve(process.cwd(), \".claude\"));\n\n return hasCommand || hasDir;\n }\n\n async generate(hooks: HookDefinition[]): Promise<GeneratedConfig[]> {\n const configs: GeneratedConfig[] = [];\n\n // 1. Generate the hook runner script\n configs.push(this.generateRunner());\n\n // 2. Generate the settings.json entries\n configs.push(await this.generateSettings(hooks));\n\n return configs;\n }\n\n mapEvent(event: HookEventType): string[] {\n return EVENT_MAP[event] ?? [];\n }\n\n mapNativeEvent(nativeEvent: string): HookEventType[] {\n return REVERSE_MAP[nativeEvent] ?? [];\n }\n\n async uninstall(): Promise<void> {\n await this.removeFile(\".claude/hooks/ai-hooks-runner.js\");\n // Note: we don't remove settings.json as it may have other user config\n }\n\n // -- Private Methods ---------------------------------------------\n\n /**\n * Generate the hook runner script that Claude Code hooks call.\n * This script loads the ai-hooks config and runs the appropriate chain.\n */\n private generateRunner(): GeneratedConfig {\n const script = `#!/usr/bin/env node\n/**\n * ai-hooks runner for Claude Code.\n * Generated by: ai-hooks generate\n *\n * This script is called by Claude Code hooks. It loads your\n * ai-hooks.config.ts and runs the matching hook chain.\n *\n * DO NOT EDIT - regenerate with: ai-hooks generate\n */\n\nimport { loadConfig } from \"@premierstudio/ai-hooks\";\nimport { HookEngine } from \"@premierstudio/ai-hooks\";\n\nconst hookEvent = process.env.CLAUDE_HOOK_EVENT;\nconst toolName = process.env.CLAUDE_TOOL_NAME;\nconst inputJson = process.env.CLAUDE_TOOL_INPUT;\n\nasync function run() {\n const config = await loadConfig();\n const engine = new HookEngine(config);\n\n // Build the event from Claude Code's environment variables\n const event = buildEvent(hookEvent, toolName, inputJson);\n if (!event) {\n process.exit(0);\n }\n\n const toolInfo = { name: \"claude-code\", version: \"1.0\" };\n const results = await engine.emit(event, toolInfo);\n\n // Check for blocks\n const blocked = results.find((r) => r.blocked);\n if (blocked) {\n // Claude Code reads stdout JSON for hook results\n const output = JSON.stringify({\n decision: \"block\",\n reason: blocked.reason ?? \"Blocked by ai-hooks\",\n });\n process.stdout.write(output);\n process.exit(0);\n }\n\n process.exit(0);\n}\n\nfunction buildEvent(hookEvent, toolName, inputJson) {\n const timestamp = Date.now();\n const metadata = {};\n\n try {\n const input = inputJson ? JSON.parse(inputJson) : {};\n\n switch (hookEvent) {\n case \"PreToolUse\":\n return resolvePreToolUse(toolName, input, timestamp, metadata);\n case \"PostToolUse\":\n return resolvePostToolUse(toolName, input, timestamp, metadata);\n case \"SessionStart\":\n return {\n type: \"session:start\",\n tool: \"claude-code\",\n version: \"1.0\",\n workingDirectory: process.cwd(),\n timestamp,\n metadata,\n };\n case \"UserPromptSubmit\":\n return {\n type: \"prompt:submit\",\n prompt: input.prompt ?? \"\",\n timestamp,\n metadata,\n };\n default:\n return null;\n }\n } catch {\n return null;\n }\n}\n\nfunction resolvePreToolUse(toolName, input, timestamp, metadata) {\n switch (toolName) {\n case \"Write\":\n return {\n type: \"file:write\",\n path: input.file_path ?? \"\",\n content: input.content ?? \"\",\n timestamp,\n metadata,\n };\n case \"Edit\":\n return {\n type: \"file:edit\",\n path: input.file_path ?? \"\",\n oldContent: input.old_string ?? \"\",\n newContent: input.new_string ?? \"\",\n timestamp,\n metadata,\n };\n case \"Bash\":\n return {\n type: \"shell:before\",\n command: input.command ?? \"\",\n cwd: process.cwd(),\n timestamp,\n metadata,\n };\n default:\n return {\n type: \"tool:before\",\n toolName: toolName ?? \"unknown\",\n input: input ?? {},\n timestamp,\n metadata,\n };\n }\n}\n\nfunction resolvePostToolUse(toolName, input, timestamp, metadata) {\n switch (toolName) {\n case \"Bash\":\n return {\n type: \"shell:after\",\n command: input.command ?? \"\",\n cwd: process.cwd(),\n exitCode: input.exitCode ?? 0,\n stdout: input.stdout ?? \"\",\n stderr: input.stderr ?? \"\",\n duration: 0,\n timestamp,\n metadata,\n };\n default:\n return {\n type: \"tool:after\",\n toolName: toolName ?? \"unknown\",\n input: input ?? {},\n output: {},\n duration: 0,\n timestamp,\n metadata,\n };\n }\n}\n\nrun().catch((err) => {\n console.error(\"[ai-hooks] Error:\", err.message);\n process.exit(1);\n});\n`;\n\n return {\n path: \".claude/hooks/ai-hooks-runner.js\",\n content: script,\n format: \"js\",\n gitignore: false,\n };\n }\n\n /**\n * Generate the Claude Code settings.json hook entries.\n */\n private async generateSettings(hooks: HookDefinition[]): Promise<GeneratedConfig> {\n // Read existing settings\n const settingsPath = \".claude/settings.json\";\n let existing: Record<string, unknown> = {};\n\n const fullPath = resolve(process.cwd(), settingsPath);\n if (existsSync(fullPath)) {\n const raw = await readFile(fullPath, \"utf-8\");\n existing = JSON.parse(raw);\n }\n\n // Determine which Claude Code hook events we need\n const neededEvents = new Set<string>();\n for (const hook of hooks) {\n for (const event of hook.events) {\n const nativeEvents = this.mapEvent(event);\n for (const ne of nativeEvents) {\n neededEvents.add(ne);\n }\n }\n }\n\n // Build the hooks config\n // neededEvents is a Set, so each native event is processed exactly once.\n const hooksConfig: Record<string, unknown[]> = {};\n\n for (const event of neededEvents) {\n const hookEntry = {\n type: \"command\",\n command: `node .claude/hooks/ai-hooks-runner.js`,\n timeout: 10,\n description: `ai-hooks: ${event}`,\n };\n\n if (!hooksConfig[event]) {\n hooksConfig[event] = [];\n }\n (hooksConfig[event] as unknown[]).push({\n hooks: [hookEntry],\n });\n }\n\n // Merge with existing settings (preserve non-ai-hooks entries)\n const existingHooks = (existing.hooks ?? {}) as Record<string, unknown[]>;\n const mergedHooks: Record<string, unknown[]> = { ...existingHooks };\n\n for (const [event, entries] of Object.entries(hooksConfig)) {\n if (!mergedHooks[event]) {\n mergedHooks[event] = [];\n }\n // Remove old ai-hooks entries\n mergedHooks[event] = (\n mergedHooks[event] as Array<{ hooks?: Array<{ description?: string }> }>\n ).filter((entry) => !entry.hooks?.some((h) => h.description?.startsWith(\"ai-hooks:\")));\n // Add new ai-hooks entries\n mergedHooks[event].push(...entries);\n }\n\n const mergedSettings = {\n ...existing,\n hooks: mergedHooks,\n };\n\n return {\n path: settingsPath,\n content: JSON.stringify(mergedSettings, null, 2) + \"\\n\",\n format: \"json\",\n gitignore: false,\n };\n }\n}\n\n// Auto-register\nconst adapter = new ClaudeCodeAdapter();\nregistry.register(adapter);\n\nexport { ClaudeCodeAdapter };\nexport default adapter;\n","import { BaseAdapter, registry } from \"./index.js\";\nimport type {\n AdapterCapabilities,\n GeneratedConfig,\n HookDefinition,\n HookEventType,\n} from \"../types/index.js\";\nimport { resolve } from \"node:path\";\nimport { existsSync } from \"node:fs\";\n\n/**\n * Event mapping: ai-hooks universal events -> Cline native hooks.\n *\n * Cline supports seven hook events (since v3.36):\n * PreToolUse, PostToolUse, UserPromptSubmit,\n * TaskStart, TaskResume, TaskCancel, PreCompact\n *\n * Hook scripts are executables in .clinerules/hooks/ (project) or\n * ~/Documents/Cline/Rules/Hooks/ (global). They receive JSON via STDIN\n * and return JSON via STDOUT. The `cancel` field in output blocks\n * PreToolUse actions.\n *\n * Reference: https://docs.cline.bot/features/hooks\n */\nconst EVENT_MAP: Record<string, string[]> = {\n \"session:start\": [\"TaskStart\"],\n \"session:end\": [\"TaskCancel\"],\n \"prompt:submit\": [\"UserPromptSubmit\"],\n \"prompt:response\": [],\n \"tool:before\": [\"PreToolUse\"],\n \"tool:after\": [\"PostToolUse\"],\n \"file:read\": [\"PreToolUse\"],\n \"file:write\": [\"PreToolUse\"],\n \"file:edit\": [\"PreToolUse\"],\n \"file:delete\": [\"PreToolUse\"],\n \"shell:before\": [\"PreToolUse\"],\n \"shell:after\": [\"PostToolUse\"],\n \"mcp:before\": [\"PreToolUse\"],\n \"mcp:after\": [\"PostToolUse\"],\n notification: [],\n};\n\nconst REVERSE_MAP: Record<string, HookEventType[]> = {\n TaskStart: [\"session:start\"],\n TaskCancel: [\"session:end\"],\n TaskResume: [\"session:start\"],\n UserPromptSubmit: [\"prompt:submit\"],\n PreToolUse: [\n \"tool:before\",\n \"file:read\",\n \"file:write\",\n \"file:edit\",\n \"file:delete\",\n \"shell:before\",\n \"mcp:before\",\n ],\n PostToolUse: [\"tool:after\", \"shell:after\", \"mcp:after\"],\n PreCompact: [],\n};\n\n/**\n * Cline adapter for ai-hooks.\n *\n * Generates executable hook scripts in `.clinerules/hooks/` that delegate\n * to the ai-hooks runtime. Cline hooks receive JSON via STDIN containing\n * operation context (pendingToolInfo, etc.) and return JSON via STDOUT\n * with `cancel` boolean to block actions.\n *\n * Reference: https://docs.cline.bot/features/hooks\n */\nclass ClineAdapter extends BaseAdapter {\n readonly id = \"cline\";\n readonly name = \"Cline\";\n readonly version = \"1.0\";\n\n readonly capabilities: AdapterCapabilities = {\n beforeHooks: true,\n afterHooks: true,\n mcp: true,\n configFile: true,\n supportedEvents: [\n \"session:start\",\n \"session:end\",\n \"prompt:submit\",\n \"tool:before\",\n \"tool:after\",\n \"file:read\",\n \"file:write\",\n \"file:edit\",\n \"file:delete\",\n \"shell:before\",\n \"shell:after\",\n \"mcp:before\",\n \"mcp:after\",\n ],\n blockableEvents: [\n \"tool:before\",\n \"file:read\",\n \"file:write\",\n \"file:edit\",\n \"file:delete\",\n \"shell:before\",\n \"mcp:before\",\n ],\n };\n\n async detect(): Promise<boolean> {\n const hasCommand = await this.commandExists(\"cline\");\n const hasDir = existsSync(resolve(process.cwd(), \".clinerules\"));\n return hasCommand || hasDir;\n }\n\n async generate(hooks: HookDefinition[]): Promise<GeneratedConfig[]> {\n const configs: GeneratedConfig[] = [];\n\n // Collect needed native events\n const neededEvents = new Set<string>();\n for (const hook of hooks) {\n for (const event of hook.events) {\n const nativeEvents = this.mapEvent(event);\n for (const ne of nativeEvents) {\n neededEvents.add(ne);\n }\n }\n }\n\n // Generate one executable script per needed hook event\n for (const event of neededEvents) {\n configs.push({\n path: `.clinerules/hooks/${event}`,\n content: this.generateHookScript(event),\n format: \"js\",\n });\n }\n\n return configs;\n }\n\n mapEvent(event: HookEventType): string[] {\n return EVENT_MAP[event] ?? [];\n }\n\n mapNativeEvent(nativeEvent: string): HookEventType[] {\n return REVERSE_MAP[nativeEvent] ?? [];\n }\n\n async uninstall(): Promise<void> {\n const hookNames = [\n \"PreToolUse\",\n \"PostToolUse\",\n \"UserPromptSubmit\",\n \"TaskStart\",\n \"TaskResume\",\n \"TaskCancel\",\n \"PreCompact\",\n ];\n for (const name of hookNames) {\n await this.removeFile(`.clinerules/hooks/${name}`);\n }\n }\n\n private generateHookScript(eventName: string): string {\n return `#!/usr/bin/env node\n/**\n * ai-hooks runner for Cline (${eventName}).\n * Generated by: ai-hooks generate\n *\n * Cline passes hook event data as JSON via STDIN with:\n * hookName, taskId, workspaceRoots, pendingToolInfo, etc.\n *\n * Output JSON with { cancel: true, errorMessage: \"...\" } to block.\n * Output JSON with { cancel: false } to allow.\n *\n * DO NOT EDIT - regenerate with: ai-hooks generate\n */\nimport { loadConfig, HookEngine } from \"@premierstudio/ai-hooks\";\n\nasync function readStdin() {\n const chunks = [];\n for await (const chunk of process.stdin) {\n chunks.push(chunk);\n }\n return Buffer.concat(chunks).toString(\"utf-8\");\n}\n\nasync function run() {\n const raw = await readStdin();\n const input = JSON.parse(raw || \"{}\");\n const hookName = input.hookName ?? \"${eventName}\";\n const pendingToolInfo = input.pendingToolInfo ?? {};\n const toolName = pendingToolInfo.toolName ?? \"\";\n\n const config = await loadConfig();\n const engine = new HookEngine(config);\n const toolInfo = { name: \"cline\", version: \"1.0\" };\n const timestamp = Date.now();\n const metadata = { taskId: input.taskId ?? \"\" };\n\n let event;\n switch (hookName) {\n case \"TaskStart\":\n case \"TaskResume\":\n event = {\n type: \"session:start\",\n tool: \"cline\",\n version: \"1.0\",\n workingDirectory: (input.workspaceRoots ?? [])[0] ?? process.cwd(),\n timestamp,\n metadata,\n };\n break;\n case \"TaskCancel\":\n event = { type: \"session:end\", tool: \"cline\", duration: 0, timestamp, metadata };\n break;\n case \"UserPromptSubmit\":\n event = { type: \"prompt:submit\", prompt: input.userMessage ?? \"\", timestamp, metadata };\n break;\n case \"PreToolUse\":\n event = resolvePreToolEvent(toolName, pendingToolInfo, timestamp, metadata);\n break;\n case \"PostToolUse\":\n event = resolvePostToolEvent(toolName, pendingToolInfo, timestamp, metadata);\n break;\n default:\n process.stdout.write(JSON.stringify({ cancel: false }));\n process.exit(0);\n }\n\n const results = await engine.emit(event, toolInfo);\n const blocked = results.find((r) => r.blocked);\n\n if (blocked) {\n process.stdout.write(JSON.stringify({\n cancel: true,\n errorMessage: blocked.reason ?? \"Blocked by ai-hooks\",\n }));\n process.exit(0);\n }\n\n process.stdout.write(JSON.stringify({ cancel: false }));\n}\n\nfunction resolvePreToolEvent(toolName, info, timestamp, metadata) {\n switch (toolName) {\n case \"write_to_file\":\n return { type: \"file:write\", path: info.path ?? \"\", content: info.content ?? \"\", timestamp, metadata };\n case \"replace_in_file\":\n return { type: \"file:edit\", path: info.path ?? \"\", oldContent: info.diff ?? \"\", newContent: \"\", timestamp, metadata };\n case \"read_file\":\n return { type: \"file:read\", path: info.path ?? \"\", timestamp, metadata };\n case \"execute_command\":\n return { type: \"shell:before\", command: info.command ?? \"\", cwd: process.cwd(), timestamp, metadata };\n case \"use_mcp_tool\":\n return { type: \"mcp:before\", server: info.mcpServer ?? \"\", tool: info.mcpTool ?? \"\", input: {}, timestamp, metadata };\n default:\n return { type: \"tool:before\", toolName: toolName || \"unknown\", input: info, timestamp, metadata };\n }\n}\n\nfunction resolvePostToolEvent(toolName, info, timestamp, metadata) {\n switch (toolName) {\n case \"execute_command\":\n return {\n type: \"shell:after\",\n command: info.command ?? \"\",\n cwd: process.cwd(),\n exitCode: 0,\n stdout: \"\",\n stderr: \"\",\n duration: 0,\n timestamp,\n metadata,\n };\n default:\n return { type: \"tool:after\", toolName: toolName || \"unknown\", input: info, output: {}, duration: 0, timestamp, metadata };\n }\n}\n\nrun().catch((err) => {\n console.error(\"[ai-hooks] Error:\", err.message);\n process.stdout.write(JSON.stringify({ cancel: false }));\n process.exit(0);\n});\n`;\n }\n}\n\n// Auto-register\nconst adapter = new ClineAdapter();\nregistry.register(adapter);\n\nexport { ClineAdapter };\nexport default adapter;\n","import { BaseAdapter, registry } from \"./index.js\";\nimport type {\n AdapterCapabilities,\n GeneratedConfig,\n HookDefinition,\n HookEventType,\n} from \"../types/index.js\";\nimport { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\n\n/**\n * Event mapping: ai-hooks -> Codex CLI native hooks.\n *\n * Codex uses an `agents.yaml` config with lifecycle events.\n * Reference: https://github.com/openai/codex\n */\nconst EVENT_MAP: Record<string, string[]> = {\n \"session:start\": [\"session_start\"],\n \"session:end\": [\"session_end\"],\n \"prompt:submit\": [\"user_message\"],\n \"prompt:response\": [\"assistant_message\"],\n \"tool:before\": [\"before_tool_call\"],\n \"tool:after\": [\"after_tool_call\"],\n \"file:write\": [\"before_file_write\"],\n \"file:edit\": [\"before_file_edit\"],\n \"file:delete\": [\"before_file_delete\"],\n \"shell:before\": [\"before_shell\"],\n \"shell:after\": [\"after_shell\"],\n \"mcp:before\": [\"before_mcp_call\"],\n \"mcp:after\": [\"after_mcp_call\"],\n};\n\nconst REVERSE_MAP: Record<string, HookEventType[]> = {\n session_start: [\"session:start\"],\n session_end: [\"session:end\"],\n user_message: [\"prompt:submit\"],\n assistant_message: [\"prompt:response\"],\n before_tool_call: [\"tool:before\"],\n after_tool_call: [\"tool:after\"],\n before_file_write: [\"file:write\"],\n before_file_edit: [\"file:edit\"],\n before_file_delete: [\"file:delete\"],\n before_shell: [\"shell:before\"],\n after_shell: [\"shell:after\"],\n before_mcp_call: [\"mcp:before\"],\n after_mcp_call: [\"mcp:after\"],\n};\n\nclass CodexAdapter extends BaseAdapter {\n readonly id = \"codex\";\n readonly name = \"Codex CLI\";\n readonly version = \"1.0\";\n\n readonly capabilities: AdapterCapabilities = {\n beforeHooks: true,\n afterHooks: true,\n mcp: true,\n configFile: true,\n supportedEvents: [\n \"session:start\",\n \"session:end\",\n \"prompt:submit\",\n \"prompt:response\",\n \"tool:before\",\n \"tool:after\",\n \"file:write\",\n \"file:edit\",\n \"file:delete\",\n \"shell:before\",\n \"shell:after\",\n \"mcp:before\",\n \"mcp:after\",\n ],\n blockableEvents: [\n \"tool:before\",\n \"file:write\",\n \"file:edit\",\n \"file:delete\",\n \"shell:before\",\n \"mcp:before\",\n ],\n };\n\n async detect(): Promise<boolean> {\n const hasCommand = await this.commandExists(\"codex\");\n const hasConfig =\n existsSync(resolve(process.cwd(), \"codex.json\")) ||\n existsSync(resolve(process.cwd(), \".codex\"));\n return hasCommand || hasConfig;\n }\n\n async generate(hooks: HookDefinition[]): Promise<GeneratedConfig[]> {\n // Codex uses a codex.json config file with hooks array\n const hookEntries: Record<string, unknown> = {};\n\n for (const hook of hooks) {\n for (const event of hook.events) {\n const nativeEvents = this.mapEvent(event);\n for (const ne of nativeEvents) {\n hookEntries[ne] = {\n command: \"node .codex/hooks/ai-hooks-runner.js\",\n timeout: 10,\n };\n }\n }\n }\n\n return [\n {\n path: \".codex/hooks/ai-hooks-runner.js\",\n content: this.generateRunner(),\n format: \"js\",\n },\n {\n path: \"codex.json\",\n content: JSON.stringify({ hooks: hookEntries }, null, 2) + \"\\n\",\n format: \"json\",\n },\n ];\n }\n\n mapEvent(event: HookEventType): string[] {\n return EVENT_MAP[event] ?? [];\n }\n\n mapNativeEvent(nativeEvent: string): HookEventType[] {\n return REVERSE_MAP[nativeEvent] ?? [];\n }\n\n async uninstall(): Promise<void> {\n await this.removeFile(\".codex/hooks/ai-hooks-runner.js\");\n }\n\n private generateRunner(): string {\n return `#!/usr/bin/env node\n/**\n * ai-hooks runner for Codex CLI.\n * Generated by: ai-hooks generate\n */\nimport { loadConfig, HookEngine } from \"@premierstudio/ai-hooks\";\n\nconst hookEvent = process.env.CODEX_HOOK_EVENT;\nconst toolInput = process.env.CODEX_TOOL_INPUT;\n\nasync function run() {\n const config = await loadConfig();\n const engine = new HookEngine(config);\n const toolInfo = { name: \"codex\", version: \"1.0\" };\n\n const input = toolInput ? JSON.parse(toolInput) : {};\n const timestamp = Date.now();\n const metadata = {};\n\n let event;\n switch (hookEvent) {\n case \"before_shell\":\n event = { type: \"shell:before\", command: input.command ?? \"\", cwd: process.cwd(), timestamp, metadata };\n break;\n case \"before_file_write\":\n event = { type: \"file:write\", path: input.path ?? \"\", content: input.content ?? \"\", timestamp, metadata };\n break;\n case \"before_file_edit\":\n event = { type: \"file:edit\", path: input.path ?? \"\", oldContent: input.old ?? \"\", newContent: input.new ?? \"\", timestamp, metadata };\n break;\n default:\n event = { type: \"tool:before\", toolName: hookEvent ?? \"unknown\", input, timestamp, metadata };\n }\n\n const results = await engine.emit(event, toolInfo);\n const blocked = results.find((r) => r.blocked);\n\n if (blocked) {\n console.log(JSON.stringify({ blocked: true, reason: blocked.reason }));\n process.exit(1);\n }\n}\n\nrun().catch(() => process.exit(1));\n`;\n }\n}\n\nconst adapter = new CodexAdapter();\nregistry.register(adapter);\n\nexport { CodexAdapter };\nexport default adapter;\n","import { BaseAdapter, registry } from \"./index.js\";\nimport type {\n AdapterCapabilities,\n GeneratedConfig,\n HookDefinition,\n HookEventType,\n} from \"../types/index.js\";\nimport { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\n\n/**\n * Event mapping: ai-hooks universal events -> Cursor native hooks.\n *\n * Cursor supports six lifecycle hooks (via .cursor/hooks.json):\n * beforeSubmitPrompt, beforeShellExecution, beforeMCPExecution,\n * beforeReadFile, afterFileEdit, stop\n *\n * Reference: https://docs.cursor.com/configuration/hooks\n */\nconst EVENT_MAP: Record<string, string[]> = {\n \"session:start\": [],\n \"session:end\": [\"stop\"],\n \"prompt:submit\": [\"beforeSubmitPrompt\"],\n \"prompt:response\": [\"stop\"],\n \"tool:before\": [\"beforeMCPExecution\"],\n \"tool:after\": [],\n \"file:read\": [\"beforeReadFile\"],\n \"file:write\": [\"afterFileEdit\"],\n \"file:edit\": [\"afterFileEdit\"],\n \"file:delete\": [],\n \"shell:before\": [\"beforeShellExecution\"],\n \"shell:after\": [],\n \"mcp:before\": [\"beforeMCPExecution\"],\n \"mcp:after\": [],\n};\n\nconst REVERSE_MAP: Record<string, HookEventType[]> = {\n beforeSubmitPrompt: [\"prompt:submit\"],\n beforeShellExecution: [\"shell:before\"],\n beforeMCPExecution: [\"tool:before\", \"mcp:before\"],\n beforeReadFile: [\"file:read\"],\n afterFileEdit: [\"file:write\", \"file:edit\"],\n stop: [\"session:end\", \"prompt:response\"],\n};\n\n/**\n * Cursor adapter for ai-hooks.\n *\n * Generates `.cursor/hooks.json` with hook entries and a runner script.\n * Cursor hooks use a `{ \"version\": 1, \"hooks\": { ... } }` format.\n *\n * For blocking hooks (beforeShellExecution, beforeMCPExecution), the\n * runner outputs JSON with `{ \"permission\": \"deny\" }` to block execution.\n *\n * Reference: https://docs.cursor.com/configuration/hooks\n */\nclass CursorAdapter extends BaseAdapter {\n readonly id = \"cursor\";\n readonly name = \"Cursor\";\n readonly version = \"1.0\";\n\n readonly capabilities: AdapterCapabilities = {\n beforeHooks: true,\n afterHooks: true,\n mcp: true,\n configFile: true,\n supportedEvents: [\n \"session:end\",\n \"prompt:submit\",\n \"prompt:response\",\n \"tool:before\",\n \"file:read\",\n \"file:write\",\n \"file:edit\",\n \"shell:before\",\n \"mcp:before\",\n ],\n blockableEvents: [\"shell:before\", \"mcp:before\", \"tool:before\"],\n };\n\n async detect(): Promise<boolean> {\n const hasCommand = await this.commandExists(\"cursor\");\n const hasDir = existsSync(resolve(process.cwd(), \".cursor\"));\n return hasCommand || hasDir;\n }\n\n async generate(hooks: HookDefinition[]): Promise<GeneratedConfig[]> {\n const configs: GeneratedConfig[] = [];\n\n // Collect needed native events\n const neededEvents = new Set<string>();\n for (const hook of hooks) {\n for (const event of hook.events) {\n const nativeEvents = this.mapEvent(event);\n for (const ne of nativeEvents) {\n neededEvents.add(ne);\n }\n }\n }\n\n // Generate the runner script\n configs.push({\n path: \".cursor/hooks/ai-hooks-runner.js\",\n content: this.generateRunner(),\n format: \"js\",\n });\n\n // Build Cursor hooks.json\n const hooksConfig: Record<string, unknown[]> = {};\n\n for (const event of neededEvents) {\n if (!hooksConfig[event]) {\n hooksConfig[event] = [];\n }\n hooksConfig[event].push({\n command: `node hooks/ai-hooks-runner.js ${event}`,\n });\n }\n\n configs.push({\n path: \".cursor/hooks.json\",\n content: JSON.stringify({ version: 1, hooks: hooksConfig }, null, 2) + \"\\n\",\n format: \"json\",\n });\n\n return configs;\n }\n\n mapEvent(event: HookEventType): string[] {\n return EVENT_MAP[event] ?? [];\n }\n\n mapNativeEvent(nativeEvent: string): HookEventType[] {\n return REVERSE_MAP[nativeEvent] ?? [];\n }\n\n async uninstall(): Promise<void> {\n await this.removeFile(\".cursor/hooks/ai-hooks-runner.js\");\n await this.removeFile(\".cursor/hooks.json\");\n }\n\n private generateRunner(): string {\n return `#!/usr/bin/env node\n/**\n * ai-hooks runner for Cursor.\n * Generated by: ai-hooks generate\n *\n * Cursor passes the hook event name as a CLI argument.\n * Blocking hooks (beforeShellExecution, beforeMCPExecution)\n * return JSON: { \"permission\": \"deny\", \"agentMessage\": \"reason\" }\n *\n * DO NOT EDIT - regenerate with: ai-hooks generate\n */\nimport { loadConfig, HookEngine } from \"@premierstudio/ai-hooks\";\n\nasync function readStdin() {\n const chunks = [];\n for await (const chunk of process.stdin) {\n chunks.push(chunk);\n }\n return Buffer.concat(chunks).toString(\"utf-8\");\n}\n\nasync function run() {\n const hookEventName = process.argv[2] ?? \"\";\n let input = {};\n try {\n const raw = await readStdin();\n input = JSON.parse(raw || \"{}\");\n } catch {\n input = {};\n }\n\n const config = await loadConfig();\n const engine = new HookEngine(config);\n const toolInfo = { name: \"cursor\", version: \"1.0\" };\n const timestamp = Date.now();\n const metadata = {};\n\n let event;\n switch (hookEventName) {\n case \"beforeSubmitPrompt\":\n event = { type: \"prompt:submit\", prompt: input.prompt ?? \"\", timestamp, metadata };\n break;\n case \"beforeShellExecution\":\n event = { type: \"shell:before\", command: input.command ?? \"\", cwd: process.cwd(), timestamp, metadata };\n break;\n case \"beforeMCPExecution\":\n event = { type: \"mcp:before\", server: input.server ?? \"\", method: input.method ?? \"\", params: input.params ?? {}, timestamp, metadata };\n break;\n case \"beforeReadFile\":\n event = { type: \"file:read\", path: input.path ?? \"\", timestamp, metadata };\n break;\n case \"afterFileEdit\":\n event = { type: \"file:edit\", path: input.path ?? \"\", oldContent: \"\", newContent: \"\", timestamp, metadata };\n break;\n case \"stop\":\n event = { type: \"session:end\", tool: \"cursor\", duration: 0, timestamp, metadata };\n break;\n default:\n process.exit(0);\n }\n\n const results = await engine.emit(event, toolInfo);\n const blocked = results.find((r) => r.blocked);\n\n if (blocked) {\n const response = JSON.stringify({\n permission: \"deny\",\n agentMessage: blocked.reason ?? \"Blocked by ai-hooks\",\n userMessage: blocked.reason ?? \"Blocked by ai-hooks\",\n });\n process.stdout.write(response);\n process.exit(0);\n }\n\n if (hookEventName === \"beforeShellExecution\" || hookEventName === \"beforeMCPExecution\") {\n process.stdout.write(JSON.stringify({ permission: \"allow\" }));\n }\n}\n\nrun().catch((err) => {\n console.error(\"[ai-hooks] Error:\", err.message);\n process.exit(1);\n});\n`;\n }\n}\n\n// Auto-register\nconst adapter = new CursorAdapter();\nregistry.register(adapter);\n\nexport { CursorAdapter };\nexport default adapter;\n","import { BaseAdapter, registry } from \"./index.js\";\nimport type {\n AdapterCapabilities,\n GeneratedConfig,\n HookDefinition,\n HookEventType,\n} from \"../types/index.js\";\nimport { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { readFile } from \"node:fs/promises\";\n\n/**\n * Event mapping: ai-hooks universal events -> Factory Droid native hooks.\n *\n * Droid supports nine hook events:\n * PreToolUse, PostToolUse, UserPromptSubmit, Notification,\n * Stop, SubagentStop, PreCompact, SessionStart, SessionEnd\n *\n * Hook input is JSON via STDIN with tool_name, tool_input, etc.\n * Exit code 2 blocks on PreToolUse; STDERR is sent to Droid.\n *\n * Reference: https://docs.factory.ai/reference/hooks-reference\n */\nconst EVENT_MAP: Record<string, string[]> = {\n \"session:start\": [\"SessionStart\"],\n \"session:end\": [\"SessionEnd\"],\n \"prompt:submit\": [\"UserPromptSubmit\"],\n \"prompt:response\": [\"Stop\"],\n \"tool:before\": [\"PreToolUse\"],\n \"tool:after\": [\"PostToolUse\"],\n \"file:read\": [\"PreToolUse\"],\n \"file:write\": [\"PreToolUse\"],\n \"file:edit\": [\"PreToolUse\"],\n \"file:delete\": [\"PreToolUse\"],\n \"shell:before\": [\"PreToolUse\"],\n \"shell:after\": [\"PostToolUse\"],\n \"mcp:before\": [\"PreToolUse\"],\n \"mcp:after\": [\"PostToolUse\"],\n notification: [\"Notification\"],\n};\n\nconst REVERSE_MAP: Record<string, HookEventType[]> = {\n SessionStart: [\"session:start\"],\n SessionEnd: [\"session:end\"],\n UserPromptSubmit: [\"prompt:submit\"],\n Stop: [\"prompt:response\"],\n PreToolUse: [\n \"tool:before\",\n \"file:read\",\n \"file:write\",\n \"file:edit\",\n \"file:delete\",\n \"shell:before\",\n \"mcp:before\",\n ],\n PostToolUse: [\"tool:after\", \"shell:after\", \"mcp:after\"],\n Notification: [\"notification\"],\n};\n\n/**\n * Factory Droid adapter for ai-hooks.\n *\n * Generates `.factory/settings.json` hook entries and a runner script.\n * Droid uses a settings.json format very similar to Claude Code, with\n * hooks keyed by event name containing matcher patterns and commands.\n *\n * Hook scripts receive JSON via STDIN with session_id, cwd, tool_name,\n * tool_input, and hook_event_name. Exit code 2 blocks PreToolUse hooks\n * and STDERR is processed by Droid as feedback.\n *\n * Reference: https://docs.factory.ai/cli/configuration/hooks-guide\n */\nclass DroidAdapter extends BaseAdapter {\n readonly id = \"droid\";\n readonly name = \"Factory Droid\";\n readonly version = \"1.0\";\n\n readonly capabilities: AdapterCapabilities = {\n beforeHooks: true,\n afterHooks: true,\n mcp: true,\n configFile: true,\n supportedEvents: [\n \"session:start\",\n \"session:end\",\n \"prompt:submit\",\n \"prompt:response\",\n \"tool:before\",\n \"tool:after\",\n \"file:read\",\n \"file:write\",\n \"file:edit\",\n \"file:delete\",\n \"shell:before\",\n \"shell:after\",\n \"mcp:before\",\n \"mcp:after\",\n \"notification\",\n ],\n blockableEvents: [\n \"tool:before\",\n \"file:read\",\n \"file:write\",\n \"file:edit\",\n \"file:delete\",\n \"shell:before\",\n \"mcp:before\",\n ],\n };\n\n async detect(): Promise<boolean> {\n const hasCommand = await this.commandExists(\"droid\");\n const hasDir = existsSync(resolve(process.cwd(), \".factory\"));\n return hasCommand || hasDir;\n }\n\n async generate(hooks: HookDefinition[]): Promise<GeneratedConfig[]> {\n const configs: GeneratedConfig[] = [];\n\n // Collect needed native events\n const neededEvents = new Set<string>();\n for (const hook of hooks) {\n for (const event of hook.events) {\n const nativeEvents = this.mapEvent(event);\n for (const ne of nativeEvents) {\n neededEvents.add(ne);\n }\n }\n }\n\n // Generate the runner script\n configs.push({\n path: \".factory/hooks/ai-hooks-runner.js\",\n content: this.generateRunner(),\n format: \"js\",\n });\n\n // Build Droid settings hooks config\n const hooksConfig: Record<string, unknown[]> = {};\n const runnerAbsPath = resolve(process.cwd(), \".factory/hooks/ai-hooks-runner.js\");\n\n for (const event of neededEvents) {\n const hookEntry: Record<string, unknown> = {\n hooks: [\n {\n type: \"command\",\n command: `node ${runnerAbsPath}`,\n timeout: 30,\n },\n ],\n };\n\n // Tool-related events support matchers\n if (event === \"PreToolUse\" || event === \"PostToolUse\") {\n hookEntry.matcher = \"*\";\n }\n\n if (!hooksConfig[event]) {\n hooksConfig[event] = [];\n }\n hooksConfig[event].push(hookEntry);\n }\n\n // Merge with existing settings if present\n const settingsConfig = await this.mergeSettings(hooksConfig);\n\n configs.push({\n path: \".factory/settings.json\",\n content: JSON.stringify(settingsConfig, null, 2) + \"\\n\",\n format: \"json\",\n });\n\n return configs;\n }\n\n mapEvent(event: HookEventType): string[] {\n return EVENT_MAP[event] ?? [];\n }\n\n mapNativeEvent(nativeEvent: string): HookEventType[] {\n return REVERSE_MAP[nativeEvent] ?? [];\n }\n\n async uninstall(): Promise<void> {\n await this.removeFile(\".factory/hooks/ai-hooks-runner.js\");\n }\n\n private async mergeSettings(\n hooksConfig: Record<string, unknown[]>,\n ): Promise<Record<string, unknown>> {\n const settingsPath = resolve(process.cwd(), \".factory/settings.json\");\n let existing: Record<string, unknown> = {};\n\n if (existsSync(settingsPath)) {\n const raw = await readFile(settingsPath, \"utf-8\");\n existing = JSON.parse(raw);\n }\n\n // Merge hooks: preserve non-ai-hooks entries\n const existingHooks = (existing.hooks ?? {}) as Record<string, unknown[]>;\n const mergedHooks: Record<string, unknown[]> = { ...existingHooks };\n\n for (const [event, entries] of Object.entries(hooksConfig)) {\n if (!mergedHooks[event]) {\n mergedHooks[event] = [];\n }\n // Remove old ai-hooks entries (identified by runner path)\n mergedHooks[event] = (\n mergedHooks[event] as Array<{\n hooks?: Array<{ command?: string }>;\n }>\n ).filter((entry) => !entry.hooks?.some((h) => h.command?.includes(\"ai-hooks-runner\")));\n mergedHooks[event].push(...entries);\n }\n\n return {\n ...existing,\n hooks: mergedHooks,\n };\n }\n\n private generateRunner(): string {\n return `#!/usr/bin/env node\n/**\n * ai-hooks runner for Factory Droid.\n * Generated by: ai-hooks generate\n *\n * Droid passes hook event data as JSON via STDIN with:\n * hook_event_name, session_id, cwd, tool_name, tool_input, tool_response\n *\n * Exit code 0 = success, exit code 2 = block (PreToolUse).\n * STDERR on exit code 2 is fed back to Droid as context.\n *\n * DO NOT EDIT - regenerate with: ai-hooks generate\n */\nimport { loadConfig, HookEngine } from \"@premierstudio/ai-hooks\";\n\nasync function readStdin() {\n const chunks = [];\n for await (const chunk of process.stdin) {\n chunks.push(chunk);\n }\n return Buffer.concat(chunks).toString(\"utf-8\");\n}\n\nasync function run() {\n const raw = await readStdin();\n const input = JSON.parse(raw || \"{}\");\n const hookEventName = input.hook_event_name ?? \"\";\n const toolName = input.tool_name ?? \"\";\n const toolInput = input.tool_input ?? {};\n const toolResponse = input.tool_response ?? {};\n\n const config = await loadConfig();\n const engine = new HookEngine(config);\n const toolInfo = { name: \"droid\", version: \"1.0\" };\n const timestamp = Date.now();\n const metadata = { sessionId: input.session_id ?? \"\" };\n\n let event;\n switch (hookEventName) {\n case \"SessionStart\":\n event = {\n type: \"session:start\",\n tool: \"droid\",\n version: \"1.0\",\n workingDirectory: input.cwd ?? process.cwd(),\n timestamp,\n metadata,\n };\n break;\n case \"SessionEnd\":\n event = { type: \"session:end\", tool: \"droid\", duration: 0, timestamp, metadata };\n break;\n case \"UserPromptSubmit\":\n event = { type: \"prompt:submit\", prompt: toolInput.prompt ?? \"\", timestamp, metadata };\n break;\n case \"Notification\":\n event = { type: \"notification\", level: \"info\", message: toolInput.message ?? \"\", timestamp, metadata };\n break;\n case \"Stop\":\n event = { type: \"session:end\", tool: \"droid\", duration: 0, timestamp, metadata };\n break;\n case \"PreToolUse\":\n event = resolvePreToolEvent(toolName, toolInput, timestamp, metadata);\n break;\n case \"PostToolUse\":\n event = resolvePostToolEvent(toolName, toolInput, toolResponse, timestamp, metadata);\n break;\n default:\n process.exit(0);\n }\n\n const results = await engine.emit(event, toolInfo);\n const blocked = results.find((r) => r.blocked);\n\n if (blocked) {\n process.stderr.write(blocked.reason ?? \"Blocked by ai-hooks\");\n process.exit(2);\n }\n}\n\nfunction resolvePreToolEvent(toolName, toolInput, timestamp, metadata) {\n switch (toolName) {\n case \"Write\":\n return { type: \"file:write\", path: toolInput.file_path ?? \"\", content: toolInput.content ?? \"\", timestamp, metadata };\n case \"Edit\":\n return { type: \"file:edit\", path: toolInput.file_path ?? \"\", oldContent: toolInput.old_string ?? \"\", newContent: toolInput.new_string ?? \"\", timestamp, metadata };\n case \"Read\":\n return { type: \"file:read\", path: toolInput.file_path ?? \"\", timestamp, metadata };\n case \"Bash\":\n return { type: \"shell:before\", command: toolInput.command ?? \"\", cwd: process.cwd(), timestamp, metadata };\n default:\n return { type: \"tool:before\", toolName: toolName || \"unknown\", input: toolInput, timestamp, metadata };\n }\n}\n\nfunction resolvePostToolEvent(toolName, toolInput, toolResponse, timestamp, metadata) {\n switch (toolName) {\n case \"Bash\":\n return {\n type: \"shell:after\",\n command: toolInput.command ?? \"\",\n cwd: process.cwd(),\n exitCode: toolResponse.exitCode ?? 0,\n stdout: toolResponse.stdout ?? \"\",\n stderr: toolResponse.stderr ?? \"\",\n duration: 0,\n timestamp,\n metadata,\n };\n default:\n return { type: \"tool:after\", toolName: toolName || \"unknown\", input: toolInput, output: toolResponse, duration: 0, timestamp, metadata };\n }\n}\n\nrun().catch((err) => {\n console.error(\"[ai-hooks] Error:\", err.message);\n process.exit(1);\n});\n`;\n }\n}\n\n// Auto-register\nconst adapter = new DroidAdapter();\nregistry.register(adapter);\n\nexport { DroidAdapter };\nexport default adapter;\n","import { BaseAdapter, registry } from \"./index.js\";\nimport type {\n AdapterCapabilities,\n GeneratedConfig,\n HookDefinition,\n HookEventType,\n} from \"../types/index.js\";\nimport { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\n\n/**\n * Event mapping: ai-hooks -> Gemini CLI native hooks.\n *\n * Gemini CLI uses GEMINI_HOOKS_DIR with event-named scripts.\n * Reference: https://github.com/google/gemini-cli\n */\nconst EVENT_MAP: Record<string, string[]> = {\n \"session:start\": [\"SessionStart\"],\n \"session:end\": [\"SessionEnd\"],\n \"prompt:submit\": [\"BeforePrompt\"],\n \"prompt:response\": [\"AfterResponse\"],\n \"tool:before\": [\"BeforeTool\"],\n \"tool:after\": [\"AfterTool\"],\n \"file:write\": [\"BeforeTool\"], // FileWrite tool\n \"file:edit\": [\"BeforeTool\"], // FileEdit tool\n \"file:delete\": [\"BeforeTool\"], // FileDelete tool\n \"shell:before\": [\"BeforeShell\"],\n \"shell:after\": [\"AfterShell\"],\n \"mcp:before\": [\"BeforeTool\"],\n \"mcp:after\": [\"AfterTool\"],\n};\n\nconst REVERSE_MAP: Record<string, HookEventType[]> = {\n SessionStart: [\"session:start\"],\n SessionEnd: [\"session:end\"],\n BeforePrompt: [\"prompt:submit\"],\n AfterResponse: [\"prompt:response\"],\n BeforeTool: [\"tool:before\", \"file:write\", \"file:edit\", \"file:delete\", \"mcp:before\"],\n AfterTool: [\"tool:after\", \"mcp:after\"],\n BeforeShell: [\"shell:before\"],\n AfterShell: [\"shell:after\"],\n};\n\nclass GeminiCliAdapter extends BaseAdapter {\n readonly id = \"gemini-cli\";\n readonly name = \"Gemini CLI\";\n readonly version = \"1.0\";\n\n readonly capabilities: AdapterCapabilities = {\n beforeHooks: true,\n afterHooks: true,\n mcp: true,\n configFile: true,\n supportedEvents: [\n \"session:start\",\n \"session:end\",\n \"prompt:submit\",\n \"prompt:response\",\n \"tool:before\",\n \"tool:after\",\n \"file:write\",\n \"file:edit\",\n \"file:delete\",\n \"shell:before\",\n \"shell:after\",\n \"mcp:before\",\n \"mcp:after\",\n ],\n blockableEvents: [\n \"prompt:submit\",\n \"tool:before\",\n \"file:write\",\n \"file:edit\",\n \"file:delete\",\n \"shell:before\",\n \"mcp:before\",\n ],\n };\n\n async detect(): Promise<boolean> {\n const hasCommand = await this.commandExists(\"gemini\");\n const hasConfig = existsSync(resolve(process.cwd(), \".gemini\"));\n return hasCommand || hasConfig;\n }\n\n async generate(hooks: HookDefinition[]): Promise<GeneratedConfig[]> {\n const configs: GeneratedConfig[] = [];\n\n // Gemini CLI uses a hooks directory with scripts named by event\n const neededEvents = new Set<string>();\n for (const hook of hooks) {\n for (const event of hook.events) {\n const nativeEvents = this.mapEvent(event);\n for (const ne of nativeEvents) {\n neededEvents.add(ne);\n }\n }\n }\n\n // Generate a hook script for each needed event\n for (const event of neededEvents) {\n configs.push({\n path: `.gemini/hooks/${event}.js`,\n content: this.generateEventScript(event),\n format: \"js\",\n });\n }\n\n // Generate settings to enable hooks\n configs.push({\n path: \".gemini/settings.json\",\n content:\n JSON.stringify(\n {\n hooks: {\n enabled: true,\n directory: \".gemini/hooks\",\n },\n },\n null,\n 2,\n ) + \"\\n\",\n format: \"json\",\n });\n\n return configs;\n }\n\n mapEvent(event: HookEventType): string[] {\n return EVENT_MAP[event] ?? [];\n }\n\n mapNativeEvent(nativeEvent: string): HookEventType[] {\n return REVERSE_MAP[nativeEvent] ?? [];\n }\n\n async uninstall(): Promise<void> {\n // Remove hook scripts\n for (const event of Object.keys(REVERSE_MAP)) {\n await this.removeFile(`.gemini/hooks/${event}.js`);\n }\n }\n\n private generateEventScript(nativeEvent: string): string {\n return `#!/usr/bin/env node\n/**\n * ai-hooks runner for Gemini CLI (${nativeEvent}).\n * Generated by: ai-hooks generate\n */\nimport { loadConfig, HookEngine } from \"@premierstudio/ai-hooks\";\n\nconst input = JSON.parse(process.env.GEMINI_HOOK_INPUT ?? \"{}\");\n\nasync function run() {\n const config = await loadConfig();\n const engine = new HookEngine(config);\n const toolInfo = { name: \"gemini-cli\", version: \"1.0\" };\n const timestamp = Date.now();\n const metadata = {};\n\n let event;\n switch (\"${nativeEvent}\") {\n case \"SessionStart\":\n event = { type: \"session:start\", tool: \"gemini-cli\", version: \"1.0\", workingDirectory: process.cwd(), timestamp, metadata };\n break;\n case \"BeforeShell\":\n event = { type: \"shell:before\", command: input.command ?? \"\", cwd: process.cwd(), timestamp, metadata };\n break;\n case \"BeforeTool\":\n event = { type: \"tool:before\", toolName: input.toolName ?? \"unknown\", input, timestamp, metadata };\n break;\n case \"BeforePrompt\":\n event = { type: \"prompt:submit\", prompt: input.prompt ?? \"\", timestamp, metadata };\n break;\n default:\n event = { type: \"tool:after\", toolName: \"${nativeEvent}\", input, output: {}, duration: 0, timestamp, metadata };\n }\n\n const results = await engine.emit(event, toolInfo);\n const blocked = results.find((r) => r.blocked);\n\n if (blocked) {\n console.log(JSON.stringify({ blocked: true, reason: blocked.reason }));\n process.exit(1);\n }\n}\n\nrun().catch(() => process.exit(1));\n`;\n }\n}\n\nconst adapter = new GeminiCliAdapter();\nregistry.register(adapter);\n\nexport { GeminiCliAdapter };\nexport default adapter;\n","import { BaseAdapter, registry } from \"./index.js\";\nimport type {\n AdapterCapabilities,\n GeneratedConfig,\n HookDefinition,\n HookEventType,\n} from \"../types/index.js\";\nimport { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\n\n/**\n * Event mapping: ai-hooks universal events -> Kiro CLI native hooks.\n *\n * Kiro supports five hook types:\n * agentSpawn, userPromptSubmit, preToolUse, postToolUse, stop\n *\n * Reference: https://kiro.dev/docs/cli/hooks/\n */\nconst EVENT_MAP: Record<string, string[]> = {\n \"session:start\": [\"agentSpawn\"],\n \"session:end\": [\"stop\"],\n \"prompt:submit\": [\"userPromptSubmit\"],\n \"prompt:response\": [\"stop\"],\n \"tool:before\": [\"preToolUse\"],\n \"tool:after\": [\"postToolUse\"],\n \"file:read\": [\"preToolUse\"],\n \"file:write\": [\"preToolUse\"],\n \"file:edit\": [\"preToolUse\"],\n \"file:delete\": [\"preToolUse\"],\n \"shell:before\": [\"preToolUse\"],\n \"shell:after\": [\"postToolUse\"],\n \"mcp:before\": [\"preToolUse\"],\n \"mcp:after\": [\"postToolUse\"],\n};\n\nconst REVERSE_MAP: Record<string, HookEventType[]> = {\n agentSpawn: [\"session:start\"],\n userPromptSubmit: [\"prompt:submit\"],\n preToolUse: [\n \"tool:before\",\n \"file:read\",\n \"file:write\",\n \"file:edit\",\n \"file:delete\",\n \"shell:before\",\n \"mcp:before\",\n ],\n postToolUse: [\"tool:after\", \"shell:after\", \"mcp:after\"],\n stop: [\"session:end\", \"prompt:response\"],\n};\n\n/**\n * Kiro CLI adapter for ai-hooks.\n *\n * Generates hook entries for Kiro's agent configuration format. Kiro uses\n * JSON agent config files in `.kiro/` with a `hooks` section containing\n * agentSpawn, userPromptSubmit, preToolUse, postToolUse, and stop events.\n *\n * Hook scripts receive event data as JSON via STDIN. Exit code 2 blocks\n * execution on preToolUse hooks.\n *\n * Reference: https://kiro.dev/docs/cli/hooks/\n */\nclass KiroAdapter extends BaseAdapter {\n readonly id = \"kiro\";\n readonly name = \"Kiro CLI\";\n readonly version = \"1.0\";\n\n readonly capabilities: AdapterCapabilities = {\n beforeHooks: true,\n afterHooks: true,\n mcp: true,\n configFile: true,\n supportedEvents: [\n \"session:start\",\n \"session:end\",\n \"prompt:submit\",\n \"prompt:response\",\n \"tool:before\",\n \"tool:after\",\n \"file:read\",\n \"file:write\",\n \"file:edit\",\n \"file:delete\",\n \"shell:before\",\n \"shell:after\",\n \"mcp:before\",\n \"mcp:after\",\n ],\n blockableEvents: [\n \"tool:before\",\n \"file:read\",\n \"file:write\",\n \"file:edit\",\n \"file:delete\",\n \"shell:before\",\n \"mcp:before\",\n ],\n };\n\n async detect(): Promise<boolean> {\n const hasCommand = await this.commandExists(\"kiro\");\n const hasDir = existsSync(resolve(process.cwd(), \".kiro\"));\n return hasCommand || hasDir;\n }\n\n async generate(hooks: HookDefinition[]): Promise<GeneratedConfig[]> {\n const configs: GeneratedConfig[] = [];\n\n // Collect needed native events\n const neededEvents = new Set<string>();\n for (const hook of hooks) {\n for (const event of hook.events) {\n const nativeEvents = this.mapEvent(event);\n for (const ne of nativeEvents) {\n neededEvents.add(ne);\n }\n }\n }\n\n // Generate the runner script\n configs.push({\n path: \".kiro/hooks/ai-hooks-runner.js\",\n content: this.generateRunner(),\n format: \"js\",\n });\n\n // Build Kiro hooks config\n const hooksConfig: Record<string, unknown[]> = {};\n\n for (const event of neededEvents) {\n const entry: Record<string, unknown> = {\n command: \"node .kiro/hooks/ai-hooks-runner.js\",\n };\n\n // preToolUse and postToolUse support matchers; use wildcard\n if (event === \"preToolUse\" || event === \"postToolUse\") {\n entry.matcher = \"*\";\n }\n\n if (!hooksConfig[event]) {\n hooksConfig[event] = [];\n }\n hooksConfig[event].push(entry);\n }\n\n configs.push({\n path: \".kiro/hooks/ai-hooks.json\",\n content: JSON.stringify({ hooks: hooksConfig }, null, 2) + \"\\n\",\n format: \"json\",\n });\n\n return configs;\n }\n\n mapEvent(event: HookEventType): string[] {\n return EVENT_MAP[event] ?? [];\n }\n\n mapNativeEvent(nativeEvent: string): HookEventType[] {\n return REVERSE_MAP[nativeEvent] ?? [];\n }\n\n async uninstall(): Promise<void> {\n await this.removeFile(\".kiro/hooks/ai-hooks-runner.js\");\n await this.removeFile(\".kiro/hooks/ai-hooks.json\");\n }\n\n private generateRunner(): string {\n return `#!/usr/bin/env node\n/**\n * ai-hooks runner for Kiro CLI.\n * Generated by: ai-hooks generate\n *\n * Kiro passes hook event data as JSON via STDIN.\n * Exit code 0 = success, exit code 2 = block (preToolUse only).\n *\n * DO NOT EDIT - regenerate with: ai-hooks generate\n */\nimport { loadConfig, HookEngine } from \"@premierstudio/ai-hooks\";\n\nasync function readStdin() {\n const chunks = [];\n for await (const chunk of process.stdin) {\n chunks.push(chunk);\n }\n return Buffer.concat(chunks).toString(\"utf-8\");\n}\n\nasync function run() {\n const raw = await readStdin();\n const input = JSON.parse(raw || \"{}\");\n const hookEventName = input.hook_event_name ?? \"\";\n const toolName = input.tool_name ?? \"\";\n const toolInput = input.tool_input ?? {};\n\n const config = await loadConfig();\n const engine = new HookEngine(config);\n const toolInfo = { name: \"kiro\", version: \"1.0\" };\n const timestamp = Date.now();\n const metadata = {};\n\n let event;\n switch (hookEventName) {\n case \"agentSpawn\":\n event = {\n type: \"session:start\",\n tool: \"kiro\",\n version: \"1.0\",\n workingDirectory: input.cwd ?? process.cwd(),\n timestamp,\n metadata,\n };\n break;\n case \"userPromptSubmit\":\n event = {\n type: \"prompt:submit\",\n prompt: toolInput.prompt ?? \"\",\n timestamp,\n metadata,\n };\n break;\n case \"preToolUse\":\n event = resolvePreToolEvent(toolName, toolInput, timestamp, metadata);\n break;\n case \"postToolUse\":\n event = resolvePostToolEvent(toolName, toolInput, input.tool_response ?? {}, timestamp, metadata);\n break;\n case \"stop\":\n event = {\n type: \"session:end\",\n tool: \"kiro\",\n duration: 0,\n timestamp,\n metadata,\n };\n break;\n default:\n process.exit(0);\n }\n\n const results = await engine.emit(event, toolInfo);\n const blocked = results.find((r) => r.blocked);\n\n if (blocked) {\n process.stderr.write(blocked.reason ?? \"Blocked by ai-hooks\");\n process.exit(2);\n }\n}\n\nfunction resolvePreToolEvent(toolName, toolInput, timestamp, metadata) {\n switch (toolName) {\n case \"fs_write\":\n case \"write\":\n return { type: \"file:write\", path: toolInput.path ?? \"\", content: toolInput.content ?? \"\", timestamp, metadata };\n case \"fs_edit\":\n case \"edit\":\n return { type: \"file:edit\", path: toolInput.path ?? \"\", oldContent: toolInput.old_string ?? \"\", newContent: toolInput.new_string ?? \"\", timestamp, metadata };\n case \"fs_read\":\n case \"read\":\n return { type: \"file:read\", path: toolInput.path ?? \"\", timestamp, metadata };\n case \"execute_bash\":\n case \"shell\":\n return { type: \"shell:before\", command: toolInput.command ?? \"\", cwd: process.cwd(), timestamp, metadata };\n default:\n return { type: \"tool:before\", toolName: toolName || \"unknown\", input: toolInput, timestamp, metadata };\n }\n}\n\nfunction resolvePostToolEvent(toolName, toolInput, toolResponse, timestamp, metadata) {\n switch (toolName) {\n case \"execute_bash\":\n case \"shell\":\n return {\n type: \"shell:after\",\n command: toolInput.command ?? \"\",\n cwd: process.cwd(),\n exitCode: toolResponse.exitCode ?? 0,\n stdout: toolResponse.stdout ?? \"\",\n stderr: toolResponse.stderr ?? \"\",\n duration: 0,\n timestamp,\n metadata,\n };\n default:\n return { type: \"tool:after\", toolName: toolName || \"unknown\", input: toolInput, output: toolResponse, duration: 0, timestamp, metadata };\n }\n}\n\nrun().catch((err) => {\n console.error(\"[ai-hooks] Error:\", err.message);\n process.exit(1);\n});\n`;\n }\n}\n\n// Auto-register\nconst adapter = new KiroAdapter();\nregistry.register(adapter);\n\nexport { KiroAdapter };\nexport default adapter;\n","import { BaseAdapter, registry } from \"./index.js\";\nimport type {\n AdapterCapabilities,\n GeneratedConfig,\n HookDefinition,\n HookEventType,\n} from \"../types/index.js\";\nimport { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\n\n/**\n * Event mapping: ai-hooks universal events -> OpenCode plugin hooks.\n *\n * OpenCode (by SST) uses a plugin system with lifecycle hooks.\n * Plugins are JS/TS modules in `.opencode/plugins/` that export\n * hook handlers keyed by event name.\n *\n * Reference: https://opencode.ai/docs/plugins/\n */\nconst EVENT_MAP: Record<string, string[]> = {\n \"session:start\": [\"session.created\"],\n \"session:end\": [\"session.idle\"],\n \"prompt:submit\": [\"message.updated\"],\n \"prompt:response\": [\"message.part.updated\"],\n \"tool:before\": [\"tool.execute.before\"],\n \"tool:after\": [\"tool.execute.after\"],\n \"file:read\": [\"tool.execute.before\"],\n \"file:write\": [\"tool.execute.before\", \"file.edited\"],\n \"file:edit\": [\"tool.execute.before\", \"file.edited\"],\n \"file:delete\": [\"tool.execute.before\"],\n \"shell:before\": [\"tool.execute.before\"],\n \"shell:after\": [\"tool.execute.after\"],\n \"mcp:before\": [\"tool.execute.before\"],\n \"mcp:after\": [\"tool.execute.after\"],\n notification: [\"tui.toast.show\"],\n};\n\nconst REVERSE_MAP: Record<string, HookEventType[]> = {\n \"session.created\": [\"session:start\"],\n \"session.idle\": [\"session:end\"],\n \"message.updated\": [\"prompt:submit\"],\n \"message.part.updated\": [\"prompt:response\"],\n \"tool.execute.before\": [\n \"tool:before\",\n \"file:read\",\n \"file:write\",\n \"file:edit\",\n \"file:delete\",\n \"shell:before\",\n \"mcp:before\",\n ],\n \"tool.execute.after\": [\"tool:after\", \"shell:after\", \"mcp:after\"],\n \"file.edited\": [\"file:write\", \"file:edit\"],\n \"tui.toast.show\": [\"notification\"],\n};\n\n/**\n * OpenCode adapter for ai-hooks.\n *\n * Generates an OpenCode plugin in `.opencode/plugins/` that hooks into\n * the tool.execute.before/after and other lifecycle events. OpenCode\n * plugins receive context objects and can block tool execution by\n * returning a modified output from tool.execute.before.\n *\n * Reference: https://opencode.ai/docs/plugins/\n */\nclass OpenCodeAdapter extends BaseAdapter {\n readonly id = \"opencode\";\n readonly name = \"OpenCode\";\n readonly version = \"1.0\";\n\n readonly capabilities: AdapterCapabilities = {\n beforeHooks: true,\n afterHooks: true,\n mcp: true,\n configFile: true,\n supportedEvents: [\n \"session:start\",\n \"session:end\",\n \"prompt:submit\",\n \"prompt:response\",\n \"tool:before\",\n \"tool:after\",\n \"file:read\",\n \"file:write\",\n \"file:edit\",\n \"file:delete\",\n \"shell:before\",\n \"shell:after\",\n \"mcp:before\",\n \"mcp:after\",\n \"notification\",\n ],\n blockableEvents: [\n \"tool:before\",\n \"file:read\",\n \"file:write\",\n \"file:edit\",\n \"file:delete\",\n \"shell:before\",\n \"mcp:before\",\n ],\n };\n\n async detect(): Promise<boolean> {\n const hasCommand = await this.commandExists(\"opencode\");\n const hasDir = existsSync(resolve(process.cwd(), \".opencode\"));\n return hasCommand || hasDir;\n }\n\n async generate(hooks: HookDefinition[]): Promise<GeneratedConfig[]> {\n const configs: GeneratedConfig[] = [];\n\n // Collect needed native events\n const neededEvents = new Set<string>();\n for (const hook of hooks) {\n for (const event of hook.events) {\n const nativeEvents = this.mapEvent(event);\n for (const ne of nativeEvents) {\n neededEvents.add(ne);\n }\n }\n }\n\n // Generate the OpenCode plugin\n configs.push({\n path: \".opencode/plugins/ai-hooks-plugin.js\",\n content: this.generatePlugin(neededEvents),\n format: \"js\",\n });\n\n // Generate opencode.json config that registers the plugin\n configs.push({\n path: \".opencode/plugins/package.json\",\n content:\n JSON.stringify(\n {\n name: \"ai-hooks-opencode-plugin\",\n version: \"1.0.0\",\n type: \"module\",\n main: \"ai-hooks-plugin.js\",\n dependencies: {\n \"@premierstudio/ai-hooks\": \"*\",\n },\n },\n null,\n 2,\n ) + \"\\n\",\n format: \"json\",\n });\n\n return configs;\n }\n\n mapEvent(event: HookEventType): string[] {\n return EVENT_MAP[event] ?? [];\n }\n\n mapNativeEvent(nativeEvent: string): HookEventType[] {\n return REVERSE_MAP[nativeEvent] ?? [];\n }\n\n async uninstall(): Promise<void> {\n await this.removeFile(\".opencode/plugins/ai-hooks-plugin.js\");\n await this.removeFile(\".opencode/plugins/package.json\");\n }\n\n private generatePlugin(neededEvents: Set<string>): string {\n const hookEntries = [...neededEvents]\n .map((event) => {\n return ` \"${event}\": async (input, output) => {\n await handleHook(\"${event}\", input, output);\n }`;\n })\n .join(\",\\n\");\n\n return `/**\n * ai-hooks plugin for OpenCode.\n * Generated by: ai-hooks generate\n *\n * This plugin hooks into OpenCode's lifecycle events and delegates\n * to the ai-hooks engine for unified hook management.\n *\n * DO NOT EDIT - regenerate with: ai-hooks generate\n */\nimport { loadConfig, HookEngine } from \"@premierstudio/ai-hooks\";\n\nlet engine;\n\nasync function getEngine() {\n if (!engine) {\n const config = await loadConfig();\n engine = new HookEngine(config);\n }\n return engine;\n}\n\nasync function handleHook(hookName, input, output) {\n const eng = await getEngine();\n const toolInfo = { name: \"opencode\", version: \"1.0\" };\n const timestamp = Date.now();\n const metadata = {};\n\n let event;\n switch (hookName) {\n case \"session.created\":\n event = { type: \"session:start\", tool: \"opencode\", version: \"1.0\", workingDirectory: process.cwd(), timestamp, metadata };\n break;\n case \"session.idle\":\n event = { type: \"session:end\", tool: \"opencode\", duration: 0, timestamp, metadata };\n break;\n case \"tool.execute.before\":\n event = resolveToolBefore(input, timestamp, metadata);\n break;\n case \"tool.execute.after\":\n event = resolveToolAfter(input, timestamp, metadata);\n break;\n case \"file.edited\":\n event = { type: \"file:edit\", path: input.path ?? \"\", oldContent: \"\", newContent: \"\", timestamp, metadata };\n break;\n case \"message.updated\":\n event = { type: \"prompt:submit\", prompt: input.content ?? \"\", timestamp, metadata };\n break;\n case \"message.part.updated\":\n event = { type: \"prompt:response\", response: input.content ?? \"\", model: \"unknown\", tokens: { input: 0, output: 0 }, timestamp, metadata };\n break;\n case \"tui.toast.show\":\n event = { type: \"notification\", level: \"info\", message: input.message ?? \"\", timestamp, metadata };\n break;\n default:\n return output;\n }\n\n const results = await eng.emit(event, toolInfo);\n const blocked = results.find((r) => r.blocked);\n\n if (blocked && hookName === \"tool.execute.before\") {\n return { ...output, blocked: true, reason: blocked.reason ?? \"Blocked by ai-hooks\" };\n }\n\n return output;\n}\n\nfunction resolveToolBefore(input, timestamp, metadata) {\n const toolName = input.tool ?? input.name ?? \"unknown\";\n const toolInput = input.input ?? input.args ?? {};\n\n switch (toolName) {\n case \"file_write\":\n case \"write\":\n return { type: \"file:write\", path: toolInput.path ?? \"\", content: toolInput.content ?? \"\", timestamp, metadata };\n case \"file_edit\":\n case \"edit\":\n return { type: \"file:edit\", path: toolInput.path ?? \"\", oldContent: toolInput.old ?? \"\", newContent: toolInput.new ?? \"\", timestamp, metadata };\n case \"file_read\":\n case \"read\":\n return { type: \"file:read\", path: toolInput.path ?? \"\", timestamp, metadata };\n case \"bash\":\n case \"shell\":\n return { type: \"shell:before\", command: toolInput.command ?? \"\", cwd: process.cwd(), timestamp, metadata };\n default:\n return { type: \"tool:before\", toolName, input: toolInput, timestamp, metadata };\n }\n}\n\nfunction resolveToolAfter(input, timestamp, metadata) {\n const toolName = input.tool ?? input.name ?? \"unknown\";\n const toolInput = input.input ?? input.args ?? {};\n const toolOutput = input.output ?? input.result ?? {};\n\n switch (toolName) {\n case \"bash\":\n case \"shell\":\n return {\n type: \"shell:after\",\n command: toolInput.command ?? \"\",\n cwd: process.cwd(),\n exitCode: toolOutput.exitCode ?? 0,\n stdout: toolOutput.stdout ?? \"\",\n stderr: toolOutput.stderr ?? \"\",\n duration: 0,\n timestamp,\n metadata,\n };\n default:\n return { type: \"tool:after\", toolName, input: toolInput, output: toolOutput, duration: 0, timestamp, metadata };\n }\n}\n\nexport const AiHooksPlugin = async ({ project, directory }) => {\n return {\n${hookEntries}\n };\n};\n`;\n }\n}\n\n// Auto-register\nconst adapter = new OpenCodeAdapter();\nregistry.register(adapter);\n\nexport { OpenCodeAdapter };\nexport default adapter;\n","import { loadConfig, findConfigFile } from \"../config/index.js\";\nimport { HookEngine } from \"../runtime/index.js\";\nimport { registry } from \"../adapters/registry.js\";\nimport type { Adapter, GeneratedConfig } from \"../types/index.js\";\n\n// Import all adapters to register them\nimport \"../adapters/all.js\";\n\nconst HELP = `\nai-hooks - Universal hooks framework for AI coding tools\n\nUSAGE:\n ai-hooks <command> [options]\n\nCOMMANDS:\n init Create an ai-hooks.config.ts in the current directory\n detect Detect which AI tools are installed\n generate Generate native configs for detected/specified tools\n install Generate and install hooks into detected tools\n uninstall Remove ai-hooks from all detected tools\n list List all registered hooks from your config\n status Show current hook status across tools\n help Show this help message\n\nOPTIONS:\n --tools Comma-separated list of tools (e.g., --tools=claude-code,codex)\n --config Path to config file (default: ai-hooks.config.ts)\n --verbose Show detailed output\n --dry-run Show what would be generated without writing files\n\nEXAMPLES:\n ai-hooks init # Create config file\n ai-hooks detect # See which AI tools are installed\n ai-hooks generate # Generate configs for all detected tools\n ai-hooks install --tools=claude-code # Install hooks for Claude Code only\n`;\n\ntype Flags = {\n tools?: string;\n config?: string;\n verbose?: boolean;\n dryRun?: boolean;\n};\n\nexport async function run(args: string[]): Promise<void> {\n const command = args[0];\n const flags = parseFlags(args.slice(1));\n\n switch (command) {\n case \"init\":\n await cmdInit(flags);\n break;\n case \"detect\":\n await cmdDetect(flags);\n break;\n case \"generate\":\n await cmdGenerate(flags);\n break;\n case \"install\":\n await cmdInstall(flags);\n break;\n case \"uninstall\":\n await cmdUninstall(flags);\n break;\n case \"list\":\n await cmdList(flags);\n break;\n case \"status\":\n await cmdStatus(flags);\n break;\n case \"help\":\n case \"--help\":\n case \"-h\":\n case undefined:\n console.log(HELP);\n break;\n default:\n console.error(`Unknown command: ${command}`);\n console.log(HELP);\n process.exit(1);\n }\n}\n\n// ── Commands ────────────────────────────────────────────────\n\nasync function cmdInit(flags: Flags): Promise<void> {\n const existing = findConfigFile();\n if (existing) {\n console.log(`Config already exists: ${existing}`);\n return;\n }\n\n const { writeFile } = await import(\"node:fs/promises\");\n\n const template = `import { defineConfig, hook, builtinHooks } from \"@premierstudio/ai-hooks\";\n\nexport default defineConfig({\n // Start with built-in security hooks\n extends: [{ hooks: builtinHooks }],\n\n hooks: [\n // Add your custom hooks here:\n //\n // hook(\"before\", [\"shell:before\"], async (ctx, next) => {\n // console.log(\"Running:\", ctx.event.command);\n // await next();\n // })\n // .id(\"my-hook\")\n // .name(\"Log Shell Commands\")\n // .build(),\n ],\n\n settings: {\n logLevel: \"warn\",\n hookTimeout: 5000,\n failMode: \"open\",\n },\n});\n`;\n\n if (flags.dryRun) {\n console.log(\"[dry-run] Would create ai-hooks.config.ts\");\n return;\n }\n\n await writeFile(\"ai-hooks.config.ts\", template, \"utf-8\");\n console.log(\"Created ai-hooks.config.ts\");\n console.log(\"\");\n console.log(\"Next steps:\");\n console.log(\" 1. Edit ai-hooks.config.ts to add your hooks\");\n console.log(\" 2. Run: ai-hooks detect (see which AI tools are installed)\");\n console.log(\" 3. Run: ai-hooks install (install hooks into your tools)\");\n}\n\nasync function cmdDetect(flags: Flags): Promise<void> {\n console.log(\"Detecting AI coding tools...\\n\");\n\n const detected = await registry.detectAll();\n const all = registry.list();\n\n for (const id of all) {\n const adapter = registry.get(id);\n if (!adapter) continue;\n\n const isDetected = detected.some((d) => d.id === id);\n const icon = isDetected ? \"\\u2713\" : \"\\u2717\";\n const color = isDetected ? \"\\x1b[32m\" : \"\\x1b[90m\";\n const reset = \"\\x1b[0m\";\n\n const caps: string[] = [];\n if (adapter.capabilities.beforeHooks) caps.push(\"hooks\");\n if (adapter.capabilities.mcp) caps.push(\"mcp\");\n\n let line = ` ${color}${icon}${reset} ${adapter.name.padEnd(20)} ${caps.join(\", \")}`;\n if (flags.verbose) {\n line += ` (${adapter.capabilities.supportedEvents.length} events)`;\n }\n\n console.log(line);\n }\n\n console.log(`\\nDetected ${detected.length}/${all.length} tools`);\n\n if (detected.length > 0 && !findConfigFile()) {\n console.log('\\nRun \"ai-hooks init\" to create a config file');\n }\n}\n\nasync function cmdGenerate(flags: Flags): Promise<void> {\n const config = await loadConfig(flags.config);\n const adapters = await resolveAdapters(flags);\n\n if (adapters.length === 0) {\n console.log(\"No AI tools detected. Use --tools to specify manually.\");\n return;\n }\n\n console.log(`Generating configs for ${adapters.length} tool(s)...\\n`);\n\n for (const adapter of adapters) {\n const configs = await adapter.generate(config.hooks);\n\n for (const cfg of configs) {\n if (flags.dryRun) {\n console.log(` [dry-run] Would write: ${cfg.path}`);\n } else {\n console.log(` Generated: ${cfg.path}`);\n }\n }\n\n if (!flags.dryRun) {\n await writeConfigs(configs);\n }\n }\n\n console.log(\"\\nDone!\");\n}\n\nasync function cmdInstall(flags: Flags): Promise<void> {\n const config = await loadConfig(flags.config);\n const adapters = await resolveAdapters(flags);\n\n if (adapters.length === 0) {\n console.log(\"No AI tools detected. Use --tools to specify manually.\");\n return;\n }\n\n console.log(`Installing hooks into ${adapters.length} tool(s)...\\n`);\n\n for (const adapter of adapters) {\n const configs = await adapter.generate(config.hooks);\n\n if (flags.dryRun) {\n for (const cfg of configs) {\n console.log(` [dry-run] Would install: ${cfg.path}`);\n }\n } else {\n await adapter.install(configs);\n console.log(` \\u2713 ${adapter.name}`);\n }\n }\n\n console.log(\"\\nHooks installed!\");\n}\n\nasync function cmdUninstall(flags: Flags): Promise<void> {\n const adapters = await resolveAdapters(flags);\n\n for (const adapter of adapters) {\n await adapter.uninstall();\n console.log(` \\u2713 Removed from ${adapter.name}`);\n }\n\n console.log(\"\\nHooks uninstalled.\");\n}\n\nasync function cmdList(flags: Flags): Promise<void> {\n const config = await loadConfig(flags.config);\n const engine = new HookEngine(config);\n const hooks = engine.getHooks();\n\n if (hooks.length === 0) {\n console.log(\"No hooks registered. Edit ai-hooks.config.ts to add hooks.\");\n return;\n }\n\n console.log(`${hooks.length} hook(s) registered:\\n`);\n\n for (const h of hooks) {\n const status = h.enabled === false ? \"\\x1b[90m(disabled)\\x1b[0m\" : \"\";\n const priority = h.priority ?? 100;\n console.log(` [${h.phase}] ${h.name} ${status}`);\n console.log(` id: ${h.id} priority: ${priority} events: ${h.events.join(\", \")}`);\n if (h.description && flags.verbose) {\n console.log(` ${h.description}`);\n }\n console.log(\"\");\n }\n}\n\nasync function cmdStatus(flags: Flags): Promise<void> {\n const hasConfig = findConfigFile();\n const detected = await registry.detectAll();\n\n console.log(\"ai-hooks status\\n\");\n console.log(` Config: ${hasConfig ?? \"not found\"}`);\n console.log(` Tools: ${detected.length} detected`);\n\n if (hasConfig) {\n const config = await loadConfig(flags.config);\n const engine = new HookEngine(config);\n const hooks = engine.getHooks();\n console.log(` Hooks: ${hooks.length} registered`);\n }\n\n console.log(\"\");\n\n for (const adapter of detected) {\n console.log(` \\u2713 ${adapter.name} (${adapter.id})`);\n }\n}\n\n// ── Helpers ─────────────────────────────────────────────────\n\nfunction parseFlags(args: string[]): Flags {\n const flags: Flags = {};\n\n for (const arg of args) {\n if (arg.startsWith(\"--tools=\")) {\n flags.tools = arg.slice(8);\n } else if (arg.startsWith(\"--config=\")) {\n flags.config = arg.slice(9);\n } else if (arg === \"--verbose\") {\n flags.verbose = true;\n } else if (arg === \"--dry-run\") {\n flags.dryRun = true;\n }\n }\n\n return flags;\n}\n\nasync function resolveAdapters(flags: Flags): Promise<Adapter[]> {\n if (flags.tools) {\n const ids = flags.tools.split(\",\").map((t) => t.trim());\n const adapters: Adapter[] = [];\n for (const id of ids) {\n const adapter = registry.get(id);\n if (adapter) {\n adapters.push(adapter);\n } else {\n console.warn(` Warning: Unknown adapter \"${id}\"`);\n }\n }\n return adapters;\n }\n\n return registry.detectAll();\n}\n\nasync function writeConfigs(configs: GeneratedConfig[]): Promise<void> {\n const { writeFile, mkdir } = await import(\"node:fs/promises\");\n const { dirname, resolve } = await import(\"node:path\");\n\n for (const cfg of configs) {\n const fullPath = resolve(process.cwd(), cfg.path);\n await mkdir(dirname(fullPath), { recursive: true });\n await writeFile(fullPath, cfg.content, \"utf-8\");\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/cli/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { loadConfig, findConfigFile } from \"../config/index.js\";\nimport { HookEngine } from \"../runtime/index.js\";\nimport { registry } from \"../adapters/registry.js\";\nimport type { Adapter, GeneratedConfig } from \"../types/index.js\";\n\n// Import all adapters to register them\nimport \"../adapters/all.js\";\n\nconst HELP = `\nai-hooks - Universal hooks framework for AI coding tools\n\nUSAGE:\n ai-hooks <command> [options]\n\nCOMMANDS:\n init Create an ai-hooks.config.ts in the current directory\n detect Detect which AI tools are installed\n generate Generate native configs for detected/specified tools\n install Generate and install hooks into detected tools\n uninstall Remove ai-hooks from all detected tools\n list List all registered hooks from your config\n status Show current hook status across tools\n help Show this help message\n\nOPTIONS:\n --tools Comma-separated list of tools (e.g., --tools=claude-code,codex)\n --config Path to config file (default: ai-hooks.config.ts)\n --verbose Show detailed output\n --dry-run Show what would be generated without writing files\n\nEXAMPLES:\n ai-hooks init # Create config file\n ai-hooks detect # See which AI tools are installed\n ai-hooks generate # Generate configs for all detected tools\n ai-hooks install --tools=claude-code # Install hooks for Claude Code only\n`;\n\ntype Flags = {\n tools?: string;\n config?: string;\n verbose?: boolean;\n dryRun?: boolean;\n};\n\nexport async function run(args: string[]): Promise<void> {\n const command = args[0];\n const flags = parseFlags(args.slice(1));\n\n switch (command) {\n case \"init\":\n await cmdInit(flags);\n break;\n case \"detect\":\n await cmdDetect(flags);\n break;\n case \"generate\":\n await cmdGenerate(flags);\n break;\n case \"install\":\n await cmdInstall(flags);\n break;\n case \"uninstall\":\n await cmdUninstall(flags);\n break;\n case \"list\":\n await cmdList(flags);\n break;\n case \"status\":\n await cmdStatus(flags);\n break;\n case \"help\":\n case \"--help\":\n case \"-h\":\n case undefined:\n console.log(HELP);\n break;\n default:\n console.error(`Unknown command: ${command}`);\n console.log(HELP);\n process.exit(1);\n }\n}\n\n// ── Commands ────────────────────────────────────────────────\n\nasync function cmdInit(flags: Flags): Promise<void> {\n const existing = findConfigFile();\n if (existing) {\n console.log(`Config already exists: ${existing}`);\n return;\n }\n\n const { writeFile } = await import(\"node:fs/promises\");\n\n const template = `import { defineConfig, hook, builtinHooks } from \"@premierstudio/ai-hooks\";\n\nexport default defineConfig({\n // Start with built-in security hooks\n extends: [{ hooks: builtinHooks }],\n\n hooks: [\n // Add your custom hooks here:\n //\n // hook(\"before\", [\"shell:before\"], async (ctx, next) => {\n // console.log(\"Running:\", ctx.event.command);\n // await next();\n // })\n // .id(\"my-hook\")\n // .name(\"Log Shell Commands\")\n // .build(),\n ],\n\n settings: {\n logLevel: \"warn\",\n hookTimeout: 5000,\n failMode: \"open\",\n },\n});\n`;\n\n if (flags.dryRun) {\n console.log(\"[dry-run] Would create ai-hooks.config.ts\");\n return;\n }\n\n await writeFile(\"ai-hooks.config.ts\", template, \"utf-8\");\n console.log(\"Created ai-hooks.config.ts\");\n console.log(\"\");\n console.log(\"Next steps:\");\n console.log(\" 1. Edit ai-hooks.config.ts to add your hooks\");\n console.log(\" 2. Run: ai-hooks detect (see which AI tools are installed)\");\n console.log(\" 3. Run: ai-hooks install (install hooks into your tools)\");\n}\n\nasync function cmdDetect(flags: Flags): Promise<void> {\n console.log(\"Detecting AI coding tools...\\n\");\n\n const detected = await registry.detectAll();\n const all = registry.list();\n\n for (const id of all) {\n const adapter = registry.get(id);\n if (!adapter) continue;\n\n const isDetected = detected.some((d) => d.id === id);\n const icon = isDetected ? \"\\u2713\" : \"\\u2717\";\n const color = isDetected ? \"\\x1b[32m\" : \"\\x1b[90m\";\n const reset = \"\\x1b[0m\";\n\n const caps: string[] = [];\n if (adapter.capabilities.beforeHooks) caps.push(\"hooks\");\n if (adapter.capabilities.mcp) caps.push(\"mcp\");\n\n let line = ` ${color}${icon}${reset} ${adapter.name.padEnd(20)} ${caps.join(\", \")}`;\n if (flags.verbose) {\n line += ` (${adapter.capabilities.supportedEvents.length} events)`;\n }\n\n console.log(line);\n }\n\n console.log(`\\nDetected ${detected.length}/${all.length} tools`);\n\n if (detected.length > 0 && !findConfigFile()) {\n console.log('\\nRun \"ai-hooks init\" to create a config file');\n }\n}\n\nasync function cmdGenerate(flags: Flags): Promise<void> {\n const config = await loadConfig(flags.config);\n const adapters = await resolveAdapters(flags);\n\n if (adapters.length === 0) {\n console.log(\"No AI tools detected. Use --tools to specify manually.\");\n return;\n }\n\n console.log(`Generating configs for ${adapters.length} tool(s)...\\n`);\n\n for (const adapter of adapters) {\n const configs = await adapter.generate(config.hooks);\n\n for (const cfg of configs) {\n if (flags.dryRun) {\n console.log(` [dry-run] Would write: ${cfg.path}`);\n } else {\n console.log(` Generated: ${cfg.path}`);\n }\n }\n\n if (!flags.dryRun) {\n await writeConfigs(configs);\n }\n }\n\n console.log(\"\\nDone!\");\n}\n\nasync function cmdInstall(flags: Flags): Promise<void> {\n const config = await loadConfig(flags.config);\n const adapters = await resolveAdapters(flags);\n\n if (adapters.length === 0) {\n console.log(\"No AI tools detected. Use --tools to specify manually.\");\n return;\n }\n\n console.log(`Installing hooks into ${adapters.length} tool(s)...\\n`);\n\n for (const adapter of adapters) {\n const configs = await adapter.generate(config.hooks);\n\n if (flags.dryRun) {\n for (const cfg of configs) {\n console.log(` [dry-run] Would install: ${cfg.path}`);\n }\n } else {\n await adapter.install(configs);\n console.log(` \\u2713 ${adapter.name}`);\n }\n }\n\n console.log(\"\\nHooks installed!\");\n}\n\nasync function cmdUninstall(flags: Flags): Promise<void> {\n const adapters = await resolveAdapters(flags);\n\n for (const adapter of adapters) {\n await adapter.uninstall();\n console.log(` \\u2713 Removed from ${adapter.name}`);\n }\n\n console.log(\"\\nHooks uninstalled.\");\n}\n\nasync function cmdList(flags: Flags): Promise<void> {\n const config = await loadConfig(flags.config);\n const engine = new HookEngine(config);\n const hooks = engine.getHooks();\n\n if (hooks.length === 0) {\n console.log(\"No hooks registered. Edit ai-hooks.config.ts to add hooks.\");\n return;\n }\n\n console.log(`${hooks.length} hook(s) registered:\\n`);\n\n for (const h of hooks) {\n const status = h.enabled === false ? \"\\x1b[90m(disabled)\\x1b[0m\" : \"\";\n const priority = h.priority ?? 100;\n console.log(` [${h.phase}] ${h.name} ${status}`);\n console.log(` id: ${h.id} priority: ${priority} events: ${h.events.join(\", \")}`);\n if (h.description && flags.verbose) {\n console.log(` ${h.description}`);\n }\n console.log(\"\");\n }\n}\n\nasync function cmdStatus(flags: Flags): Promise<void> {\n const hasConfig = findConfigFile();\n const detected = await registry.detectAll();\n\n console.log(\"ai-hooks status\\n\");\n console.log(` Config: ${hasConfig ?? \"not found\"}`);\n console.log(` Tools: ${detected.length} detected`);\n\n if (hasConfig) {\n const config = await loadConfig(flags.config);\n const engine = new HookEngine(config);\n const hooks = engine.getHooks();\n console.log(` Hooks: ${hooks.length} registered`);\n }\n\n console.log(\"\");\n\n for (const adapter of detected) {\n console.log(` \\u2713 ${adapter.name} (${adapter.id})`);\n }\n}\n\n// ── Helpers ─────────────────────────────────────────────────\n\nfunction parseFlags(args: string[]): Flags {\n const flags: Flags = {};\n\n for (const arg of args) {\n if (arg.startsWith(\"--tools=\")) {\n flags.tools = arg.slice(8);\n } else if (arg.startsWith(\"--config=\")) {\n flags.config = arg.slice(9);\n } else if (arg === \"--verbose\") {\n flags.verbose = true;\n } else if (arg === \"--dry-run\") {\n flags.dryRun = true;\n }\n }\n\n return flags;\n}\n\nasync function resolveAdapters(flags: Flags): Promise<Adapter[]> {\n if (flags.tools) {\n const ids = flags.tools.split(\",\").map((t) => t.trim());\n const adapters: Adapter[] = [];\n for (const id of ids) {\n const adapter = registry.get(id);\n if (adapter) {\n adapters.push(adapter);\n } else {\n console.warn(` Warning: Unknown adapter \"${id}\"`);\n }\n }\n return adapters;\n }\n\n return registry.detectAll();\n}\n\nasync function writeConfigs(configs: GeneratedConfig[]): Promise<void> {\n const { writeFile, mkdir } = await import(\"node:fs/promises\");\n const { dirname, resolve } = await import(\"node:path\");\n\n for (const cfg of configs) {\n const fullPath = resolve(process.cwd(), cfg.path);\n await mkdir(dirname(fullPath), { recursive: true });\n await writeFile(fullPath, cfg.content, \"utf-8\");\n }\n}\n"]}
|
package/dist/hooks/index.js
CHANGED
|
@@ -1,155 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
return new HookBuilderChain(phase, events, handler);
|
|
4
|
-
}
|
|
5
|
-
var HookBuilderChain = class {
|
|
6
|
-
constructor(phase, events, handler) {
|
|
7
|
-
this.phase = phase;
|
|
8
|
-
this.events = events;
|
|
9
|
-
this.handler = handler;
|
|
10
|
-
this._id = `hook-${events.join("-")}-${Date.now()}`;
|
|
11
|
-
this._name = `Hook for ${events.join(", ")}`;
|
|
12
|
-
}
|
|
13
|
-
_id;
|
|
14
|
-
_name;
|
|
15
|
-
_description;
|
|
16
|
-
_priority;
|
|
17
|
-
_filter;
|
|
18
|
-
_enabled;
|
|
19
|
-
id(id) {
|
|
20
|
-
this._id = id;
|
|
21
|
-
return this;
|
|
22
|
-
}
|
|
23
|
-
name(name) {
|
|
24
|
-
this._name = name;
|
|
25
|
-
return this;
|
|
26
|
-
}
|
|
27
|
-
description(desc) {
|
|
28
|
-
this._description = desc;
|
|
29
|
-
return this;
|
|
30
|
-
}
|
|
31
|
-
priority(p) {
|
|
32
|
-
this._priority = p;
|
|
33
|
-
return this;
|
|
34
|
-
}
|
|
35
|
-
filter(fn) {
|
|
36
|
-
this._filter = fn;
|
|
37
|
-
return this;
|
|
38
|
-
}
|
|
39
|
-
enabled(e) {
|
|
40
|
-
this._enabled = e;
|
|
41
|
-
return this;
|
|
42
|
-
}
|
|
43
|
-
build() {
|
|
44
|
-
return {
|
|
45
|
-
id: this._id,
|
|
46
|
-
name: this._name,
|
|
47
|
-
description: this._description,
|
|
48
|
-
events: this.events,
|
|
49
|
-
handler: this.handler,
|
|
50
|
-
phase: this.phase,
|
|
51
|
-
priority: this._priority,
|
|
52
|
-
filter: this._filter,
|
|
53
|
-
enabled: this._enabled
|
|
54
|
-
};
|
|
55
|
-
}
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
// src/hooks/builtin.ts
|
|
59
|
-
var blockDangerousCommands = hook("before", ["shell:before"], async (ctx, next) => {
|
|
60
|
-
const command = ctx.event.command;
|
|
61
|
-
const dangerous = DANGEROUS_PATTERNS.find((p) => p.pattern.test(command));
|
|
62
|
-
if (dangerous) {
|
|
63
|
-
ctx.results.push({
|
|
64
|
-
blocked: true,
|
|
65
|
-
reason: `Blocked dangerous command: ${dangerous.description}`
|
|
66
|
-
});
|
|
67
|
-
return;
|
|
68
|
-
}
|
|
69
|
-
await next();
|
|
70
|
-
}).id("ai-hooks:block-dangerous-commands").name("Block Dangerous Commands").description("Prevents destructive shell commands like rm -rf /, drop database, etc.").priority(1).build();
|
|
71
|
-
var DANGEROUS_PATTERNS = [
|
|
72
|
-
{ pattern: /rm\s+(-[a-zA-Z]*f[a-zA-Z]*\s+)?\/\s*$/, description: "rm -rf /" },
|
|
73
|
-
{ pattern: /rm\s+-[a-zA-Z]*f[a-zA-Z]*\s+~\/?\s*$/, description: "rm -rf ~" },
|
|
74
|
-
{ pattern: /mkfs\./, description: "filesystem format" },
|
|
75
|
-
{ pattern: /dd\s+.*of=\/dev\/[sh]d/, description: "disk overwrite" },
|
|
76
|
-
{ pattern: /:\(\)\s*\{\s*:\|:&\s*\}\s*;:/, description: "fork bomb" },
|
|
77
|
-
{ pattern: />\s*\/dev\/[sh]d/, description: "device overwrite" },
|
|
78
|
-
{ pattern: /chmod\s+(-R\s+)?777\s+\//, description: "chmod 777 /" },
|
|
79
|
-
{ pattern: /DROP\s+DATABASE/i, description: "DROP DATABASE" },
|
|
80
|
-
{ pattern: /DROP\s+TABLE/i, description: "DROP TABLE" },
|
|
81
|
-
{ pattern: /TRUNCATE\s+TABLE/i, description: "TRUNCATE TABLE" }
|
|
82
|
-
];
|
|
83
|
-
var scanSecrets = hook("before", ["file:write", "file:edit"], async (ctx, next) => {
|
|
84
|
-
const content = ctx.event.type === "file:write" ? ctx.event.content : ctx.event.newContent;
|
|
85
|
-
const found = SECRET_PATTERNS.find((p) => p.pattern.test(content));
|
|
86
|
-
if (found) {
|
|
87
|
-
ctx.results.push({
|
|
88
|
-
blocked: true,
|
|
89
|
-
reason: `Potential secret detected: ${found.description}. Use environment variables instead.`
|
|
90
|
-
});
|
|
91
|
-
return;
|
|
92
|
-
}
|
|
93
|
-
await next();
|
|
94
|
-
}).id("ai-hooks:scan-secrets").name("Scan for Secrets").description("Prevents hardcoded API keys, tokens, and credentials in file writes.").priority(2).build();
|
|
95
|
-
var SECRET_PATTERNS = [
|
|
96
|
-
{ pattern: /(?:api[_-]?key|apikey)\s*[:=]\s*['"][a-zA-Z0-9]{20,}['"]/i, description: "API key" },
|
|
97
|
-
{
|
|
98
|
-
pattern: /(?:secret|token|password|passwd|pwd)\s*[:=]\s*['"][^'"]{8,}['"]/i,
|
|
99
|
-
description: "Secret/token/password"
|
|
100
|
-
},
|
|
101
|
-
{ pattern: /-----BEGIN (?:RSA |EC |DSA )?PRIVATE KEY-----/, description: "Private key" },
|
|
102
|
-
{ pattern: /ghp_[a-zA-Z0-9]{36}/, description: "GitHub personal access token" },
|
|
103
|
-
{ pattern: /sk-[a-zA-Z0-9]{20,}/, description: "OpenAI/Stripe secret key" },
|
|
104
|
-
{ pattern: /AKIA[0-9A-Z]{16}/, description: "AWS access key ID" },
|
|
105
|
-
{ pattern: /xox[bpors]-[a-zA-Z0-9-]{10,}/, description: "Slack token" }
|
|
106
|
-
];
|
|
107
|
-
var protectGitignored = hook("before", ["file:write"], async (ctx, next) => {
|
|
108
|
-
const path = ctx.event.path;
|
|
109
|
-
const sensitive = SENSITIVE_FILES.some((f) => path.endsWith(f));
|
|
110
|
-
if (sensitive) {
|
|
111
|
-
ctx.results.push({
|
|
112
|
-
blocked: true,
|
|
113
|
-
reason: `Cannot write to sensitive file: ${path}. This file should be managed manually.`
|
|
114
|
-
});
|
|
115
|
-
return;
|
|
116
|
-
}
|
|
117
|
-
await next();
|
|
118
|
-
}).id("ai-hooks:protect-sensitive-files").name("Protect Sensitive Files").description("Prevents AI tools from overwriting .env, credentials, and other sensitive files.").priority(3).build();
|
|
119
|
-
var SENSITIVE_FILES = [
|
|
120
|
-
".env",
|
|
121
|
-
".env.local",
|
|
122
|
-
".env.production",
|
|
123
|
-
"credentials.json",
|
|
124
|
-
"service-account.json",
|
|
125
|
-
"id_rsa",
|
|
126
|
-
"id_ed25519",
|
|
127
|
-
".npmrc",
|
|
128
|
-
".pypirc"
|
|
129
|
-
];
|
|
130
|
-
var auditShellCommands = hook("after", ["shell:after"], async (ctx, next) => {
|
|
131
|
-
const { command, exitCode, duration } = ctx.event;
|
|
132
|
-
ctx.results.push({
|
|
133
|
-
data: {
|
|
134
|
-
audit: {
|
|
135
|
-
type: "shell",
|
|
136
|
-
command,
|
|
137
|
-
exitCode,
|
|
138
|
-
duration,
|
|
139
|
-
timestamp: ctx.event.timestamp,
|
|
140
|
-
tool: ctx.tool.name
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
});
|
|
144
|
-
await next();
|
|
145
|
-
}).id("ai-hooks:audit-shell").name("Audit Shell Commands").description("Records all shell command executions for audit trail.").priority(999).build();
|
|
146
|
-
var builtinHooks = [
|
|
147
|
-
blockDangerousCommands,
|
|
148
|
-
scanSecrets,
|
|
149
|
-
protectGitignored,
|
|
150
|
-
auditShellCommands
|
|
151
|
-
];
|
|
152
|
-
|
|
153
|
-
export { auditShellCommands, blockDangerousCommands, builtinHooks, protectGitignored, scanSecrets };
|
|
1
|
+
export { auditShellCommands, blockDangerousCommands, builtinHooks, protectGitignored, scanSecrets } from '../chunk-DSRP646D.js';
|
|
2
|
+
import '../chunk-N7ASBTX5.js';
|
|
154
3
|
//# sourceMappingURL=index.js.map
|
|
155
4
|
//# sourceMappingURL=index.js.map
|