# tirith nushell hook # LIMITATION: Cannot block execution — warn-only mode # Add to config.nu: source ~/.local/share/tirith/shell/lib/nushell-hook.nu # Guard against double-loading if not ('_TIRITH_NU_LOADED' in $env) { $env._TIRITH_NU_LOADED = true # Defensively initialize pre_execution if absent/null (fresh configs may lack it) let existing = ($env.config.hooks.pre_execution? | default []) $env.config.hooks.pre_execution = ($existing | append {|| # Reentrancy guard (safety — pre_execution shouldn't recurse, # but guard prevents issues if Nushell behavior changes) if ('_TIRITH_NU_RUNNING' in $env) and $env._TIRITH_NU_RUNNING { return } let cmd = (commandline) if ($cmd | is-empty) { return } # Skip tirith's own commands (engine also guards via is_self_invocation, # but this avoids spawning a subprocess entirely) let first_word = ($cmd | split row ' ' | first) if ($first_word == "tirith") or ($first_word | str ends-with "/tirith") { return } $env._TIRITH_NU_RUNNING = true try { let result = (do { ^tirith check --non-interactive --interactive --shell posix -- $cmd } | complete) $env._TIRITH_NU_RUNNING = false if $result.exit_code != 0 { print -e $"(ansi red_bold)tirith warning:(ansi reset) security concerns detected" if ($result.stderr | is-not-empty) { print -e $result.stderr } print -e $"(ansi yellow_dimmed)Nushell cannot block execution. Review the command above.(ansi reset)" } } catch { $env._TIRITH_NU_RUNNING = false } } ) }