Compare commits

...

7 Commits

Author SHA1 Message Date
shokollm
4464e5d91f fix: remove race condition in cmd_delegate msg file deletion
cmd_delegate deletes the message file immediately after spawning the
background nohup process, causing a race condition where opencode run
may not have read the file yet.

Error: File not found: msg-ses_xxx.txt

Fix by removing rm -f "$msg_file", consistent with cmd_start and
cmd_continue which write to $worktree_path/.kugetsu-msg.txt and never
delete it. Orphaned msg files in $LOGS_DIR/ are harmless.

Fixes #210
2026-04-07 09:51:46 +00:00
shokollm
66c8624d66 fix: move set_debug_mode to kugetsu-config.sh
The queue daemon crashes with 'set_debug_mode: command not found'
because cmd_continue() calls set_debug_mode(), but that function
was only defined in the main kugetsu script.

Instead of duplicating the function, move it to kugetsu-config.sh
which is always sourced before kugetsu-session.sh in all contexts.

Fixes #207
2026-04-07 08:31:17 +00:00
2beb3adb14 fix: remove unnecessary rm of msg file to avoid race condition (#200) 2026-04-07 05:29:07 +02:00
bfd6778f8b fix: move msg file inside worktree to avoid external_directory permission error (#198) 2026-04-07 05:14:45 +02:00
aafdebb6c6 fix: suppress opencode fork stdout and strip ANSI codes from logs (#197) 2026-04-07 04:58:15 +02:00
e666f4dffb Merge pull request 'fix: use temp file for message to avoid shell parsing issues' (#196) from fix/issue-message-encoding into main 2026-04-07 04:27:50 +02:00
shokollm
a130a79bd7 fix: use temp file for message to avoid shell parsing issues
The message passed to opencode run contains newlines and special
characters (parentheses, etc.) which break shell parsing when passed
directly in double quotes.

Fix by writing message to temp file and using '@msg_file' syntax
to pass to opencode run. This handles any characters in the message.
2026-04-07 01:55:34 +00:00
3 changed files with 51 additions and 11 deletions

View File

@@ -32,7 +32,7 @@ if [ -f "$KUGETSU_DIR/config" ]; then
fi fi
mask_sensitive_vars() { mask_sensitive_vars() {
local line="$1" local line="${1:-}"
for var in GITEA_TOKEN GITHUB_TOKEN GITLAB_TOKEN API_KEY PASSWORD TOKEN SECRET; do for var in GITEA_TOKEN GITHUB_TOKEN GITLAB_TOKEN API_KEY PASSWORD TOKEN SECRET; do
if [[ "$line" =~ $var ]]; then if [[ "$line" =~ $var ]]; then
line=$(echo "$line" | sed -E "s/=.*/=***MASKED***/") line=$(echo "$line" | sed -E "s/=.*/=***MASKED***/")
@@ -41,6 +41,11 @@ mask_sensitive_vars() {
echo "$line" echo "$line"
} }
strip_ansi_codes() {
local line="${1:-}"
echo "$line" | sed 's/\x1b\[[0-9;]*m//g' | sed 's/\x1b\[[0-9;]*[a-zA-Z]//g'
}
load_agent_env() { load_agent_env() {
local agent_type="${1:-base}" local agent_type="${1:-base}"
local env_file="$ENV_DIR/${agent_type}.env" local env_file="$ENV_DIR/${agent_type}.env"
@@ -59,3 +64,26 @@ load_agent_env() {
set +a set +a
fi fi
} }
set_debug_mode() {
local filtered_args=()
local debug_mode=false
for arg in "$@"; do
case "$arg" in
--debug)
debug_mode=true
;;
*)
filtered_args+=("$arg")
;;
esac
done
if [ "$debug_mode" = true ]; then
export KUGETSU_VERBOSITY="debug"
echo "[DEBUG] Debug mode enabled" >&2
fi
echo "${filtered_args[@]}"
}

View File

@@ -24,7 +24,9 @@ cmd_logs() {
echo "" echo ""
echo "--- $log ---" echo "--- $log ---"
tail -20 "$LOGS_DIR/$log" | while read line; do tail -20 "$LOGS_DIR/$log" | while read line; do
echo " $(mask_sensitive_vars "$line")" line=$(strip_ansi_codes "$line")
line=$(mask_sensitive_vars "$line")
echo " $line"
done done
fi fi
done done

View File

@@ -225,7 +225,9 @@ cmd_delegate() {
exit 1 exit 1
fi fi
nohup sh -c "GITEA_TOKEN='${GITEA_TOKEN:-}' opencode run '$message' --session '$new_session'" >> "$log_file" 2>&1 & local msg_file="$LOGS_DIR/msg-$new_session.txt"
printf '%s' "$message" > "$msg_file"
nohup sh -c "GITEA_TOKEN='${GITEA_TOKEN:-}' opencode run '@$msg_file' --session '$new_session'" >> "$log_file" 2>&1 &
echo "Delegated to new session (logged to $(basename "$log_file"))" echo "Delegated to new session (logged to $(basename "$log_file"))"
} }
@@ -238,20 +240,22 @@ create_session() {
fi fi
local before_json=$(opencode session list --format=json 2>/dev/null) local before_json=$(opencode session list --format=json 2>/dev/null)
local before_ids=$(echo "$before_json" | python3 -c "import sys,json; sessions=json.load(sys.stdin); print(' '.join(s['id'] for s in sessions))" 2>/dev/null || echo "") local before_set=$(echo "$before_json" | python3 -c "import sys,json; sessions=json.load(sys.stdin); print('|'.join(s['id'] for s in sessions))" 2>/dev/null || echo "|")
opencode run --fork --session "$base_session" "new session" 2>/dev/null opencode run --fork --session "$base_session" "new session" >/dev/null 2>&1
sleep 1
local after_json=$(opencode session list --format=json 2>/dev/null) local after_json=$(opencode session list --format=json 2>/dev/null)
local after_ids=$(echo "$after_json" | python3 -c "import sys,json; sessions=json.load(sys.stdin); print(' '.join(s['id'] for s in sessions))" 2>/dev/null || echo "") local after_sessions=$(echo "$after_json" | python3 -c "import sys,json; sessions=json.load(sys.stdin); [print(s['id']) for s in sessions]" 2>/dev/null || true)
local new_session_id="" local new_session_id=""
for sess in $after_ids; do while IFS= read -r sess; do
if [[ ! " $before_ids " =~ " $sess " ]] && [[ "$sess" != "$base_session" ]]; then if [[ -n "$sess" ]] && [[ ! "$before_set" =~ \|${sess}\| ]]; then
new_session_id="$sess" new_session_id="$sess"
break break
fi fi
done done <<< "$after_sessions"
echo "$new_session_id" echo "$new_session_id"
} }
@@ -373,7 +377,10 @@ cmd_start() {
load_agent_env "dev" load_agent_env "dev"
cd "$worktree_path" cd "$worktree_path"
nohup sh -c "GITEA_TOKEN='${GITEA_TOKEN:-}' opencode run '$dev_message' --session '$new_session_id'" >> "$LOGS_DIR/dev-$new_session_id.log" 2>&1 & local sanitized_id=$(echo "$new_session_id" | sed 's/[^a-zA-Z0-9_-]/_/g')
local msg_file="$worktree_path/.kugetsu-msg.txt"
printf '%s' "$dev_message" > "$msg_file"
nohup sh -c "GITEA_TOKEN='${GITEA_TOKEN:-}' opencode run '@$msg_file' --session '$new_session_id'" >> "$LOGS_DIR/dev-$sanitized_id.log" 2>&1 &
echo "Session started for '$issue_ref': $new_session_id" echo "Session started for '$issue_ref': $new_session_id"
echo "Worktree: $worktree_path" echo "Worktree: $worktree_path"
@@ -436,7 +443,10 @@ cmd_continue() {
fi fi
cd "$worktree_path" cd "$worktree_path"
nohup sh -c "GITEA_TOKEN='${GITEA_TOKEN:-}' opencode run '$message' --session '$opencode_session_id'" >> "$LOGS_DIR/dev-$opencode_session_id.log" 2>&1 & local sanitized_id=$(echo "$opencode_session_id" | sed 's/[^a-zA-Z0-9_-]/_/g')
local msg_file="$worktree_path/.kugetsu-msg.txt"
printf '%s' "$message" > "$msg_file"
nohup sh -c "GITEA_TOKEN='${GITEA_TOKEN:-}' opencode run '@$msg_file' --session '$opencode_session_id'" >> "$LOGS_DIR/dev-$sanitized_id.log" 2>&1 &
} }
cmd_list() { cmd_list() {