From 0f5b32b78f9bf27903816708c796a7d08a723862 Mon Sep 17 00:00:00 2001 From: Abhinav Vedmala Date: Fri, 1 May 2026 10:34:20 -0700 Subject: [PATCH] run skill hooks from the skill directory --- codex-rs/core/tests/suite/hooks.rs | 7 ++----- codex-rs/hooks/src/engine/command_runner.rs | 3 ++- codex-rs/hooks/src/engine/discovery.rs | 9 +++++++++ codex-rs/hooks/src/engine/dispatcher.rs | 1 + codex-rs/hooks/src/engine/mod.rs | 1 + codex-rs/hooks/src/events/post_tool_use.rs | 1 + codex-rs/hooks/src/events/pre_tool_use.rs | 1 + codex-rs/hooks/src/events/session_start.rs | 1 + codex-rs/hooks/src/events/stop.rs | 1 + codex-rs/hooks/src/events/user_prompt_submit.rs | 1 + 10 files changed, 20 insertions(+), 6 deletions(-) diff --git a/codex-rs/core/tests/suite/hooks.rs b/codex-rs/core/tests/suite/hooks.rs index 402ec1a5ba..9b27847b39 100644 --- a/codex-rs/core/tests/suite/hooks.rs +++ b/codex-rs/core/tests/suite/hooks.rs @@ -2051,8 +2051,7 @@ print(json.dumps({{ .context("write skill pre tool use hook script")?; fs::write( skill_dir.join("SKILL.md"), - format!( - r#"--- + r#"--- name: secure-operations description: Perform operations with security checks hooks: @@ -2060,13 +2059,11 @@ hooks: - matcher: "^Bash$" hooks: - type: command - command: "python3 {script_path}" + command: "python3 ./pre_tool_use_hook.py" --- # Body "#, - script_path = script_path.display(), - ), ) .context("write skill")?; diff --git a/codex-rs/hooks/src/engine/command_runner.rs b/codex-rs/hooks/src/engine/command_runner.rs index 7366d4ec51..830678a238 100644 --- a/codex-rs/hooks/src/engine/command_runner.rs +++ b/codex-rs/hooks/src/engine/command_runner.rs @@ -29,10 +29,11 @@ pub(crate) async fn run_command( ) -> CommandRunResult { let started_at = chrono::Utc::now().timestamp(); let started = Instant::now(); + let execution_cwd = handler.execution_cwd.as_deref().unwrap_or(cwd); let mut command = build_command(shell, handler); command - .current_dir(cwd) + .current_dir(execution_cwd) .stdin(Stdio::piped()) .stdout(Stdio::piped()) .stderr(Stdio::piped()) diff --git a/codex-rs/hooks/src/engine/discovery.rs b/codex-rs/hooks/src/engine/discovery.rs index 8185314068..73dbb9aadd 100644 --- a/codex-rs/hooks/src/engine/discovery.rs +++ b/codex-rs/hooks/src/engine/discovery.rs @@ -39,6 +39,7 @@ struct HookHandlerSource<'a> { source: HookSource, disabled_hook_keys: &'a HashSet, env: HashMap, + execution_cwd: Option, plugin_id: Option, } @@ -95,6 +96,7 @@ pub(crate) fn discover_handlers( source: hook_source, disabled_hook_keys: &disabled_hook_keys, env: HashMap::new(), + execution_cwd: None, plugin_id: None, }, hook_events, @@ -146,6 +148,7 @@ fn append_managed_requirement_handlers( source: hook_source_for_requirement_source(managed_hooks.source.as_ref()), disabled_hook_keys, env: HashMap::new(), + execution_cwd: None, plugin_id: None, }, managed_hooks.get().hooks.clone(), @@ -191,6 +194,7 @@ fn append_plugin_hook_sources( source: HookSource::Plugin, disabled_hook_keys, env, + execution_cwd: None, plugin_id: Some(plugin_id), }, hooks, @@ -229,6 +233,7 @@ pub(crate) fn append_skill_hook_sources( source: HookSource::Skill, disabled_hook_keys: &disabled_hook_keys, env: HashMap::new(), + execution_cwd: source_path.parent(), plugin_id: None, }, hooks, @@ -475,6 +480,7 @@ fn append_matcher_groups( source: source.source, display_order: *display_order, env: source.env.clone(), + execution_cwd: source.execution_cwd.clone(), }); } *display_order += 1; @@ -568,6 +574,7 @@ mod tests { source: hook_source(), disabled_hook_keys, env: std::collections::HashMap::new(), + execution_cwd: None, plugin_id: None, } } @@ -615,6 +622,7 @@ mod tests { source: hook_source(), display_order: 0, env: std::collections::HashMap::new(), + execution_cwd: None, }] ); } @@ -650,6 +658,7 @@ mod tests { source: hook_source(), display_order: 0, env: std::collections::HashMap::new(), + execution_cwd: None, }] ); } diff --git a/codex-rs/hooks/src/engine/dispatcher.rs b/codex-rs/hooks/src/engine/dispatcher.rs index c44b1fe69d..f39b34217d 100644 --- a/codex-rs/hooks/src/engine/dispatcher.rs +++ b/codex-rs/hooks/src/engine/dispatcher.rs @@ -164,6 +164,7 @@ mod tests { source: HookSource::User, display_order, env: std::collections::HashMap::new(), + execution_cwd: None, } } diff --git a/codex-rs/hooks/src/engine/mod.rs b/codex-rs/hooks/src/engine/mod.rs index 299435117c..3d819b97b0 100644 --- a/codex-rs/hooks/src/engine/mod.rs +++ b/codex-rs/hooks/src/engine/mod.rs @@ -45,6 +45,7 @@ pub(crate) struct ConfiguredHandler { pub source: HookSource, pub display_order: i64, pub env: HashMap, + pub execution_cwd: Option, } impl ConfiguredHandler { diff --git a/codex-rs/hooks/src/events/post_tool_use.rs b/codex-rs/hooks/src/events/post_tool_use.rs index 63045ef425..ab7b37716c 100644 --- a/codex-rs/hooks/src/events/post_tool_use.rs +++ b/codex-rs/hooks/src/events/post_tool_use.rs @@ -551,6 +551,7 @@ mod tests { source: codex_protocol::protocol::HookSource::User, display_order: 0, env: std::collections::HashMap::new(), + execution_cwd: None, } } diff --git a/codex-rs/hooks/src/events/pre_tool_use.rs b/codex-rs/hooks/src/events/pre_tool_use.rs index 6fe1555229..bed0467c3e 100644 --- a/codex-rs/hooks/src/events/pre_tool_use.rs +++ b/codex-rs/hooks/src/events/pre_tool_use.rs @@ -542,6 +542,7 @@ mod tests { source: codex_protocol::protocol::HookSource::User, display_order: 0, env: std::collections::HashMap::new(), + execution_cwd: None, } } diff --git a/codex-rs/hooks/src/events/session_start.rs b/codex-rs/hooks/src/events/session_start.rs index f064f67b20..097933cd18 100644 --- a/codex-rs/hooks/src/events/session_start.rs +++ b/codex-rs/hooks/src/events/session_start.rs @@ -364,6 +364,7 @@ mod tests { source: codex_protocol::protocol::HookSource::User, display_order: 0, env: std::collections::HashMap::new(), + execution_cwd: None, } } diff --git a/codex-rs/hooks/src/events/stop.rs b/codex-rs/hooks/src/events/stop.rs index 8fc176a474..511a1ba8f1 100644 --- a/codex-rs/hooks/src/events/stop.rs +++ b/codex-rs/hooks/src/events/stop.rs @@ -531,6 +531,7 @@ mod tests { source: codex_protocol::protocol::HookSource::User, display_order: 0, env: std::collections::HashMap::new(), + execution_cwd: None, } } diff --git a/codex-rs/hooks/src/events/user_prompt_submit.rs b/codex-rs/hooks/src/events/user_prompt_submit.rs index a04711eb40..084c227757 100644 --- a/codex-rs/hooks/src/events/user_prompt_submit.rs +++ b/codex-rs/hooks/src/events/user_prompt_submit.rs @@ -422,6 +422,7 @@ mod tests { source: codex_protocol::protocol::HookSource::User, display_order: 0, env: std::collections::HashMap::new(), + execution_cwd: None, } }