Compare commits

...

1 Commits

Author SHA1 Message Date
shokollm
219d9f0f18 feat(kugetsu): add --debug flag for real-time output capture
- Add --debug flag to start/resume for verbose opencode output
- Capture debug logs to ~/.kugetsu/sessions/<id>/debug.log
- Add --debug to stop/destroy for viewing logs before actions
- Position-agnostic flag parsing (--debug can appear anywhere)
2026-03-29 16:05:19 +00:00

View File

@@ -10,28 +10,32 @@ usage() {
kugetsu - OpenCode Session Manager kugetsu - OpenCode Session Manager
Usage: Usage:
kugetsu start <session_id> <message> Start a new session kugetsu start <session_id> <message> [--debug] Start a new session
kugetsu list [--all] List sessions (default: left only) kugetsu list [--all] List sessions (default: left only)
kugetsu resume <session_id> [message] Resume a session kugetsu resume <session_id> [message] [--debug] Resume a session
kugetsu stop <session_id> Stop a session gracefully kugetsu stop <session_id> [--debug] Stop a session gracefully
kugetsu destroy <session_id> [-y] Delete a session (prompts confirmation) kugetsu destroy <session_id> [-y] [--debug] Delete a session (prompts confirmation)
kugetsu destroy --all [-y] Delete all sessions (prompts confirmation) kugetsu destroy --all [-y] Delete all sessions (prompts confirmation)
kugetsu help Show this help kugetsu help Show this help
States: States:
used - Session is active (process running) used - Session is active (process running)
idle - Session ended gracefully (not resumable) idle - Session ended gracefully (not resumable)
left - Session interrupted/crashed (resumable) left - Session interrupted/crashed (resumable)
invalid - Session data missing/corrupt invalid - Session data missing/corrupt
Options:
--debug Show real-time debug output and capture to debug.log
Examples: Examples:
kugetsu start mytask "fix bug #1" kugetsu start mytask "fix bug #1"
kugetsu start mytask "fix bug #1" --debug
kugetsu list kugetsu list
kugetsu list --all kugetsu list --all
kugetsu resume mytask kugetsu resume mytask
kugetsu resume mytask "continue working" kugetsu resume mytask "continue working" --debug
kugetsu stop mytask kugetsu stop mytask --debug
kugetsu destroy mytask kugetsu destroy mytask --debug
kugetsu destroy mytask -y kugetsu destroy mytask -y
kugetsu destroy --all kugetsu destroy --all
kugetsu destroy --all -y kugetsu destroy --all -y
@@ -64,6 +68,37 @@ get_state() {
fi fi
} }
DEBUG_MODE=false
set_debug_mode() {
DEBUG_MODE=false
local filtered_args=()
while [ $# -gt 0 ]; do
case "$1" in
--debug)
DEBUG_MODE=true
;;
*)
filtered_args+=("$1")
;;
esac
shift
done
echo "${filtered_args[@]}"
}
show_debug_log() {
local session_dir="$1"
local debug_log="$session_dir/debug.log"
if [ -f "$debug_log" ]; then
echo "=== Debug Log ==="
cat "$debug_log"
echo "=== End Debug Log ==="
else
echo "No debug log found"
fi
}
set_state() { set_state() {
local session_dir="$1" local session_dir="$1"
local state="$2" local state="$2"
@@ -100,13 +135,30 @@ check_and_update_state() {
} }
cmd_start() { cmd_start() {
if [ $# -lt 2 ]; then local session_id=""
local message=""
while [ $# -gt 0 ]; do
case "$1" in
--debug)
DEBUG_MODE=true
;;
*)
if [ -z "$session_id" ]; then
session_id="$1"
elif [ -z "$message" ]; then
message="$1"
fi
;;
esac
shift
done
if [ -z "$session_id" ] || [ -z "$message" ]; then
echo "Error: start requires <session_id> and <message>" >&2 echo "Error: start requires <session_id> and <message>" >&2
exit 1 exit 1
fi fi
local session_id="$1"
local message="$2"
validate_session_id "$session_id" validate_session_id "$session_id"
local session_dir=$(get_session_dir "$session_id") local session_dir=$(get_session_dir "$session_id")
@@ -137,7 +189,11 @@ cmd_start() {
echo "$message" > "$session_dir/message" echo "$message" > "$session_dir/message"
echo "Starting session '$session_id'..." echo "Starting session '$session_id'..."
opencode run --session "$session_id" "$message" if [ "$DEBUG_MODE" = true ]; then
opencode run --print-logs --log-level DEBUG --session "$session_id" "$message" 2>&1 | tee "$session_dir/debug.log"
else
opencode run --session "$session_id" "$message"
fi
local exit_code=$? local exit_code=$?
if [ $exit_code -eq 0 ]; then if [ $exit_code -eq 0 ]; then
@@ -184,19 +240,32 @@ cmd_list() {
} }
cmd_resume() { cmd_resume() {
if [ $# -lt 1 ]; then local session_id=""
local message=""
local args=("$@")
for arg in "${args[@]}"; do
case "$arg" in
--debug)
DEBUG_MODE=true
;;
*)
if [ -z "$session_id" ]; then
session_id="$arg"
elif [ -z "$message" ]; then
message="$arg"
fi
;;
esac
done
if [ -z "$session_id" ]; then
echo "Error: resume requires <session_id>" >&2 echo "Error: resume requires <session_id>" >&2
exit 1 exit 1
fi fi
local session_id="$1"
local message=""
validate_session_id "$session_id" validate_session_id "$session_id"
if [ $# -ge 2 ]; then
message="$2"
fi
local session_dir=$(get_session_dir "$session_id") local session_dir=$(get_session_dir "$session_id")
if [ ! -d "$session_dir" ]; then if [ ! -d "$session_dir" ]; then
@@ -251,7 +320,11 @@ cmd_resume() {
echo "$message" > "$session_dir/message" echo "$message" > "$session_dir/message"
echo "Resuming session '$session_id'..." echo "Resuming session '$session_id'..."
opencode run --continue --session "$session_id" "$message" if [ "$DEBUG_MODE" = true ]; then
opencode run --print-logs --log-level DEBUG --continue --session "$session_id" "$message" 2>&1 | tee "$session_dir/debug.log"
else
opencode run --continue --session "$session_id" "$message"
fi
local exit_code=$? local exit_code=$?
if [ $exit_code -eq 0 ]; then if [ $exit_code -eq 0 ]; then
@@ -264,12 +337,27 @@ cmd_resume() {
} }
cmd_stop() { cmd_stop() {
if [ $# -lt 1 ]; then local session_id=""
while [ $# -gt 0 ]; do
case "$1" in
--debug)
DEBUG_MODE=true
;;
*)
if [ -z "$session_id" ]; then
session_id="$1"
fi
;;
esac
shift
done
if [ -z "$session_id" ]; then
echo "Error: stop requires <session_id>" >&2 echo "Error: stop requires <session_id>" >&2
exit 1 exit 1
fi fi
local session_id="$1"
validate_session_id "$session_id" validate_session_id "$session_id"
local session_dir=$(get_session_dir "$session_id") local session_dir=$(get_session_dir "$session_id")
@@ -278,6 +366,10 @@ cmd_stop() {
exit 1 exit 1
fi fi
if [ "$DEBUG_MODE" = true ]; then
show_debug_log "$session_dir"
fi
local state=$(get_state "$session_dir") local state=$(get_state "$session_dir")
if [ "$state" != "used" ]; then if [ "$state" != "used" ]; then
@@ -322,6 +414,9 @@ cmd_destroy() {
--all) --all)
destroy_all=true destroy_all=true
;; ;;
--debug)
DEBUG_MODE=true
;;
-y|--yes) -y|--yes)
force=true force=true
;; ;;
@@ -377,6 +472,10 @@ cmd_destroy() {
exit 1 exit 1
fi fi
if [ "$DEBUG_MODE" = true ]; then
show_debug_log "$session_dir"
fi
local state=$(get_state "$session_dir") local state=$(get_state "$session_dir")
if [ "$state" = "used" ]; then if [ "$state" = "used" ]; then
echo "Error: session '$session_id' is in use (state=used)" >&2 echo "Error: session '$session_id' is in use (state=used)" >&2