@goodfoot/claude-code-hooks 1.0.23 → 1.2.0

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/cli.js CHANGED
@@ -863,7 +863,7 @@ async function main() {
863
863
  const hookFiles = await discoverHookFiles(args.input, cwd);
864
864
  log("info", `Discovered ${hookFiles.length} hook files`, { files: hookFiles });
865
865
  if (hookFiles.length === 0) {
866
- process.stderr.write(`No hook files found matching pattern: ${args.input}\n`);
866
+ process.stderr.write(`Error: No hook files found matching pattern: ${args.input}\n`);
867
867
  process.exit(1);
868
868
  }
869
869
  // Read existing hooks.json to preserve non-generated hooks
@@ -880,8 +880,8 @@ async function main() {
880
880
  }
881
881
  // Compile all hooks
882
882
  const compiledHooks = await compileAllHooks({ hookFiles, outputDir: buildDir, logFilePath });
883
- if (compiledHooks.length === 0) {
884
- process.stderr.write("No valid hooks found in discovered files.\n");
883
+ if (compiledHooks.length === 0 && hookFiles.length > 0) {
884
+ process.stderr.write("Error: No valid hooks found in discovered files.\n");
885
885
  process.exit(1);
886
886
  }
887
887
  // Auto-detect hook context based on output path
package/dist/constants.js CHANGED
@@ -21,4 +21,10 @@ export const HOOK_FACTORY_TO_EVENT = {
21
21
  setupHook: "Setup",
22
22
  teammateIdleHook: "TeammateIdle",
23
23
  taskCompletedHook: "TaskCompleted",
24
+ elicitationHook: "Elicitation",
25
+ elicitationResultHook: "ElicitationResult",
26
+ configChangeHook: "ConfigChange",
27
+ instructionsLoadedHook: "InstructionsLoaded",
28
+ worktreeCreateHook: "WorktreeCreate",
29
+ worktreeRemoveHook: "WorktreeRemove",
24
30
  };
package/dist/hooks.js CHANGED
@@ -499,3 +499,180 @@ export function teammateIdleHook(config, handler) {
499
499
  export function taskCompletedHook(config, handler) {
500
500
  return createHookFunction("TaskCompleted", config, handler);
501
501
  }
502
+ // ============================================================================
503
+ // Elicitation Hook Factory
504
+ // ============================================================================
505
+ /**
506
+ * Creates an Elicitation hook handler.
507
+ *
508
+ * Elicitation hooks fire when an MCP server requests user input, allowing you to:
509
+ * - Accept, decline, or cancel elicitation requests programmatically
510
+ * - Provide structured form input or URL-based auth responses
511
+ * - Log or audit elicitation requests
512
+ *
513
+ * **Matcher**: No matcher support - fires on all elicitation events
514
+ * @param config - Hook configuration with optional timeout
515
+ * @param handler - The handler function to execute
516
+ * @returns A hook function that can be exported as the default export
517
+ * @example
518
+ * ```typescript
519
+ * import { elicitationHook, elicitationOutput } from '@goodfoot/claude-code-hooks';
520
+ *
521
+ * export default elicitationHook({}, async (input, { logger }) => {
522
+ * logger.info('Elicitation request', { server: input.mcp_server_name });
523
+ * return elicitationOutput({
524
+ * hookSpecificOutput: { action: 'accept', content: { approved: true } }
525
+ * });
526
+ * });
527
+ * ```
528
+ * @see https://code.claude.com/docs/en/hooks#elicitation
529
+ */
530
+ export function elicitationHook(config, handler) {
531
+ return createHookFunction("Elicitation", config, handler);
532
+ }
533
+ // ============================================================================
534
+ // ElicitationResult Hook Factory
535
+ // ============================================================================
536
+ /**
537
+ * Creates an ElicitationResult hook handler.
538
+ *
539
+ * ElicitationResult hooks fire with the result of an MCP elicitation request,
540
+ * allowing you to:
541
+ * - Observe elicitation outcomes
542
+ * - Modify the result before it is returned to the MCP server
543
+ * - Log elicitation completions
544
+ *
545
+ * **Matcher**: No matcher support - fires on all elicitation result events
546
+ * @param config - Hook configuration with optional timeout
547
+ * @param handler - The handler function to execute
548
+ * @returns A hook function that can be exported as the default export
549
+ * @example
550
+ * ```typescript
551
+ * import { elicitationResultHook, elicitationResultOutput } from '@goodfoot/claude-code-hooks';
552
+ *
553
+ * export default elicitationResultHook({}, async (input, { logger }) => {
554
+ * logger.info('Elicitation result', { action: input.action });
555
+ * return elicitationResultOutput({});
556
+ * });
557
+ * ```
558
+ * @see https://code.claude.com/docs/en/hooks#elicitationresult
559
+ */
560
+ export function elicitationResultHook(config, handler) {
561
+ return createHookFunction("ElicitationResult", config, handler);
562
+ }
563
+ // ============================================================================
564
+ // ConfigChange Hook Factory
565
+ // ============================================================================
566
+ /**
567
+ * Creates a ConfigChange hook handler.
568
+ *
569
+ * ConfigChange hooks fire when Claude Code configuration changes, allowing you to:
570
+ * - React to settings file changes
571
+ * - Log or audit configuration changes
572
+ * - Apply custom logic when settings are updated
573
+ *
574
+ * **Matcher**: Matches against `source` ('user_settings', 'project_settings', etc.)
575
+ * @param config - Hook configuration with optional matcher and timeout
576
+ * @param handler - The handler function to execute
577
+ * @returns A hook function that can be exported as the default export
578
+ * @example
579
+ * ```typescript
580
+ * import { configChangeHook, configChangeOutput } from '@goodfoot/claude-code-hooks';
581
+ *
582
+ * export default configChangeHook({}, async (input, { logger }) => {
583
+ * logger.info('Config changed', { source: input.source, file: input.file_path });
584
+ * return configChangeOutput({});
585
+ * });
586
+ * ```
587
+ * @see https://code.claude.com/docs/en/hooks#configchange
588
+ */
589
+ export function configChangeHook(config, handler) {
590
+ return createHookFunction("ConfigChange", config, handler);
591
+ }
592
+ // ============================================================================
593
+ // InstructionsLoaded Hook Factory
594
+ // ============================================================================
595
+ /**
596
+ * Creates an InstructionsLoaded hook handler.
597
+ *
598
+ * InstructionsLoaded hooks fire when a CLAUDE.md or similar instructions file
599
+ * is loaded, allowing you to:
600
+ * - React to instructions being applied
601
+ * - Log which instruction files are active
602
+ * - Observe the instruction loading hierarchy
603
+ *
604
+ * **Matcher**: No matcher support - fires on all instruction load events
605
+ * @param config - Hook configuration with optional timeout
606
+ * @param handler - The handler function to execute
607
+ * @returns A hook function that can be exported as the default export
608
+ * @example
609
+ * ```typescript
610
+ * import { instructionsLoadedHook, instructionsLoadedOutput } from '@goodfoot/claude-code-hooks';
611
+ *
612
+ * export default instructionsLoadedHook({}, async (input, { logger }) => {
613
+ * logger.info('Instructions loaded', { file: input.file_path, type: input.memory_type });
614
+ * return instructionsLoadedOutput({});
615
+ * });
616
+ * ```
617
+ * @see https://code.claude.com/docs/en/hooks#instructionsloaded
618
+ */
619
+ export function instructionsLoadedHook(config, handler) {
620
+ return createHookFunction("InstructionsLoaded", config, handler);
621
+ }
622
+ // ============================================================================
623
+ // WorktreeCreate Hook Factory
624
+ // ============================================================================
625
+ /**
626
+ * Creates a WorktreeCreate hook handler.
627
+ *
628
+ * WorktreeCreate hooks fire when a git worktree is created, allowing you to:
629
+ * - Set up worktree-specific configuration
630
+ * - Log worktree creation events
631
+ * - Initialize worktree resources
632
+ *
633
+ * **Matcher**: No matcher support - fires on all worktree creation events
634
+ * @param config - Hook configuration with optional timeout
635
+ * @param handler - The handler function to execute
636
+ * @returns A hook function that can be exported as the default export
637
+ * @example
638
+ * ```typescript
639
+ * import { worktreeCreateHook, worktreeCreateOutput } from '@goodfoot/claude-code-hooks';
640
+ *
641
+ * export default worktreeCreateHook({}, async (input, { logger }) => {
642
+ * logger.info('Worktree created', { name: input.name });
643
+ * return worktreeCreateOutput({});
644
+ * });
645
+ * ```
646
+ * @see https://code.claude.com/docs/en/hooks#worktreecreate
647
+ */
648
+ export function worktreeCreateHook(config, handler) {
649
+ return createHookFunction("WorktreeCreate", config, handler);
650
+ }
651
+ // ============================================================================
652
+ // WorktreeRemove Hook Factory
653
+ // ============================================================================
654
+ /**
655
+ * Creates a WorktreeRemove hook handler.
656
+ *
657
+ * WorktreeRemove hooks fire when a git worktree is removed, allowing you to:
658
+ * - Clean up worktree-specific resources
659
+ * - Log worktree removal events
660
+ *
661
+ * **Matcher**: No matcher support - fires on all worktree removal events
662
+ * @param config - Hook configuration with optional timeout
663
+ * @param handler - The handler function to execute
664
+ * @returns A hook function that can be exported as the default export
665
+ * @example
666
+ * ```typescript
667
+ * import { worktreeRemoveHook, worktreeRemoveOutput } from '@goodfoot/claude-code-hooks';
668
+ *
669
+ * export default worktreeRemoveHook({}, async (input, { logger }) => {
670
+ * logger.info('Worktree removed', { path: input.worktree_path });
671
+ * return worktreeRemoveOutput({});
672
+ * });
673
+ * ```
674
+ * @see https://code.claude.com/docs/en/hooks#worktreeremove
675
+ */
676
+ export function worktreeRemoveHook(config, handler) {
677
+ return createHookFunction("WorktreeRemove", config, handler);
678
+ }
package/dist/index.js CHANGED
@@ -11,16 +11,16 @@ export {
11
11
  CLAUDE_ENV_VARS, getEnvFilePath,
12
12
  // Getters
13
13
  getProjectDir, isRemoteEnvironment, } from "./env.js";
14
- // Hook factory functions - all 15 hook types
15
- export { notificationHook, permissionRequestHook, postToolUseFailureHook, postToolUseHook, preCompactHook, preToolUseHook, sessionEndHook, sessionStartHook, setupHook, stopHook, subagentStartHook, subagentStopHook, taskCompletedHook, teammateIdleHook, userPromptSubmitHook, } from "./hooks.js";
14
+ // Hook factory functions - all 21 hook types
15
+ export { configChangeHook, elicitationHook, elicitationResultHook, instructionsLoadedHook, notificationHook, permissionRequestHook, postToolUseFailureHook, postToolUseHook, preCompactHook, preToolUseHook, sessionEndHook, sessionStartHook, setupHook, stopHook, subagentStartHook, subagentStopHook, taskCompletedHook, teammateIdleHook, userPromptSubmitHook, worktreeCreateHook, worktreeRemoveHook, } from "./hooks.js";
16
16
  // Logger exports
17
17
  export { LOG_LEVELS, Logger, logger } from "./logger.js";
18
18
  // Output builder functions
19
- export {
19
+ export { configChangeOutput,
20
20
  // Exit codes
21
- EXIT_CODES, notificationOutput, permissionRequestOutput, postToolUseFailureOutput, postToolUseOutput, preCompactOutput,
22
- // All 15 output builder functions
23
- preToolUseOutput, sessionEndOutput, sessionStartOutput, setupOutput, stopOutput, subagentStartOutput, subagentStopOutput, taskCompletedOutput, teammateIdleOutput, userPromptSubmitOutput, } from "./outputs.js";
21
+ EXIT_CODES, elicitationOutput, elicitationResultOutput, instructionsLoadedOutput, notificationOutput, permissionRequestOutput, postToolUseFailureOutput, postToolUseOutput, preCompactOutput,
22
+ // All 21 output builder functions
23
+ preToolUseOutput, sessionEndOutput, sessionStartOutput, setupOutput, stopOutput, subagentStartOutput, subagentStopOutput, taskCompletedOutput, teammateIdleOutput, userPromptSubmitOutput, worktreeCreateOutput, worktreeRemoveOutput, } from "./outputs.js";
24
24
  // Runtime exports - execute function
25
25
  export {
26
26
  // Main execute function for compiled hooks
package/dist/outputs.js CHANGED
@@ -69,6 +69,23 @@ function createDecisionOutputBuilder(hookType) {
69
69
  stdout: options,
70
70
  });
71
71
  }
72
+ /**
73
+ * Factory for exit-code-based hooks (TeammateIdle, TaskCompleted).
74
+ *
75
+ * These hooks don't use JSON decision control (no CommonOptions).
76
+ * The only option is `stderr` — when present, it triggers exit code 2 (BLOCK).
77
+ * Stdout always receives `{}` (empty JSON object).
78
+ * @param hookType - The hook type name used as the _type discriminator
79
+ * @returns A builder function that creates the output object
80
+ * @internal
81
+ */
82
+ function createExitCodeOutputBuilder(hookType) {
83
+ return ({ stderr } = {}) => ({
84
+ _type: hookType,
85
+ stdout: {},
86
+ ...(stderr !== undefined ? { stderr } : {}),
87
+ });
88
+ }
72
89
  /**
73
90
  * Creates an output for PreToolUse hooks.
74
91
  * @param options - Configuration options for the hook output
@@ -303,17 +320,94 @@ export const setupOutput = /* @__PURE__ */ createHookSpecificOutputBuilder("Setu
303
320
  * @returns A TeammateIdleOutput object ready for the runtime
304
321
  * @example
305
322
  * ```typescript
323
+ * // Allow teammate to go idle
306
324
  * teammateIdleOutput({});
325
+ *
326
+ * // Block with feedback
327
+ * teammateIdleOutput({ stderr: 'Continue working: unfinished tasks remain.' });
307
328
  * ```
308
329
  */
309
- export const teammateIdleOutput = /* @__PURE__ */ createSimpleOutputBuilder("TeammateIdle");
330
+ export const teammateIdleOutput = /* @__PURE__ */ createExitCodeOutputBuilder("TeammateIdle");
310
331
  /**
311
332
  * Creates an output for TaskCompleted hooks.
312
333
  * @param options - Configuration options for the hook output
313
334
  * @returns A TaskCompletedOutput object ready for the runtime
314
335
  * @example
315
336
  * ```typescript
337
+ * // Allow task completion
316
338
  * taskCompletedOutput({});
339
+ *
340
+ * // Block with feedback
341
+ * taskCompletedOutput({ stderr: 'Cannot complete: tests are failing.' });
342
+ * ```
343
+ */
344
+ export const taskCompletedOutput = /* @__PURE__ */ createExitCodeOutputBuilder("TaskCompleted");
345
+ /**
346
+ * Creates an output for Elicitation hooks.
347
+ * @param options - Configuration options for the hook output
348
+ * @returns An ElicitationOutput object ready for the runtime
349
+ * @example
350
+ * ```typescript
351
+ * // Accept the elicitation
352
+ * elicitationOutput({
353
+ * hookSpecificOutput: { action: 'accept', content: { username: 'alice' } }
354
+ * });
355
+ *
356
+ * // Decline the elicitation
357
+ * elicitationOutput({
358
+ * hookSpecificOutput: { action: 'decline' }
359
+ * });
360
+ * ```
361
+ */
362
+ export const elicitationOutput = /* @__PURE__ */ createHookSpecificOutputBuilder("Elicitation");
363
+ /**
364
+ * Creates an output for ElicitationResult hooks.
365
+ * @param options - Configuration options for the hook output
366
+ * @returns An ElicitationResultOutput object ready for the runtime
367
+ * @example
368
+ * ```typescript
369
+ * elicitationResultOutput({});
370
+ * ```
371
+ */
372
+ export const elicitationResultOutput = /* @__PURE__ */ createHookSpecificOutputBuilder("ElicitationResult");
373
+ /**
374
+ * Creates an output for ConfigChange hooks.
375
+ * @param options - Configuration options for the hook output
376
+ * @returns A ConfigChangeOutput object ready for the runtime
377
+ * @example
378
+ * ```typescript
379
+ * configChangeOutput({});
380
+ * ```
381
+ */
382
+ export const configChangeOutput = /* @__PURE__ */ createSimpleOutputBuilder("ConfigChange");
383
+ /**
384
+ * Creates an output for InstructionsLoaded hooks.
385
+ * @param options - Configuration options for the hook output
386
+ * @returns An InstructionsLoadedOutput object ready for the runtime
387
+ * @example
388
+ * ```typescript
389
+ * instructionsLoadedOutput({});
390
+ * ```
391
+ */
392
+ export const instructionsLoadedOutput =
393
+ /* @__PURE__ */ createSimpleOutputBuilder("InstructionsLoaded");
394
+ /**
395
+ * Creates an output for WorktreeCreate hooks.
396
+ * @param options - Configuration options for the hook output
397
+ * @returns A WorktreeCreateOutput object ready for the runtime
398
+ * @example
399
+ * ```typescript
400
+ * worktreeCreateOutput({});
401
+ * ```
402
+ */
403
+ export const worktreeCreateOutput = /* @__PURE__ */ createSimpleOutputBuilder("WorktreeCreate");
404
+ /**
405
+ * Creates an output for WorktreeRemove hooks.
406
+ * @param options - Configuration options for the hook output
407
+ * @returns A WorktreeRemoveOutput object ready for the runtime
408
+ * @example
409
+ * ```typescript
410
+ * worktreeRemoveOutput({});
317
411
  * ```
318
412
  */
319
- export const taskCompletedOutput = /* @__PURE__ */ createSimpleOutputBuilder("TaskCompleted");
413
+ export const worktreeRemoveOutput = /* @__PURE__ */ createSimpleOutputBuilder("WorktreeRemove");
package/dist/runtime.js CHANGED
@@ -106,8 +106,8 @@ function handleHandlerError(error) {
106
106
  /**
107
107
  * Converts a SpecificHookOutput to HookOutput for wire format.
108
108
  *
109
- * SpecificHookOutput types have: { _type, exitCode, stdout, stderr? }
110
- * HookOutput has: { exitCode, stdout, stderr? }
109
+ * SpecificHookOutput types have: { _type, stdout, stderr? }
110
+ * HookOutput has: { stdout, stderr? }
111
111
  *
112
112
  * Since output builders now produce wire-format directly, this function
113
113
  * simply strips the `_type` discriminator field.
@@ -118,11 +118,12 @@ function handleHandlerError(error) {
118
118
  * ```typescript
119
119
  * const specificOutput = preToolUseOutput({ hookSpecificOutput: { permissionDecision: 'allow' } });
120
120
  * const hookOutput = convertToHookOutput(specificOutput);
121
- * // hookOutput: { exitCode: 0, stdout: { hookSpecificOutput: { ... } } }
121
+ * // hookOutput: { stdout: { hookSpecificOutput: { ... } } }
122
122
  * ```
123
123
  */
124
124
  export function convertToHookOutput(specificOutput) {
125
- return { stdout: specificOutput.stdout };
125
+ const { stdout, stderr } = specificOutput;
126
+ return stderr !== undefined ? { stdout, stderr } : { stdout };
126
127
  }
127
128
  // ============================================================================
128
129
  // Execute Function
@@ -216,9 +217,16 @@ export async function execute(hookFn) {
216
217
  if (output !== undefined) {
217
218
  writeStdout(output.stdout);
218
219
  }
219
- // Clear logger context
220
+ // Clean up logger (single cleanup path)
220
221
  logger.clearContext();
221
222
  logger.close();
223
+ // Exit-code BLOCK: unlike handler throw (no stdout), this path still writes
224
+ // structured JSON to stdout (as empty {}) alongside the stderr message.
225
+ // The caller controls stderr formatting (no appended newline).
226
+ if (output?.stderr !== undefined) {
227
+ process.stderr.write(output.stderr);
228
+ process.exit(EXIT_CODES.BLOCK);
229
+ }
222
230
  // Exit with success (handler errors exit via handleHandlerError with code 2)
223
231
  process.exit(EXIT_CODES.SUCCESS);
224
232
  }
package/dist/scaffold.js CHANGED
@@ -52,6 +52,12 @@ const EVENT_TO_OUTPUT_FUNCTION = {
52
52
  Setup: "setupOutput",
53
53
  TeammateIdle: "teammateIdleOutput",
54
54
  TaskCompleted: "taskCompletedOutput",
55
+ Elicitation: "elicitationOutput",
56
+ ElicitationResult: "elicitationResultOutput",
57
+ ConfigChange: "configChangeOutput",
58
+ InstructionsLoaded: "instructionsLoadedOutput",
59
+ WorktreeCreate: "worktreeCreateOutput",
60
+ WorktreeRemove: "worktreeRemoveOutput",
55
61
  };
56
62
  // ============================================================================
57
63
  // Validation
@@ -119,7 +125,7 @@ function generatePackageJson(projectName, outputPath) {
119
125
  "@goodfoot/claude-code-hooks": "^1.0.9",
120
126
  },
121
127
  devDependencies: {
122
- "@biomejs/biome": "2.4.1",
128
+ "@biomejs/biome": "2.4.6",
123
129
  "@types/node": "^22.0.0",
124
130
  typescript: "^5.9.3",
125
131
  vitest: "^4.0.16",
@@ -162,7 +168,7 @@ function generateTsConfig() {
162
168
  */
163
169
  function generateBiomeConfig() {
164
170
  return `{
165
- "$schema": "https://biomejs.dev/schemas/2.4.1/schema.json",
171
+ "$schema": "https://biomejs.dev/schemas/2.4.6/schema.json",
166
172
  "formatter": {
167
173
  "enabled": true,
168
174
  "indentStyle": "space",
@@ -313,6 +319,20 @@ function generateHookTemplate(eventName) {
313
319
  systemMessage: "Permission request processed.",
314
320
  });`;
315
321
  break;
322
+ case "Elicitation":
323
+ returnStatement = `return ${outputName}({
324
+ hookSpecificOutput: { action: "accept" },
325
+ });`;
326
+ break;
327
+ case "ElicitationResult":
328
+ returnStatement = `return ${outputName}({});`;
329
+ break;
330
+ case "ConfigChange":
331
+ case "InstructionsLoaded":
332
+ case "WorktreeCreate":
333
+ case "WorktreeRemove":
334
+ returnStatement = `return ${outputName}({});`;
335
+ break;
316
336
  default:
317
337
  // SessionEnd, Notification, SubagentStart use simple output with systemMessage
318
338
  returnStatement = `return ${outputName}({
package/dist/types.js CHANGED
@@ -35,4 +35,10 @@ export const HOOK_EVENT_NAMES = [
35
35
  "Setup",
36
36
  "TeammateIdle",
37
37
  "TaskCompleted",
38
+ "Elicitation",
39
+ "ElicitationResult",
40
+ "ConfigChange",
41
+ "InstructionsLoaded",
42
+ "WorktreeCreate",
43
+ "WorktreeRemove",
38
44
  ];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@goodfoot/claude-code-hooks",
3
- "version": "1.0.23",
3
+ "version": "1.2.0",
4
4
  "description": "Type-safe Claude Code hooks library with camelCase types and output builders",
5
5
  "homepage": "https://github.com/goodfoot-io/marketplace/tree/main/packages/claude-code-hooks",
6
6
  "repository": {
@@ -53,8 +53,8 @@
53
53
  "typescript": "^5.9.3"
54
54
  },
55
55
  "devDependencies": {
56
- "@anthropic-ai/claude-agent-sdk": "^0.2.42",
57
- "@biomejs/biome": "2.4.1",
56
+ "@anthropic-ai/claude-agent-sdk": "^0.2.69",
57
+ "@biomejs/biome": "2.4.6",
58
58
  "@types/node": "^24",
59
59
  "ts-morph": "^25.0.0",
60
60
  "tsx": "^4.20.3",
package/types/hooks.d.ts CHANGED
@@ -22,8 +22,8 @@
22
22
  * @see https://code.claude.com/docs/en/hooks
23
23
  */
24
24
  import type { Logger } from "./logger.js";
25
- import type { NotificationOutput, PermissionRequestOutput, PostToolUseFailureOutput, PostToolUseOutput, PreCompactOutput, PreToolUseOutput, SessionEndOutput, SessionStartOutput, SetupOutput, SpecificHookOutput, StopOutput, SubagentStartOutput, SubagentStopOutput, TaskCompletedOutput, TeammateIdleOutput, UserPromptSubmitOutput } from "./outputs.js";
26
- import type { HookEventName, KnownToolName, NotificationInput, PermissionRequestInput, PostToolUseFailureInput, PostToolUseInput, PreCompactInput, PreToolUseInput, SessionEndInput, SessionStartInput, SetupInput, StopInput, SubagentStartInput, SubagentStopInput, TaskCompletedInput, TeammateIdleInput, ToolInputMap, UserPromptSubmitInput } from "./types.js";
25
+ import type { ConfigChangeOutput, ElicitationOutput, ElicitationResultOutput, InstructionsLoadedOutput, NotificationOutput, PermissionRequestOutput, PostToolUseFailureOutput, PostToolUseOutput, PreCompactOutput, PreToolUseOutput, SessionEndOutput, SessionStartOutput, SetupOutput, SpecificHookOutput, StopOutput, SubagentStartOutput, SubagentStopOutput, TaskCompletedOutput, TeammateIdleOutput, UserPromptSubmitOutput, WorktreeCreateOutput, WorktreeRemoveOutput } from "./outputs.js";
26
+ import type { ConfigChangeInput, ElicitationInput, ElicitationResultInput, HookEventName, InstructionsLoadedInput, KnownToolName, NotificationInput, PermissionRequestInput, PostToolUseFailureInput, PostToolUseInput, PreCompactInput, PreToolUseInput, SessionEndInput, SessionStartInput, SetupInput, StopInput, SubagentStartInput, SubagentStopInput, TaskCompletedInput, TeammateIdleInput, ToolInputMap, UserPromptSubmitInput, WorktreeCreateInput, WorktreeRemoveInput } from "./types.js";
27
27
  /**
28
28
  * Configuration options for hook factories.
29
29
  *
@@ -870,4 +870,151 @@ export declare function teammateIdleHook(config: HookConfig, handler: HookHandle
870
870
  * @see https://code.claude.com/docs/en/hooks#taskcompleted
871
871
  */
872
872
  export declare function taskCompletedHook(config: HookConfig, handler: HookHandler<TaskCompletedInput, TaskCompletedOutput>): HookFunction<TaskCompletedInput, TaskCompletedOutput>;
873
+ /**
874
+ * Creates an Elicitation hook handler.
875
+ *
876
+ * Elicitation hooks fire when an MCP server requests user input, allowing you to:
877
+ * - Accept, decline, or cancel elicitation requests programmatically
878
+ * - Provide structured form input or URL-based auth responses
879
+ * - Log or audit elicitation requests
880
+ *
881
+ * **Matcher**: No matcher support - fires on all elicitation events
882
+ * @param config - Hook configuration with optional timeout
883
+ * @param handler - The handler function to execute
884
+ * @returns A hook function that can be exported as the default export
885
+ * @example
886
+ * ```typescript
887
+ * import { elicitationHook, elicitationOutput } from '@goodfoot/claude-code-hooks';
888
+ *
889
+ * export default elicitationHook({}, async (input, { logger }) => {
890
+ * logger.info('Elicitation request', { server: input.mcp_server_name });
891
+ * return elicitationOutput({
892
+ * hookSpecificOutput: { action: 'accept', content: { approved: true } }
893
+ * });
894
+ * });
895
+ * ```
896
+ * @see https://code.claude.com/docs/en/hooks#elicitation
897
+ */
898
+ export declare function elicitationHook(config: HookConfig, handler: HookHandler<ElicitationInput, ElicitationOutput>): HookFunction<ElicitationInput, ElicitationOutput>;
899
+ /**
900
+ * Creates an ElicitationResult hook handler.
901
+ *
902
+ * ElicitationResult hooks fire with the result of an MCP elicitation request,
903
+ * allowing you to:
904
+ * - Observe elicitation outcomes
905
+ * - Modify the result before it is returned to the MCP server
906
+ * - Log elicitation completions
907
+ *
908
+ * **Matcher**: No matcher support - fires on all elicitation result events
909
+ * @param config - Hook configuration with optional timeout
910
+ * @param handler - The handler function to execute
911
+ * @returns A hook function that can be exported as the default export
912
+ * @example
913
+ * ```typescript
914
+ * import { elicitationResultHook, elicitationResultOutput } from '@goodfoot/claude-code-hooks';
915
+ *
916
+ * export default elicitationResultHook({}, async (input, { logger }) => {
917
+ * logger.info('Elicitation result', { action: input.action });
918
+ * return elicitationResultOutput({});
919
+ * });
920
+ * ```
921
+ * @see https://code.claude.com/docs/en/hooks#elicitationresult
922
+ */
923
+ export declare function elicitationResultHook(config: HookConfig, handler: HookHandler<ElicitationResultInput, ElicitationResultOutput>): HookFunction<ElicitationResultInput, ElicitationResultOutput>;
924
+ /**
925
+ * Creates a ConfigChange hook handler.
926
+ *
927
+ * ConfigChange hooks fire when Claude Code configuration changes, allowing you to:
928
+ * - React to settings file changes
929
+ * - Log or audit configuration changes
930
+ * - Apply custom logic when settings are updated
931
+ *
932
+ * **Matcher**: Matches against `source` ('user_settings', 'project_settings', etc.)
933
+ * @param config - Hook configuration with optional matcher and timeout
934
+ * @param handler - The handler function to execute
935
+ * @returns A hook function that can be exported as the default export
936
+ * @example
937
+ * ```typescript
938
+ * import { configChangeHook, configChangeOutput } from '@goodfoot/claude-code-hooks';
939
+ *
940
+ * export default configChangeHook({}, async (input, { logger }) => {
941
+ * logger.info('Config changed', { source: input.source, file: input.file_path });
942
+ * return configChangeOutput({});
943
+ * });
944
+ * ```
945
+ * @see https://code.claude.com/docs/en/hooks#configchange
946
+ */
947
+ export declare function configChangeHook(config: HookConfig, handler: HookHandler<ConfigChangeInput, ConfigChangeOutput>): HookFunction<ConfigChangeInput, ConfigChangeOutput>;
948
+ /**
949
+ * Creates an InstructionsLoaded hook handler.
950
+ *
951
+ * InstructionsLoaded hooks fire when a CLAUDE.md or similar instructions file
952
+ * is loaded, allowing you to:
953
+ * - React to instructions being applied
954
+ * - Log which instruction files are active
955
+ * - Observe the instruction loading hierarchy
956
+ *
957
+ * **Matcher**: No matcher support - fires on all instruction load events
958
+ * @param config - Hook configuration with optional timeout
959
+ * @param handler - The handler function to execute
960
+ * @returns A hook function that can be exported as the default export
961
+ * @example
962
+ * ```typescript
963
+ * import { instructionsLoadedHook, instructionsLoadedOutput } from '@goodfoot/claude-code-hooks';
964
+ *
965
+ * export default instructionsLoadedHook({}, async (input, { logger }) => {
966
+ * logger.info('Instructions loaded', { file: input.file_path, type: input.memory_type });
967
+ * return instructionsLoadedOutput({});
968
+ * });
969
+ * ```
970
+ * @see https://code.claude.com/docs/en/hooks#instructionsloaded
971
+ */
972
+ export declare function instructionsLoadedHook(config: HookConfig, handler: HookHandler<InstructionsLoadedInput, InstructionsLoadedOutput>): HookFunction<InstructionsLoadedInput, InstructionsLoadedOutput>;
973
+ /**
974
+ * Creates a WorktreeCreate hook handler.
975
+ *
976
+ * WorktreeCreate hooks fire when a git worktree is created, allowing you to:
977
+ * - Set up worktree-specific configuration
978
+ * - Log worktree creation events
979
+ * - Initialize worktree resources
980
+ *
981
+ * **Matcher**: No matcher support - fires on all worktree creation events
982
+ * @param config - Hook configuration with optional timeout
983
+ * @param handler - The handler function to execute
984
+ * @returns A hook function that can be exported as the default export
985
+ * @example
986
+ * ```typescript
987
+ * import { worktreeCreateHook, worktreeCreateOutput } from '@goodfoot/claude-code-hooks';
988
+ *
989
+ * export default worktreeCreateHook({}, async (input, { logger }) => {
990
+ * logger.info('Worktree created', { name: input.name });
991
+ * return worktreeCreateOutput({});
992
+ * });
993
+ * ```
994
+ * @see https://code.claude.com/docs/en/hooks#worktreecreate
995
+ */
996
+ export declare function worktreeCreateHook(config: HookConfig, handler: HookHandler<WorktreeCreateInput, WorktreeCreateOutput>): HookFunction<WorktreeCreateInput, WorktreeCreateOutput>;
997
+ /**
998
+ * Creates a WorktreeRemove hook handler.
999
+ *
1000
+ * WorktreeRemove hooks fire when a git worktree is removed, allowing you to:
1001
+ * - Clean up worktree-specific resources
1002
+ * - Log worktree removal events
1003
+ *
1004
+ * **Matcher**: No matcher support - fires on all worktree removal events
1005
+ * @param config - Hook configuration with optional timeout
1006
+ * @param handler - The handler function to execute
1007
+ * @returns A hook function that can be exported as the default export
1008
+ * @example
1009
+ * ```typescript
1010
+ * import { worktreeRemoveHook, worktreeRemoveOutput } from '@goodfoot/claude-code-hooks';
1011
+ *
1012
+ * export default worktreeRemoveHook({}, async (input, { logger }) => {
1013
+ * logger.info('Worktree removed', { path: input.worktree_path });
1014
+ * return worktreeRemoveOutput({});
1015
+ * });
1016
+ * ```
1017
+ * @see https://code.claude.com/docs/en/hooks#worktreeremove
1018
+ */
1019
+ export declare function worktreeRemoveHook(config: HookConfig, handler: HookHandler<WorktreeRemoveInput, WorktreeRemoveOutput>): HookFunction<WorktreeRemoveInput, WorktreeRemoveOutput>;
873
1020
  export {};
package/types/index.d.ts CHANGED
@@ -8,15 +8,15 @@
8
8
  export type * from "@anthropic-ai/claude-agent-sdk/sdk-tools.js";
9
9
  export { CLAUDE_ENV_VARS, getEnvFilePath, getProjectDir, isRemoteEnvironment, } from "./env.js";
10
10
  export type { HookConfig, HookContext, HookFunction, HookHandler, SessionStartContext, TypedHookConfig, TypedPermissionRequestInput, TypedPostToolUseFailureHookInput, TypedPostToolUseHookInput, TypedPreToolUseHookInput, } from "./hooks.js";
11
- export { notificationHook, permissionRequestHook, postToolUseFailureHook, postToolUseHook, preCompactHook, preToolUseHook, sessionEndHook, sessionStartHook, setupHook, stopHook, subagentStartHook, subagentStopHook, taskCompletedHook, teammateIdleHook, userPromptSubmitHook, } from "./hooks.js";
11
+ export { configChangeHook, elicitationHook, elicitationResultHook, instructionsLoadedHook, notificationHook, permissionRequestHook, postToolUseFailureHook, postToolUseHook, preCompactHook, preToolUseHook, sessionEndHook, sessionStartHook, setupHook, stopHook, subagentStartHook, subagentStopHook, taskCompletedHook, teammateIdleHook, userPromptSubmitHook, worktreeCreateHook, worktreeRemoveHook, } from "./hooks.js";
12
12
  export type { LogEvent, LogEventError, LogEventHandler, LoggerConfig, LogLevel, Unsubscribe } from "./logger.js";
13
13
  export { LOG_LEVELS, Logger, logger } from "./logger.js";
14
14
  export type {
15
15
  /** @deprecated Use CommonOptions instead */
16
- BaseOptions, CommonOptions, ExitCode, HookOutput, HookSpecificOutput, NotificationHookSpecificOutput, NotificationOptions, PermissionRequestAllowDecision, PermissionRequestDecision, PermissionRequestDenyDecision, PermissionRequestHookSpecificOutput, PermissionRequestOptions, PostToolUseFailureHookSpecificOutput, PostToolUseFailureOptions, PostToolUseHookSpecificOutput, PostToolUseOptions, PreCompactOptions, PreToolUseHookSpecificOutput, PreToolUseOptions, SessionEndOptions, SessionStartHookSpecificOutput, SessionStartOptions, SetupHookSpecificOutput, SetupOptions, StopOptions, SubagentStartHookSpecificOutput, SubagentStartOptions, SubagentStopOptions, SyncHookJSONOutput, TaskCompletedOptions, TeammateIdleOptions, UserPromptSubmitHookSpecificOutput, UserPromptSubmitOptions, } from "./outputs.js";
17
- export { EXIT_CODES, notificationOutput, permissionRequestOutput, postToolUseFailureOutput, postToolUseOutput, preCompactOutput, preToolUseOutput, sessionEndOutput, sessionStartOutput, setupOutput, stopOutput, subagentStartOutput, subagentStopOutput, taskCompletedOutput, teammateIdleOutput, userPromptSubmitOutput, } from "./outputs.js";
16
+ BaseOptions, CommonOptions, ConfigChangeOptions, ElicitationHookSpecificOutput, ElicitationOptions, ElicitationResultHookSpecificOutput, ElicitationResultOptions, ExitCode, ExitCodeOptions, HookOutput, HookSpecificOutput, InstructionsLoadedOptions, NotificationHookSpecificOutput, NotificationOptions, PermissionRequestAllowDecision, PermissionRequestDecision, PermissionRequestDenyDecision, PermissionRequestHookSpecificOutput, PermissionRequestOptions, PostToolUseFailureHookSpecificOutput, PostToolUseFailureOptions, PostToolUseHookSpecificOutput, PostToolUseOptions, PreCompactOptions, PreToolUseHookSpecificOutput, PreToolUseOptions, SessionEndOptions, SessionStartHookSpecificOutput, SessionStartOptions, SetupHookSpecificOutput, SetupOptions, StopOptions, SubagentStartHookSpecificOutput, SubagentStartOptions, SubagentStopOptions, SyncHookJSONOutput, TaskCompletedOptions, TeammateIdleOptions, UserPromptSubmitHookSpecificOutput, UserPromptSubmitOptions, WorktreeCreateOptions, WorktreeRemoveOptions, } from "./outputs.js";
17
+ export { configChangeOutput, EXIT_CODES, elicitationOutput, elicitationResultOutput, instructionsLoadedOutput, notificationOutput, permissionRequestOutput, postToolUseFailureOutput, postToolUseOutput, preCompactOutput, preToolUseOutput, sessionEndOutput, sessionStartOutput, setupOutput, stopOutput, subagentStartOutput, subagentStopOutput, taskCompletedOutput, teammateIdleOutput, userPromptSubmitOutput, worktreeCreateOutput, worktreeRemoveOutput, } from "./outputs.js";
18
18
  export { execute, } from "./runtime.js";
19
19
  export type { ContentContext, PatternCheckResult, ToolUseInput } from "./tool-helpers.js";
20
20
  export { checkContentForPattern, forEachContent, getFilePath, isAskUserQuestionTool, isBashTool, isConfigTool, isEditTool, isExitPlanModeTool, isFileModifyingTool, isGlobTool, isGrepTool, isJsTsFile, isKillShellTool, isListMcpResourcesTool, isMcpTool, isMultiEditTool, isNotebookEditTool, isReadMcpResourceTool, isReadTool, isTaskOutputTool, isTaskTool, isTodoWriteTool, isTsFile, isWebFetchTool, isWebSearchTool, isWriteTool, } from "./tool-helpers.js";
21
- export type { BaseHookInput, ConfigInput, FileModifyingToolInput, FileModifyingToolName, HookEventName, HookInput, KnownToolInput, KnownToolName, ListMcpResourcesInput, McpInput, MultiEditEntry, MultiEditToolInput, NotificationInput, PermissionMode, PermissionRequestInput, PermissionUpdate, PostToolUseFailureInput, PostToolUseInput, PreCompactInput, PreCompactTrigger, PreToolUseInput, ReadMcpResourceInput, SessionEndInput, SessionEndReason, SessionStartInput, SessionStartSource, SetupInput, SetupTrigger, StopInput, SubagentStartInput, SubagentStopInput, TaskCompletedInput, TeammateIdleInput, ToolInputMap, UserPromptSubmitInput, } from "./types.js";
21
+ export type { BaseHookInput, ConfigChangeInput, ConfigInput, ElicitationInput, ElicitationResultInput, FileModifyingToolInput, FileModifyingToolName, HookEventName, HookInput, InstructionsLoadedInput, KnownToolInput, KnownToolName, ListMcpResourcesInput, McpInput, MultiEditEntry, MultiEditToolInput, NotificationInput, PermissionMode, PermissionRequestInput, PermissionUpdate, PostToolUseFailureInput, PostToolUseInput, PreCompactInput, PreCompactTrigger, PreToolUseInput, ReadMcpResourceInput, SessionEndInput, SessionEndReason, SessionStartInput, SessionStartSource, SetupInput, SetupTrigger, StopInput, SubagentStartInput, SubagentStopInput, TaskCompletedInput, TeammateIdleInput, ToolInputMap, UserPromptSubmitInput, WorktreeCreateInput, WorktreeRemoveInput, } from "./types.js";
22
22
  export { HOOK_EVENT_NAMES } from "./types.js";
@@ -7,6 +7,7 @@
7
7
  * @see https://code.claude.com/docs/en/hooks
8
8
  * @module
9
9
  */
10
+ import type { ElicitationHookSpecificOutput as SDKElicitationHookSpecificOutput, ElicitationResultHookSpecificOutput as SDKElicitationResultHookSpecificOutput } from "@anthropic-ai/claude-agent-sdk";
10
11
  import type { NotificationHookSpecificOutput as SDKNotificationHookSpecificOutput, PermissionRequestHookSpecificOutput as SDKPermissionRequestHookSpecificOutput, PostToolUseFailureHookSpecificOutput as SDKPostToolUseFailureHookSpecificOutput, PostToolUseHookSpecificOutput as SDKPostToolUseHookSpecificOutput, PreToolUseHookSpecificOutput as SDKPreToolUseHookSpecificOutput, SessionStartHookSpecificOutput as SDKSessionStartHookSpecificOutput, SetupHookSpecificOutput as SDKSetupHookSpecificOutput, SubagentStartHookSpecificOutput as SDKSubagentStartHookSpecificOutput, SyncHookJSONOutput as SDKSyncHookJSONOutput, UserPromptSubmitHookSpecificOutput as SDKUserPromptSubmitHookSpecificOutput } from "@anthropic-ai/claude-agent-sdk/sdk.js";
11
12
  /**
12
13
  * Exit codes used by Claude Code hooks.
@@ -36,7 +37,7 @@ export type { SDKSyncHookJSONOutput };
36
37
  /**
37
38
  * Re-export SDK hook-specific output types (includes hookEventName discriminator).
38
39
  */
39
- export type { SDKNotificationHookSpecificOutput, SDKPreToolUseHookSpecificOutput, SDKPostToolUseHookSpecificOutput, SDKPostToolUseFailureHookSpecificOutput, SDKUserPromptSubmitHookSpecificOutput, SDKSessionStartHookSpecificOutput, SDKSetupHookSpecificOutput, SDKSubagentStartHookSpecificOutput, SDKPermissionRequestHookSpecificOutput, };
40
+ export type { SDKElicitationHookSpecificOutput, SDKElicitationResultHookSpecificOutput, SDKNotificationHookSpecificOutput, SDKPreToolUseHookSpecificOutput, SDKPostToolUseHookSpecificOutput, SDKPostToolUseFailureHookSpecificOutput, SDKUserPromptSubmitHookSpecificOutput, SDKSessionStartHookSpecificOutput, SDKSetupHookSpecificOutput, SDKSubagentStartHookSpecificOutput, SDKPermissionRequestHookSpecificOutput, };
40
41
  /**
41
42
  * PreToolUse hook-specific output fields.
42
43
  * Omits `hookEventName` which is added automatically by the builder.
@@ -77,6 +78,16 @@ export type PermissionRequestHookSpecificOutput = Omit<SDKPermissionRequestHookS
77
78
  * Omits `hookEventName` which is added automatically by the builder.
78
79
  */
79
80
  export type SetupHookSpecificOutput = Omit<SDKSetupHookSpecificOutput, "hookEventName">;
81
+ /**
82
+ * Elicitation hook-specific output fields.
83
+ * Omits `hookEventName` which is added automatically by the builder.
84
+ */
85
+ export type ElicitationHookSpecificOutput = Omit<SDKElicitationHookSpecificOutput, "hookEventName">;
86
+ /**
87
+ * ElicitationResult hook-specific output fields.
88
+ * Omits `hookEventName` which is added automatically by the builder.
89
+ */
90
+ export type ElicitationResultHookSpecificOutput = Omit<SDKElicitationResultHookSpecificOutput, "hookEventName">;
80
91
  /**
81
92
  * Allow decision for permission requests.
82
93
  * Derived from SDK's PermissionRequestHookSpecificOutput.
@@ -104,7 +115,7 @@ export type NotificationHookSpecificOutput = Omit<SDKNotificationHookSpecificOut
104
115
  /**
105
116
  * Full hook-specific output with hookEventName discriminator.
106
117
  */
107
- export type HookSpecificOutput = SDKPreToolUseHookSpecificOutput | SDKPostToolUseHookSpecificOutput | SDKPostToolUseFailureHookSpecificOutput | SDKUserPromptSubmitHookSpecificOutput | SDKSessionStartHookSpecificOutput | SDKSetupHookSpecificOutput | SDKSubagentStartHookSpecificOutput | SDKPermissionRequestHookSpecificOutput | SDKNotificationHookSpecificOutput;
118
+ export type HookSpecificOutput = SDKPreToolUseHookSpecificOutput | SDKPostToolUseHookSpecificOutput | SDKPostToolUseFailureHookSpecificOutput | SDKUserPromptSubmitHookSpecificOutput | SDKSessionStartHookSpecificOutput | SDKSetupHookSpecificOutput | SDKSubagentStartHookSpecificOutput | SDKPermissionRequestHookSpecificOutput | SDKNotificationHookSpecificOutput | SDKElicitationHookSpecificOutput | SDKElicitationResultHookSpecificOutput;
108
119
  /**
109
120
  * The JSON output format expected by Claude Code (sync hooks only).
110
121
  * Extends SDK's SyncHookJSONOutput to include Notification hook support.
@@ -132,6 +143,8 @@ export interface SyncHookJSONOutput {
132
143
  export interface HookOutput {
133
144
  /** JSON-serializable output to write to stdout. */
134
145
  stdout: SyncHookJSONOutput;
146
+ /** Optional message to write to stderr. When present, the runtime exits with code 2 (BLOCK). */
147
+ stderr?: string;
135
148
  }
136
149
  /**
137
150
  * Common options available to all output builders.
@@ -147,12 +160,24 @@ export interface CommonOptions {
147
160
  /** Reason for stopping/blocking (sets exit code to BLOCK). */
148
161
  stopReason?: string;
149
162
  }
163
+ /**
164
+ * Options for exit-code-based hooks (TeammateIdle, TaskCompleted).
165
+ *
166
+ * These hooks use exit codes only, not JSON decision control.
167
+ * When `stderr` is provided, the runtime writes it to stderr and exits with code 2 (BLOCK).
168
+ * When absent, the hook exits with code 0 (SUCCESS).
169
+ */
170
+ export interface ExitCodeOptions {
171
+ /** Message to write to stderr. When present, exits with code 2 (BLOCK). */
172
+ stderr?: string;
173
+ }
150
174
  /**
151
175
  * Base structure for all specific outputs.
152
176
  */
153
177
  interface BaseSpecificOutput<T extends string> {
154
178
  readonly _type: T;
155
179
  stdout: SyncHookJSONOutput;
180
+ stderr?: string;
156
181
  }
157
182
  /**
158
183
  *
@@ -214,10 +239,34 @@ export type TeammateIdleOutput = BaseSpecificOutput<"TeammateIdle">;
214
239
  *
215
240
  */
216
241
  export type TaskCompletedOutput = BaseSpecificOutput<"TaskCompleted">;
242
+ /**
243
+ *
244
+ */
245
+ export type ElicitationOutput = BaseSpecificOutput<"Elicitation">;
246
+ /**
247
+ *
248
+ */
249
+ export type ElicitationResultOutput = BaseSpecificOutput<"ElicitationResult">;
250
+ /**
251
+ *
252
+ */
253
+ export type ConfigChangeOutput = BaseSpecificOutput<"ConfigChange">;
254
+ /**
255
+ *
256
+ */
257
+ export type InstructionsLoadedOutput = BaseSpecificOutput<"InstructionsLoaded">;
258
+ /**
259
+ *
260
+ */
261
+ export type WorktreeCreateOutput = BaseSpecificOutput<"WorktreeCreate">;
262
+ /**
263
+ *
264
+ */
265
+ export type WorktreeRemoveOutput = BaseSpecificOutput<"WorktreeRemove">;
217
266
  /**
218
267
  * Union of all specific output types.
219
268
  */
220
- export type SpecificHookOutput = PreToolUseOutput | PostToolUseOutput | PostToolUseFailureOutput | NotificationOutput | UserPromptSubmitOutput | SessionStartOutput | SessionEndOutput | StopOutput | SubagentStartOutput | SubagentStopOutput | PreCompactOutput | PermissionRequestOutput | SetupOutput | TeammateIdleOutput | TaskCompletedOutput;
269
+ export type SpecificHookOutput = PreToolUseOutput | PostToolUseOutput | PostToolUseFailureOutput | NotificationOutput | UserPromptSubmitOutput | SessionStartOutput | SessionEndOutput | StopOutput | SubagentStartOutput | SubagentStopOutput | PreCompactOutput | PermissionRequestOutput | SetupOutput | TeammateIdleOutput | TaskCompletedOutput | ElicitationOutput | ElicitationResultOutput | ConfigChangeOutput | InstructionsLoadedOutput | WorktreeCreateOutput | WorktreeRemoveOutput;
221
270
  /**
222
271
  * Options for decision-based hooks (Stop, SubagentStop).
223
272
  */
@@ -606,39 +655,173 @@ export declare const setupOutput: (options?: CommonOptions & {
606
655
  };
607
656
  /**
608
657
  * Options for the TeammateIdle output builder.
609
- * TeammateIdle hooks only support common options.
658
+ * TeammateIdle hooks use exit codes only, not JSON decision control.
610
659
  */
611
- export type TeammateIdleOptions = CommonOptions;
660
+ export type TeammateIdleOptions = ExitCodeOptions;
612
661
  /**
613
662
  * Creates an output for TeammateIdle hooks.
614
663
  * @param options - Configuration options for the hook output
615
664
  * @returns A TeammateIdleOutput object ready for the runtime
616
665
  * @example
617
666
  * ```typescript
667
+ * // Allow teammate to go idle
618
668
  * teammateIdleOutput({});
669
+ *
670
+ * // Block with feedback
671
+ * teammateIdleOutput({ stderr: 'Continue working: unfinished tasks remain.' });
619
672
  * ```
620
673
  */
621
- export declare const teammateIdleOutput: (options?: CommonOptions) => {
674
+ export declare const teammateIdleOutput: ({ stderr }?: ExitCodeOptions) => {
622
675
  readonly _type: "TeammateIdle";
623
676
  stdout: SyncHookJSONOutput;
677
+ stderr?: string;
624
678
  };
625
679
  /**
626
680
  * Options for the TaskCompleted output builder.
627
- * TaskCompleted hooks only support common options.
681
+ * TaskCompleted hooks use exit codes only, not JSON decision control.
628
682
  */
629
- export type TaskCompletedOptions = CommonOptions;
683
+ export type TaskCompletedOptions = ExitCodeOptions;
630
684
  /**
631
685
  * Creates an output for TaskCompleted hooks.
632
686
  * @param options - Configuration options for the hook output
633
687
  * @returns A TaskCompletedOutput object ready for the runtime
634
688
  * @example
635
689
  * ```typescript
690
+ * // Allow task completion
636
691
  * taskCompletedOutput({});
692
+ *
693
+ * // Block with feedback
694
+ * taskCompletedOutput({ stderr: 'Cannot complete: tests are failing.' });
637
695
  * ```
638
696
  */
639
- export declare const taskCompletedOutput: (options?: CommonOptions) => {
697
+ export declare const taskCompletedOutput: ({ stderr }?: ExitCodeOptions) => {
640
698
  readonly _type: "TaskCompleted";
641
699
  stdout: SyncHookJSONOutput;
700
+ stderr?: string;
701
+ };
702
+ /**
703
+ * Options for the Elicitation output builder.
704
+ */
705
+ export type ElicitationOptions = CommonOptions & {
706
+ /** Hook-specific output matching the wire format. */
707
+ hookSpecificOutput?: ElicitationHookSpecificOutput;
708
+ };
709
+ /**
710
+ * Creates an output for Elicitation hooks.
711
+ * @param options - Configuration options for the hook output
712
+ * @returns An ElicitationOutput object ready for the runtime
713
+ * @example
714
+ * ```typescript
715
+ * // Accept the elicitation
716
+ * elicitationOutput({
717
+ * hookSpecificOutput: { action: 'accept', content: { username: 'alice' } }
718
+ * });
719
+ *
720
+ * // Decline the elicitation
721
+ * elicitationOutput({
722
+ * hookSpecificOutput: { action: 'decline' }
723
+ * });
724
+ * ```
725
+ */
726
+ export declare const elicitationOutput: (options?: CommonOptions & {
727
+ hookSpecificOutput?: ElicitationHookSpecificOutput | undefined;
728
+ }) => {
729
+ readonly _type: "Elicitation";
730
+ stdout: SyncHookJSONOutput;
731
+ };
732
+ /**
733
+ * Options for the ElicitationResult output builder.
734
+ */
735
+ export type ElicitationResultOptions = CommonOptions & {
736
+ /** Hook-specific output matching the wire format. */
737
+ hookSpecificOutput?: ElicitationResultHookSpecificOutput;
738
+ };
739
+ /**
740
+ * Creates an output for ElicitationResult hooks.
741
+ * @param options - Configuration options for the hook output
742
+ * @returns An ElicitationResultOutput object ready for the runtime
743
+ * @example
744
+ * ```typescript
745
+ * elicitationResultOutput({});
746
+ * ```
747
+ */
748
+ export declare const elicitationResultOutput: (options?: CommonOptions & {
749
+ hookSpecificOutput?: ElicitationResultHookSpecificOutput | undefined;
750
+ }) => {
751
+ readonly _type: "ElicitationResult";
752
+ stdout: SyncHookJSONOutput;
753
+ };
754
+ /**
755
+ * Options for the ConfigChange output builder.
756
+ * ConfigChange hooks only support common options.
757
+ */
758
+ export type ConfigChangeOptions = CommonOptions;
759
+ /**
760
+ * Creates an output for ConfigChange hooks.
761
+ * @param options - Configuration options for the hook output
762
+ * @returns A ConfigChangeOutput object ready for the runtime
763
+ * @example
764
+ * ```typescript
765
+ * configChangeOutput({});
766
+ * ```
767
+ */
768
+ export declare const configChangeOutput: (options?: CommonOptions) => {
769
+ readonly _type: "ConfigChange";
770
+ stdout: SyncHookJSONOutput;
771
+ };
772
+ /**
773
+ * Options for the InstructionsLoaded output builder.
774
+ * InstructionsLoaded hooks only support common options.
775
+ */
776
+ export type InstructionsLoadedOptions = CommonOptions;
777
+ /**
778
+ * Creates an output for InstructionsLoaded hooks.
779
+ * @param options - Configuration options for the hook output
780
+ * @returns An InstructionsLoadedOutput object ready for the runtime
781
+ * @example
782
+ * ```typescript
783
+ * instructionsLoadedOutput({});
784
+ * ```
785
+ */
786
+ export declare const instructionsLoadedOutput: (options?: CommonOptions) => {
787
+ readonly _type: "InstructionsLoaded";
788
+ stdout: SyncHookJSONOutput;
789
+ };
790
+ /**
791
+ * Options for the WorktreeCreate output builder.
792
+ * WorktreeCreate hooks only support common options.
793
+ */
794
+ export type WorktreeCreateOptions = CommonOptions;
795
+ /**
796
+ * Creates an output for WorktreeCreate hooks.
797
+ * @param options - Configuration options for the hook output
798
+ * @returns A WorktreeCreateOutput object ready for the runtime
799
+ * @example
800
+ * ```typescript
801
+ * worktreeCreateOutput({});
802
+ * ```
803
+ */
804
+ export declare const worktreeCreateOutput: (options?: CommonOptions) => {
805
+ readonly _type: "WorktreeCreate";
806
+ stdout: SyncHookJSONOutput;
807
+ };
808
+ /**
809
+ * Options for the WorktreeRemove output builder.
810
+ * WorktreeRemove hooks only support common options.
811
+ */
812
+ export type WorktreeRemoveOptions = CommonOptions;
813
+ /**
814
+ * Creates an output for WorktreeRemove hooks.
815
+ * @param options - Configuration options for the hook output
816
+ * @returns A WorktreeRemoveOutput object ready for the runtime
817
+ * @example
818
+ * ```typescript
819
+ * worktreeRemoveOutput({});
820
+ * ```
821
+ */
822
+ export declare const worktreeRemoveOutput: (options?: CommonOptions) => {
823
+ readonly _type: "WorktreeRemove";
824
+ stdout: SyncHookJSONOutput;
642
825
  };
643
826
  /**
644
827
  * @deprecated Use CommonOptions instead
@@ -24,8 +24,8 @@ import type { HookInput } from "./types.js";
24
24
  /**
25
25
  * Converts a SpecificHookOutput to HookOutput for wire format.
26
26
  *
27
- * SpecificHookOutput types have: { _type, exitCode, stdout, stderr? }
28
- * HookOutput has: { exitCode, stdout, stderr? }
27
+ * SpecificHookOutput types have: { _type, stdout, stderr? }
28
+ * HookOutput has: { stdout, stderr? }
29
29
  *
30
30
  * Since output builders now produce wire-format directly, this function
31
31
  * simply strips the `_type` discriminator field.
@@ -36,7 +36,7 @@ import type { HookInput } from "./types.js";
36
36
  * ```typescript
37
37
  * const specificOutput = preToolUseOutput({ hookSpecificOutput: { permissionDecision: 'allow' } });
38
38
  * const hookOutput = convertToHookOutput(specificOutput);
39
- * // hookOutput: { exitCode: 0, stdout: { hookSpecificOutput: { ... } } }
39
+ * // hookOutput: { stdout: { hookSpecificOutput: { ... } } }
40
40
  * ```
41
41
  */
42
42
  export declare function convertToHookOutput(specificOutput: SpecificHookOutput): HookOutput;
package/types/types.d.ts CHANGED
@@ -12,8 +12,8 @@
12
12
  * Re-exports types from @anthropic-ai/claude-agent-sdk with "SDK" prefix.
13
13
  * These are used as base types for extension, ensuring synchronization with the SDK.
14
14
  */
15
- export type { BaseHookInput as SDKBaseHookInput, HookEvent as SDKHookEvent, HookInput as SDKHookInput, NotificationHookInput as SDKNotificationHookInput, PermissionMode as SDKPermissionMode, PermissionRequestHookInput as SDKPermissionRequestHookInput, PermissionUpdate as SDKPermissionUpdate, PostToolUseFailureHookInput as SDKPostToolUseFailureHookInput, PostToolUseHookInput as SDKPostToolUseHookInput, PreCompactHookInput as SDKPreCompactHookInput, PreToolUseHookInput as SDKPreToolUseHookInput, SessionEndHookInput as SDKSessionEndHookInput, SessionStartHookInput as SDKSessionStartHookInput, SetupHookInput as SDKSetupHookInput, StopHookInput as SDKStopHookInput, SubagentStartHookInput as SDKSubagentStartHookInput, SubagentStopHookInput as SDKSubagentStopHookInput, TaskCompletedHookInput as SDKTaskCompletedHookInput, TeammateIdleHookInput as SDKTeammateIdleHookInput, UserPromptSubmitHookInput as SDKUserPromptSubmitHookInput, } from "@anthropic-ai/claude-agent-sdk";
16
- import type { BaseHookInput as SDKBaseHookInput, NotificationHookInput as SDKNotificationHookInput, PermissionMode as SDKPermissionMode, PermissionRequestHookInput as SDKPermissionRequestHookInput, PermissionUpdate as SDKPermissionUpdate, PostToolUseFailureHookInput as SDKPostToolUseFailureHookInput, PostToolUseHookInput as SDKPostToolUseHookInput, PreCompactHookInput as SDKPreCompactHookInput, PreToolUseHookInput as SDKPreToolUseHookInput, SessionEndHookInput as SDKSessionEndHookInput, SessionStartHookInput as SDKSessionStartHookInput, SetupHookInput as SDKSetupHookInput, StopHookInput as SDKStopHookInput, SubagentStartHookInput as SDKSubagentStartHookInput, SubagentStopHookInput as SDKSubagentStopHookInput, TaskCompletedHookInput as SDKTaskCompletedHookInput, TeammateIdleHookInput as SDKTeammateIdleHookInput, UserPromptSubmitHookInput as SDKUserPromptSubmitHookInput } from "@anthropic-ai/claude-agent-sdk";
15
+ export type { BaseHookInput as SDKBaseHookInput, ConfigChangeHookInput as SDKConfigChangeHookInput, ElicitationHookInput as SDKElicitationHookInput, ElicitationResultHookInput as SDKElicitationResultHookInput, HookEvent as SDKHookEvent, HookInput as SDKHookInput, InstructionsLoadedHookInput as SDKInstructionsLoadedHookInput, NotificationHookInput as SDKNotificationHookInput, PermissionMode as SDKPermissionMode, PermissionRequestHookInput as SDKPermissionRequestHookInput, PermissionUpdate as SDKPermissionUpdate, PostToolUseFailureHookInput as SDKPostToolUseFailureHookInput, PostToolUseHookInput as SDKPostToolUseHookInput, PreCompactHookInput as SDKPreCompactHookInput, PreToolUseHookInput as SDKPreToolUseHookInput, SessionEndHookInput as SDKSessionEndHookInput, SessionStartHookInput as SDKSessionStartHookInput, SetupHookInput as SDKSetupHookInput, StopHookInput as SDKStopHookInput, SubagentStartHookInput as SDKSubagentStartHookInput, SubagentStopHookInput as SDKSubagentStopHookInput, TaskCompletedHookInput as SDKTaskCompletedHookInput, TeammateIdleHookInput as SDKTeammateIdleHookInput, UserPromptSubmitHookInput as SDKUserPromptSubmitHookInput, WorktreeCreateHookInput as SDKWorktreeCreateHookInput, WorktreeRemoveHookInput as SDKWorktreeRemoveHookInput, } from "@anthropic-ai/claude-agent-sdk";
16
+ import type { BaseHookInput as SDKBaseHookInput, ConfigChangeHookInput as SDKConfigChangeHookInput, ElicitationHookInput as SDKElicitationHookInput, ElicitationResultHookInput as SDKElicitationResultHookInput, InstructionsLoadedHookInput as SDKInstructionsLoadedHookInput, NotificationHookInput as SDKNotificationHookInput, PermissionMode as SDKPermissionMode, PermissionRequestHookInput as SDKPermissionRequestHookInput, PermissionUpdate as SDKPermissionUpdate, PostToolUseFailureHookInput as SDKPostToolUseFailureHookInput, PostToolUseHookInput as SDKPostToolUseHookInput, PreCompactHookInput as SDKPreCompactHookInput, PreToolUseHookInput as SDKPreToolUseHookInput, SessionEndHookInput as SDKSessionEndHookInput, SessionStartHookInput as SDKSessionStartHookInput, SetupHookInput as SDKSetupHookInput, StopHookInput as SDKStopHookInput, SubagentStartHookInput as SDKSubagentStartHookInput, SubagentStopHookInput as SDKSubagentStopHookInput, TaskCompletedHookInput as SDKTaskCompletedHookInput, TeammateIdleHookInput as SDKTeammateIdleHookInput, UserPromptSubmitHookInput as SDKUserPromptSubmitHookInput, WorktreeCreateHookInput as SDKWorktreeCreateHookInput, WorktreeRemoveHookInput as SDKWorktreeRemoveHookInput } from "@anthropic-ai/claude-agent-sdk";
17
17
  import type { AgentInput, AskUserQuestionInput, BashInput, ConfigInput, ExitPlanModeInput, FileEditInput, FileReadInput, FileWriteInput, GlobInput, GrepInput, TaskStopInput as KillShellInput, ListMcpResourcesInput, McpInput, NotebookEditInput, ReadMcpResourceInput, TaskOutputInput, TodoWriteInput, WebFetchInput, WebSearchInput } from "@anthropic-ai/claude-agent-sdk/sdk-tools.js";
18
18
  /**
19
19
  * Permission mode for controlling how tool executions are handled.
@@ -165,6 +165,74 @@ export type TeammateIdleInput = {
165
165
  export type TaskCompletedInput = {
166
166
  [K in keyof SDKTaskCompletedHookInput]: SDKTaskCompletedHookInput[K];
167
167
  } & {};
168
+ /**
169
+ * Input for Elicitation hooks.
170
+ *
171
+ * Fires when an MCP server requests user input (elicitation), allowing you to:
172
+ * - Intercept and handle MCP server prompts programmatically
173
+ * - Accept, decline, or cancel elicitation requests
174
+ * - Provide structured form input or URL-based auth responses
175
+ * @see https://code.claude.com/docs/en/hooks#elicitation
176
+ */
177
+ export type ElicitationInput = {
178
+ [K in keyof SDKElicitationHookInput]: SDKElicitationHookInput[K];
179
+ } & {};
180
+ /**
181
+ * Input for ElicitationResult hooks.
182
+ *
183
+ * Fires with the result of an elicitation request, allowing you to:
184
+ * - Observe and log elicitation outcomes
185
+ * - Modify the result before it is returned to the MCP server
186
+ * @see https://code.claude.com/docs/en/hooks#elicitationresult
187
+ */
188
+ export type ElicitationResultInput = {
189
+ [K in keyof SDKElicitationResultHookInput]: SDKElicitationResultHookInput[K];
190
+ } & {};
191
+ /**
192
+ * Input for ConfigChange hooks.
193
+ *
194
+ * Fires when Claude Code configuration changes (settings files, skills), allowing you to:
195
+ * - React to configuration changes
196
+ * - Log or audit configuration changes
197
+ * - Apply custom logic when settings are updated
198
+ * @see https://code.claude.com/docs/en/hooks#configchange
199
+ */
200
+ export type ConfigChangeInput = {
201
+ [K in keyof SDKConfigChangeHookInput]: SDKConfigChangeHookInput[K];
202
+ } & {};
203
+ /**
204
+ * Input for InstructionsLoaded hooks.
205
+ *
206
+ * Fires when a CLAUDE.md (or similar instructions file) is loaded, allowing you to:
207
+ * - React to instructions being loaded
208
+ * - Log which instruction files are active for the session
209
+ * @see https://code.claude.com/docs/en/hooks#instructionsloaded
210
+ */
211
+ export type InstructionsLoadedInput = {
212
+ [K in keyof SDKInstructionsLoadedHookInput]: SDKInstructionsLoadedHookInput[K];
213
+ } & {};
214
+ /**
215
+ * Input for WorktreeCreate hooks.
216
+ *
217
+ * Fires when a git worktree is created, allowing you to:
218
+ * - React to new worktree creation
219
+ * - Set up worktree-specific configuration
220
+ * @see https://code.claude.com/docs/en/hooks#worktreecreate
221
+ */
222
+ export type WorktreeCreateInput = {
223
+ [K in keyof SDKWorktreeCreateHookInput]: SDKWorktreeCreateHookInput[K];
224
+ } & {};
225
+ /**
226
+ * Input for WorktreeRemove hooks.
227
+ *
228
+ * Fires when a git worktree is removed, allowing you to:
229
+ * - React to worktree removal
230
+ * - Clean up worktree-specific resources
231
+ * @see https://code.claude.com/docs/en/hooks#worktreeremove
232
+ */
233
+ export type WorktreeRemoveInput = {
234
+ [K in keyof SDKWorktreeRemoveHookInput]: SDKWorktreeRemoveHookInput[K];
235
+ } & {};
168
236
  /**
169
237
  * Input for SessionEnd hooks.
170
238
  *
@@ -259,7 +327,7 @@ export type SetupTrigger = "init" | "maintenance";
259
327
  * ```
260
328
  * @see https://code.claude.com/docs/en/hooks
261
329
  */
262
- export type HookInput = PreToolUseInput | PostToolUseInput | PostToolUseFailureInput | NotificationInput | UserPromptSubmitInput | SessionStartInput | SessionEndInput | StopInput | SubagentStartInput | SubagentStopInput | PreCompactInput | PermissionRequestInput | SetupInput | TeammateIdleInput | TaskCompletedInput;
330
+ export type HookInput = PreToolUseInput | PostToolUseInput | PostToolUseFailureInput | NotificationInput | UserPromptSubmitInput | SessionStartInput | SessionEndInput | StopInput | SubagentStartInput | SubagentStopInput | PreCompactInput | PermissionRequestInput | SetupInput | TeammateIdleInput | TaskCompletedInput | ElicitationInput | ElicitationResultInput | ConfigChangeInput | InstructionsLoadedInput | WorktreeCreateInput | WorktreeRemoveInput;
263
331
  /**
264
332
  * Hook event name literal union.
265
333
  *
@@ -277,7 +345,7 @@ export type HookEventName = HookInput["hook_event_name"];
277
345
  * }
278
346
  * ```
279
347
  */
280
- export declare const HOOK_EVENT_NAMES: readonly ["PreToolUse", "PostToolUse", "PostToolUseFailure", "Notification", "UserPromptSubmit", "SessionStart", "SessionEnd", "Stop", "SubagentStart", "SubagentStop", "PreCompact", "PermissionRequest", "Setup", "TeammateIdle", "TaskCompleted"];
348
+ export declare const HOOK_EVENT_NAMES: readonly ["PreToolUse", "PostToolUse", "PostToolUseFailure", "Notification", "UserPromptSubmit", "SessionStart", "SessionEnd", "Stop", "SubagentStart", "SubagentStop", "PreCompact", "PermissionRequest", "Setup", "TeammateIdle", "TaskCompleted", "Elicitation", "ElicitationResult", "ConfigChange", "InstructionsLoaded", "WorktreeCreate", "WorktreeRemove"];
281
349
  export type { SDKPermissionUpdate as PermissionUpdate };
282
350
  /**
283
351
  * Re-export all tool input types from the official Claude Agent SDK.