@@ -476,6 +476,37 @@ func TestValidateHooksNormalizesEventNames(t *testing.T) {
479+func TestRunnerHookNameUsesDisplayName(t *testing.T) {
482+ t.Run("name field is used when set", func(t *testing.T) {
484+ hookCfg := config.HookConfig{
486+ Command: `echo '{"decision":"allow"}'`,
488+ r := NewRunner([]config.HookConfig{hookCfg}, t.TempDir(), t.TempDir())
489+ result, err := r.Run(context.Background(), EventPreToolUse, "sess", "bash", `{}`)
490+ require.NoError(t, err)
491+ require.Equal(t, DecisionAllow, result.Decision)
492+ require.Len(t, result.Hooks, 1)
493+ require.Equal(t, "my-hook", result.Hooks[0].Name)
496+ t.Run("command is used when name is empty", func(t *testing.T) {
498+ hookCfg := config.HookConfig{
499+ Command: `echo '{"decision":"allow"}'`,
501+ r := NewRunner([]config.HookConfig{hookCfg}, t.TempDir(), t.TempDir())
502+ result, err := r.Run(context.Background(), EventPreToolUse, "sess", "bash", `{}`)
503+ require.NoError(t, err)
504+ require.Equal(t, DecisionAllow, result.Decision)
505+ require.Len(t, result.Hooks, 1)
506+ require.Equal(t, `echo '{"decision":"allow"}'`, result.Hooks[0].Name)
479func TestRunnerParallelExecution(t *testing.T) {
510func TestRunnerParallelExecution(t *testing.T) {
480 t.Parallel()
511 t.Parallel()
481 // Two hooks: one allows, one denies. Deny should win.
512 // Two hooks: one allows, one denies. Deny should win.