summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Stone <thepeterstone@gmail.com>2026-03-05 17:42:02 +0000
committerPeter Stone <thepeterstone@gmail.com>2026-03-05 17:42:02 +0000
commit2bbae7416274ef83a6b1d0f9e6101814f0d15ad1 (patch)
treef833f0f780ae5fbd4a9ff2234b2eb75090c1c762
parentf7c6de4f99649dfa19c6b20b5a3fb344c4f8e82c (diff)
scripts: add debug-execution and deploy
debug-execution: inspect a failed execution by ID prefix from prod DB. deploy: build and restart the claudomator systemd service. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
-rwxr-xr-xscripts/debug-execution72
-rwxr-xr-xscripts/deploy26
2 files changed, 98 insertions, 0 deletions
diff --git a/scripts/debug-execution b/scripts/debug-execution
new file mode 100755
index 0000000..eba5c0a
--- /dev/null
+++ b/scripts/debug-execution
@@ -0,0 +1,72 @@
+#!/usr/bin/env bash
+# debug-execution: Show details for a failed task execution from the production DB.
+# Usage: ./scripts/debug-execution <execution-id-or-prefix>
+# Example: ./scripts/debug-execution c74c877f
+
+set -euo pipefail
+
+DB="/site/doot.terst.org/data/claudomator.db"
+PREFIX="${1:?Usage: $0 <execution-id-or-prefix>}"
+
+if [[ ! -f "$DB" ]]; then
+ echo "ERROR: DB not found at $DB" >&2
+ exit 1
+fi
+
+# Look up execution
+ROW=$(sqlite3 "$DB" "
+ SELECT id, task_id, exit_code, status, stdout_path, stderr_path, error_msg
+ FROM executions
+ WHERE id LIKE '${PREFIX}%'
+ ORDER BY start_time DESC
+ LIMIT 1;
+")
+
+if [[ -z "$ROW" ]]; then
+ echo "ERROR: No execution found matching '${PREFIX}'" >&2
+ exit 1
+fi
+
+IFS='|' read -r EXEC_ID TASK_ID EXIT_CODE STATUS STDOUT_PATH STDERR_PATH ERROR_MSG <<< "$ROW"
+
+echo "=== Execution ==="
+echo " ID: $EXEC_ID"
+echo " Status: $STATUS"
+echo " Exit code: $EXIT_CODE"
+echo " Error: ${ERROR_MSG:-(none)}"
+
+# Look up task
+TASK_ROW=$(sqlite3 "$DB" "
+ SELECT name, json_extract(config_json, '$.working_dir'), json_extract(config_json, '$.model')
+ FROM tasks
+ WHERE id = '${TASK_ID}';
+")
+
+if [[ -n "$TASK_ROW" ]]; then
+ IFS='|' read -r TASK_NAME WORKING_DIR MODEL <<< "$TASK_ROW"
+ echo ""
+ echo "=== Task ==="
+ echo " ID: $TASK_ID"
+ echo " Name: $TASK_NAME"
+ echo " Model: ${MODEL:-(not set)}"
+ echo " Working dir: ${WORKING_DIR:-(not set)}"
+fi
+
+# Logs
+print_log() {
+ local label="$1" path="$2"
+ echo ""
+ echo "=== $label ==="
+ if [[ -z "$path" ]]; then
+ echo " (path not recorded)"
+ elif [[ ! -f "$path" ]]; then
+ echo " (file not found: $path)"
+ elif [[ ! -s "$path" ]]; then
+ echo " (empty)"
+ else
+ tail -n 50 "$path"
+ fi
+}
+
+print_log "stdout (last 50 lines)" "$STDOUT_PATH"
+print_log "stderr (last 50 lines)" "$STDERR_PATH"
diff --git a/scripts/deploy b/scripts/deploy
new file mode 100755
index 0000000..a17b1ab
--- /dev/null
+++ b/scripts/deploy
@@ -0,0 +1,26 @@
+#!/bin/bash
+# deploy — Build and deploy claudomator to /site/doot.terst.org
+# Usage: ./scripts/deploy
+# Example: sudo ./scripts/deploy
+
+set -euo pipefail
+
+FQDN="doot.terst.org"
+SITE_DIR="/site/${FQDN}"
+BIN_DIR="${SITE_DIR}/bin"
+SERVICE="claudomator@${FQDN}"
+REPO_DIR="$(cd "$(dirname "$0")/.." && pwd)"
+
+echo "==> Building claudomator..."
+cd "${REPO_DIR}"
+go build -o "${BIN_DIR}/claudomator" ./cmd/claudomator/
+
+echo "==> Fixing permissions..."
+chown www-data:www-data "${BIN_DIR}/claudomator"
+chmod +x "${BIN_DIR}/claudomator"
+
+echo "==> Restarting service..."
+systemctl restart "${SERVICE}"
+systemctl status "${SERVICE}" --no-pager -l
+
+echo "==> Done!"