feat(kugetsu): add env pass-through for agent delegation #84
@@ -15,6 +15,33 @@ if [ -f "$KUGETSU_DIR/config" ]; then
|
|||||||
source "$KUGETSU_DIR/config"
|
source "$KUGETSU_DIR/config"
|
||||||
fi
|
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() {
|
count_active_dev_sessions() {
|
||||||
local count=0
|
local count=0
|
||||||
if [ -d "$SESSIONS_DIR" ]; then
|
if [ -d "$SESSIONS_DIR" ]; then
|
||||||
@@ -523,7 +550,19 @@ cmd_delegate() {
|
|||||||
|
|
||||||
mkdir -p "$LOGS_DIR"
|
mkdir -p "$LOGS_DIR"
|
||||||
local log_file="$LOGS_DIR/delegate-$(date +%s).log"
|
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
|
disown
|
||||||
echo "Delegated to PM agent (logged to $(basename "$log_file"))"
|
echo "Delegated to PM agent (logged to $(basename "$log_file"))"
|
||||||
}
|
}
|
||||||
@@ -670,6 +709,200 @@ set_debug_mode() {
|
|||||||
echo "${filtered_args[@]}"
|
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 <name> <url>" >&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 <name>" >&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 <list|add|remove|default|get>" >&2
|
||||||
|
echo "" >&2
|
||||||
|
echo "Commands:" >&2
|
||||||
|
echo " list List all configured git servers" >&2
|
||||||
|
echo " add <name> <url> Add a new git server" >&2
|
||||||
|
echo " remove <name> Remove a git server" >&2
|
||||||
|
echo " default [<name>] Get or set default server" >&2
|
||||||
|
echo " get [<name>] 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 <key> <value> [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 <key> [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 <key> [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 <list|show|set|get|rm> [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 <k> <v> [a] Set key=value in agent env (default/pm-agent)" >&2
|
||||||
|
echo " get <key> [a] Get value for key" >&2
|
||||||
|
echo " rm <key> [a] Remove key from agent env" >&2
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
cmd_init() {
|
cmd_init() {
|
||||||
local force=false
|
local force=false
|
||||||
|
|
||||||
@@ -694,10 +927,36 @@ cmd_init() {
|
|||||||
|
|
||||||
# Max concurrent dev agents (default: 3)
|
# Max concurrent dev agents (default: 3)
|
||||||
# MAX_CONCURRENT_AGENTS=5
|
# 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
|
EOF
|
||||||
echo "Created config file: $KUGETSU_DIR/config"
|
echo "Created config file: $KUGETSU_DIR/config"
|
||||||
fi
|
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_base=$(get_base_session_id)
|
||||||
local existing_pm=$(get_pm_agent_session_id)
|
local existing_pm=$(get_pm_agent_session_id)
|
||||||
|
|
||||||
@@ -1174,6 +1433,12 @@ main() {
|
|||||||
status)
|
status)
|
||||||
cmd_status
|
cmd_status
|
||||||
;;
|
;;
|
||||||
|
server)
|
||||||
|
cmd_server "$@"
|
||||||
|
;;
|
||||||
|
env)
|
||||||
|
cmd_env "$@"
|
||||||
|
;;
|
||||||
doctor)
|
doctor)
|
||||||
cmd_doctor "$@"
|
cmd_doctor "$@"
|
||||||
;;
|
;;
|
||||||
|
|||||||
Reference in New Issue
Block a user