#!/usr/bin/env nu # Thin entry for state | st commands. # Loads only workspace/state.nu + accessor (~50ms vs ~49s for the full entry). # Bash wrapper routes this for all state subcommands except sync (which delegates to full runner). export-env { let lib_dirs_raw = ($env.NU_LIB_DIRS? | default "") let current_lib_dirs = if ($lib_dirs_raw | type) == "string" { if ($lib_dirs_raw | is-empty) { [] } else { ($lib_dirs_raw | split row ":") } } else { $lib_dirs_raw } let dynamic = ($env.PROVISIONING? | default "" | path join "core" "nulib") $env.NU_LIB_DIRS = ([ "/opt/provisioning/core/nulib" "/usr/local/provisioning/core/nulib" ] | append $current_lib_dirs | append (if ($dynamic | is-not-empty) { [$dynamic] } else { [] })) } use workspace/state.nu * use lib_provisioning/utils/settings.nu [find_get_settings] use lib_provisioning/utils/interface.nu [_print] use lib_provisioning/utils/error.nu [throw-error] def main [ ...args: string # args[0] = "state", args[1] = subcommand --infra (-i): string = "" --server: string = "" --taskserv: string = "" --kubeconfig: string = "" --skip-ssh --debug (-x) --notitles ]: nothing -> nothing { if $debug { $env.PROVISIONING_DEBUG = true } let workspace_path = if ($env.PROVISIONING_WORKSPACE_PATH? | is-not-empty) { $env.PROVISIONING_WORKSPACE_PATH } else { $env.PWD } # args[0] = "state" (domain prefix stripped by bash), args[1] = subcommand let sub = ($args | get 1? | default "show") match $sub { "show" | "s" => { state-show $workspace_path --server $server }, "init" | "i" => { let curr_settings = (find_get_settings --infra $infra) state-init $workspace_path $curr_settings _print $"State initialized at (state-path $workspace_path)" }, "reset" | "r" => { if ($server | is-empty) or ($taskserv | is-empty) { error make { msg: "state reset requires --server --taskserv " } } state-node-reset $workspace_path $server $taskserv --source "cli" --actor ($env.USER? | default "system") _print $"($server)/($taskserv) reset to pending" }, "migrate" | "m" => { state-migrate-from-json $workspace_path }, # sync requires lib_provisioning (mw_server_info, mw_get_ip) — delegate to full runner "sync" => { let infra_arg = if ($infra | is-not-empty) { ["--infra" $infra] } else { [] } let kconfig_arg = if ($kubeconfig | is-not-empty) { ["--kubeconfig" $kubeconfig] } else { [] } let ssh_arg = if $skip_ssh { ["--skip-ssh"] } else { [] } exec $"($env.PROVISIONING_NAME)" state sync ...$infra_arg ...$kconfig_arg ...$ssh_arg }, _ => { _print "Usage: provisioning state [options]" _print "" _print " show [--server ] — display state table" _print " init [--infra ] — bootstrap state from settings" _print " reset --server --taskserv — reset node to pending" _print " migrate — migrate .json → .ncl" _print " sync [--infra ] [--kubeconfig ] [--skip-ssh]" }, } }