kabu 0.7.1

CLI tool to enhance git worktree and jj workspace with automated setup
# kabu init (elvish)
if (has-external ::KABU::) {
  eval (::KABU:: completions elvish | slurp)
}

fn __kabu_cmd {|@args| ::KABU:: $@args }

fn kabu {|@args|
  if (and (eq (count $@args) 1) (eq $args[0] 'cd')) {
    # Only use interactive path selection when "cd" has no additional arguments
    # If any arguments are provided (like --help), pass them to the command
    var dest = (::KABU:: path)
    if (not (eq $dest '')) {
      cd $dest
    }
  } elif (and (> (count $@args) 0) (eq $args[0] 'add')) {
    var cd_to = (try { ::KABU:: config get auto_cd.after_add } catch { "" })

    # Capture output while displaying it
    var tmpfile = (mktemp)
    try {
      ::KABU:: $@args 2>&1 | tee $tmpfile
    } catch {
      rm -f $tmpfile
      fail "kabu add failed"
    }

    if (eq $cd_to 'true') {
      var new_path = (tail -1 $tmpfile)
      if (and (not (eq $new_path '')) (path:is-dir $new_path)) {
        cd $new_path
      }
    }

    rm -f $tmpfile
  } elif (and (> (count $@args) 0) (or (eq $args[0] 'remove') (eq $args[0] 'rm'))) {
    var current_dir = $pwd
    # Get settings BEFORE removing (directory may not exist after)
    var cd_to = (try { ::KABU:: config get auto_cd.after_remove } catch { "" })
    var main_path = (try { ::KABU:: path --main } catch { "" })

    __kabu_cmd $@args

    # Check if current directory was removed
    if (not (path:is-dir $current_dir)) {
      if (eq $cd_to 'main') {
        if (not (eq $main_path '')) {
          cd $main_path
        }
      } elif (eq $cd_to 'select') {
        var dest = (::KABU:: path)
        if (not (eq $dest '')) {
          cd $dest
        }
      }
    }
  } else {
    __kabu_cmd $@args
  }
}

var __kabu_trust_root = ""
var __kabu_trust_config_mtime = ""
var __kabu_trust_state = ""

fn __kabu_trust_check {
  var root = (try { git rev-parse --show-toplevel } catch { "" })
  if (eq $root "") {
    set &__kabu_trust_root = ""
    set &__kabu_trust_config_mtime = ""
    set &__kabu_trust_state = ""
    return
  }

  # Get .kabu/config.yaml modification time
  var config_path = $root"/.kabu/config.yaml"
  var current_mtime = ""
  try {
    var mtime = (path:lstat $config_path)[mtime]
    set current_mtime = (echo $mtime | tr -d ' ')
  } catch {
    # If unable to get mtime, use empty string
  }

  # Invalidate cache if repository changed or .kabu/config.yaml was modified
  if (or (not (eq $root $__kabu_trust_root)) (not (eq $current_mtime $__kabu_trust_config_mtime))) {
    set &__kabu_trust_root = $root
    set &__kabu_trust_config_mtime = $current_mtime
    set &__kabu_trust_state = ""
  }

  var trusted = (try { ::KABU:: trust --check $root; put $true } catch { put $false })
  if $trusted {
    set &__kabu_trust_state = trusted
    return
  }

  if (not (eq $__kabu_trust_state untrusted)) {
    if (eq $term:color true) {
      echo >&2 "\e[31mkabu: hooks in config file are not trusted. Run 'kabu trust' to review them.\e[0m"
    } else {
      echo >&2 "kabu: hooks in config file are not trusted. Run 'kabu trust' to review them."
    }
  }
  set &__kabu_trust_state = untrusted
}

edit:before-prompt = [__kabu_trust_check $@edit:before-prompt]
edit:before-chdir = [__kabu_trust_check $@edit:before-chdir]