From 4945425d03ea2dce70892661febded9545bce038 Mon Sep 17 00:00:00 2001 From: shokollm <270575765+shokollm@users.noreply.github.com> Date: Wed, 1 Apr 2026 23:11:07 +0000 Subject: [PATCH] feat(kugetsu): add env pass-through for agent delegation Add 'kugetsu env' command for managing per-agent environment variables: - kugetsu env list List all env files - kugetsu env show [agent] Show env file contents (masked) - kugetsu env set [a] Set key=value in agent env - kugetsu env get [a] Get value for key - kugetsu env rm [a] Remove key from agent env Add mask_sensitive_vars() to hide sensitive values in logs: - Masks: GITEA_TOKEN, GITHUB_TOKEN, GITLAB_TOKEN, API_KEY, PASSWORD, TOKEN, SECRET Update cmd_delegate to: - Load pm-agent.env (or default.env) before running opencode - Pass GITEA_TOKEN from environment if set Update cmd_init to: - Create git servers config in config file - Create env directory with default.env and pm-agent.env templates Also includes cmd_server from #78 fix. Fixes #76 Related: #78 --- skills/kugetsu/scripts/kugetsu | 267 ++++++++++++++++++++++++++++++++- 1 file changed, 266 insertions(+), 1 deletion(-) diff --git a/skills/kugetsu/scripts/kugetsu b/skills/kugetsu/scripts/kugetsu index 24152c1..e38b125 100755 --- a/skills/kugetsu/scripts/kugetsu +++ b/skills/kugetsu/scripts/kugetsu @@ -15,6 +15,33 @@ if [ -f "$KUGETSU_DIR/config" ]; then source "$KUGETSU_DIR/config" fi +ENV_DIR="${ENV_DIR:-$KUGETSU_DIR/env}" + +mask_sensitive_vars() { + local line="$1" + for var in GITEA_TOKEN GITHUB_TOKEN GITLAB_TOKEN API_KEY PASSWORD TOKEN SECRET; do + if [[ "$line" =~ $var ]]; then + line=$(echo "$line" | sed -E "s/=.*/=***MASKED***/") + fi + done + echo "$line" +} + +load_agent_env() { + local agent_type="${1:-base}" + local env_file="$ENV_DIR/${agent_type}.env" + + if [ -f "$env_file" ]; then + set -a + source "$env_file" + set +a + elif [ -f "$ENV_DIR/default.env" ]; then + set -a + source "$ENV_DIR/default.env" + set +a + fi +} + count_active_dev_sessions() { local count=0 if [ -d "$SESSIONS_DIR" ]; then @@ -523,7 +550,19 @@ cmd_delegate() { mkdir -p "$LOGS_DIR" local log_file="$LOGS_DIR/delegate-$(date +%s).log" - nohup sh -c "opencode run '$message' --continue --session '$pm_session' >> '$log_file' 2>&1" > /dev/null 2>&1 & + + mkdir -p "$ENV_DIR" + local env_sh="" + if [ -f "$ENV_DIR/pm-agent.env" ]; then + env_sh="source '$ENV_DIR/pm-agent.env'; " + elif [ -f "$ENV_DIR/default.env" ]; then + env_sh="source '$ENV_DIR/default.env'; " + fi + if [ -n "${GITEA_TOKEN:-}" ]; then + env_sh="${env_sh}export GITEA_TOKEN='$GITEA_TOKEN'; " + fi + + nohup sh -c "${env_sh}opencode run '$message' --continue --session '$pm_session' >> '$log_file' 2>&1" > /dev/null 2>&1 & disown echo "Delegated to PM agent (logged to $(basename "$log_file"))" } @@ -670,6 +709,200 @@ set_debug_mode() { echo "${filtered_args[@]}" } +cmd_server() { + local action="${1:-}" + + case "$action" in + ""|"list") + if [ -z "${GIT_SERVERS+x}" ]; then + echo "No git servers configured" + return + fi + echo "Git servers:" + for key in "${!GIT_SERVERS[@]}"; do + local marker="" + if [ "$key" = "$DEFAULT_GIT_SERVER" ]; then + marker=" (default)" + fi + echo " $key -> ${GIT_SERVERS[$key]}$marker" + done + ;; + "add") + local name="${2:-}" + local url="${3:-}" + if [ -z "$name" ] || [ -z "$url" ]; then + echo "Usage: kugetsu server add " >&2 + exit 1 + fi + if grep -q "^GIT_SERVERS\[" "$KUGETSU_DIR/config" 2>/dev/null; then + sed -i "s|^GIT_SERVERS\[\"$name\"\]=.*|GIT_SERVERS[\"$name\"]=\"$url\"|" "$KUGETSU_DIR/config" + if ! grep -q "GIT_SERVERS\[\"$name\"\]" "$KUGETSU_DIR/config" 2>/dev/null; then + sed -i "/^declare -A GIT_SERVERS/a GIT_SERVERS[\"$name\"]=\"$url\"" "$KUGETSU_DIR/config" + fi + else + echo "declare -A GIT_SERVERS" >> "$KUGETSU_DIR/config" + echo "GIT_SERVERS[\"$name\"]=\"$url\"" >> "$KUGETSU_DIR/config" + fi + source "$KUGETSU_DIR/config" + echo "Added git server: $name -> $url" + ;; + "remove"|"rm"|"delete") + local name="${2:-}" + if [ -z "$name" ]; then + echo "Usage: kugetsu server remove " >&2 + exit 1 + fi + if [ -n "${GIT_SERVERS[$name]:-}" ]; then + if [ "$name" = "$DEFAULT_GIT_SERVER" ]; then + echo "Error: Cannot remove default server. Set a new default first." >&2 + exit 1 + fi + sed -i "/GIT_SERVERS\[\"$name\"\]/d" "$KUGETSU_DIR/config" 2>/dev/null + source "$KUGETSU_DIR/config" + echo "Removed git server: $name" + else + echo "Error: Server '$name' not found" >&2 + exit 1 + fi + ;; + "default") + local name="${2:-}" + if [ -z "$name" ]; then + echo "Current default: $DEFAULT_GIT_SERVER" + return + fi + if [ -n "${GIT_SERVERS[$name]:-}" ]; then + sed -i "s/^DEFAULT_GIT_SERVER=.*/DEFAULT_GIT_SERVER=\"$name\"/" "$KUGETSU_DIR/config" + source "$KUGETSU_DIR/config" + echo "Set default git server to: $name" + else + echo "Error: Server '$name' not found" >&2 + exit 1 + fi + ;; + "get") + local name="${2:-$DEFAULT_GIT_SERVER}" + if [ -n "${GIT_SERVERS[$name]:-}" ]; then + echo "${GIT_SERVERS[$name]}" + else + echo "Error: Server '$name' not found" >&2 + exit 1 + fi + ;; + *) + echo "Usage: kugetsu server " >&2 + echo "" >&2 + echo "Commands:" >&2 + echo " list List all configured git servers" >&2 + echo " add Add a new git server" >&2 + echo " remove Remove a git server" >&2 + echo " default [] Get or set default server" >&2 + echo " get [] Get URL for a server (default: current default)" >&2 + exit 1 + ;; + esac +} + +cmd_env() { + local action="${1:-}" + local agent_type="${2:-}" + + mkdir -p "$ENV_DIR" + + case "$action" in + ""|"list") + echo "Environment files in $ENV_DIR:" + if [ -d "$ENV_DIR" ]; then + for f in "$ENV_DIR"/*.env; do + if [ -f "$f" ]; then + echo " $(basename "$f")" + fi + done + fi + if [ ! -d "$ENV_DIR" ] || [ -z "$(ls -A "$ENV_DIR"/*.env 2>/dev/null)" ]; then + echo " (no env files found)" + fi + ;; + "show") + local file="$ENV_DIR/${agent_type:-default}.env" + if [ -f "$file" ]; then + echo "=== $file ===" + while IFS= read -r line; do + echo "$(mask_sensitive_vars "$line")" + done < "$file" + else + echo "No env file for: ${agent_type:-default}" + fi + ;; + "set") + local key="${2:-}" + local value="${3:-}" + local target="${4:-default}" + if [ -z "$key" ] || [ -z "$value" ]; then + echo "Usage: kugetsu env set [agent]" >&2 + echo " agent: default, pm-agent, or issue ref" >&2 + exit 1 + fi + local file="$ENV_DIR/${target}.env" + if [ -f "$file" ]; then + if grep -q "^${key}=" "$file"; then + sed -i "s|^${key}=.*|${key}=\"${value}\"|" "$file" + else + echo "${key}=\"${value}\"" >> "$file" + fi + else + echo "${key}=\"${value}\"" > "$file" + fi + echo "Set ${key}=${value} in ${target}.env (masked)" + ;; + "get") + local key="${2:-}" + local target="${3:-default}" + local file="$ENV_DIR/${target}.env" + if [ -z "$key" ]; then + echo "Usage: kugetsu env get [agent]" >&2 + exit 1 + fi + if [ -f "$file" ]; then + local val=$(grep "^${key}=" "$file" | cut -d'=' -f2 | tr -d '"') + if [ -n "$val" ]; then + echo "$val" + else + echo "Key '$key' not found in ${target}.env" >&2 + exit 1 + fi + else + echo "No env file for: ${target}" >&2 + exit 1 + fi + ;; + "rm"|"remove"|"delete") + local key="${2:-}" + local target="${3:-default}" + if [ -z "$key" ]; then + echo "Usage: kugetsu env rm [agent]" >&2 + exit 1 + fi + local file="$ENV_DIR/${target}.env" + if [ -f "$file" ]; then + sed -i "/^${key}=/d" "$file" + echo "Removed $key from ${target}.env" + fi + ;; + *) + echo "Usage: kugetsu env [args]" >&2 + echo "" >&2 + echo "Commands:" >&2 + echo " list List all env files" >&2 + echo " show [agent] Show env file contents (masked)" >&2 + echo " set [a] Set key=value in agent env (default/pm-agent)" >&2 + echo " get [a] Get value for key" >&2 + echo " rm [a] Remove key from agent env" >&2 + exit 1 + ;; + esac +} + cmd_init() { local force=false @@ -694,10 +927,36 @@ cmd_init() { # Max concurrent dev agents (default: 3) # MAX_CONCURRENT_AGENTS=5 + +# Git server configurations +# Format: GIT_SERVERS["hostname"]="https://hostname" +declare -A GIT_SERVERS +GIT_SERVERS["github.com"]="https://github.com" +GIT_SERVERS["git.fbrns.co"]="https://git.fbrns.co" +DEFAULT_GIT_SERVER="github.com" EOF echo "Created config file: $KUGETSU_DIR/config" fi + mkdir -p "$KUGETSU_DIR/env" + if [ ! -f "$KUGETSU_DIR/env/default.env" ]; then + cat > "$KUGETSU_DIR/env/default.env" << 'EOF' +# Default environment variables for all agents +# Add variables that all agents should have access to +# Example: +# GITEA_TOKEN=your_token_here +EOF + echo "Created default env file: $KUGETSU_DIR/env/default.env" + fi + if [ ! -f "$KUGETSU_DIR/env/pm-agent.env" ]; then + cat > "$KUGETSU_DIR/env/pm-agent.env" << 'EOF' +# PM Agent environment variables +# These override default.env for the PM agent +# GITEA_TOKEN=your_gitea_token_here +EOF + echo "Created pm-agent env file: $KUGETSU_DIR/env/pm-agent.env" + fi + local existing_base=$(get_base_session_id) local existing_pm=$(get_pm_agent_session_id) @@ -1174,6 +1433,12 @@ main() { status) cmd_status ;; + server) + cmd_server "$@" + ;; + env) + cmd_env "$@" + ;; doctor) cmd_doctor "$@" ;; -- 2.49.1