Files
kataclysm/kata
T

146 lines
5.5 KiB
Bash
Executable File

#!/bin/bash
# ====================================================
# KATA CLI - OPEN THE WIRE ENGINE
# ====================================================
SCRIPT_DIR="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")"
STATE_FILE="$SCRIPT_DIR/.kata_state"
# Load environment securely
if [ -f "$SCRIPT_DIR/.env" ]; then
export $(grep -v '^#' "$SCRIPT_DIR/.env" | xargs)
fi
API_URL="https://api.groq.com/openai/v1/chat/completions"
MODEL="openai/gpt-oss-20b"
# Ensure API key is configured
if [ -z "$GROQ_API_KEY" ]; then
echo "Error: GROQ_API_KEY is not defined in $SCRIPT_DIR/.env"
exit 1
fi
COMMAND=$1
case $COMMAND in
start)
echo "Initializing new Kata environment..."
# Scenarios: "Topic | Break Command | Goal | Telemetry Command"
SCENARIOS=(
"File Permissions|sudo chmod 000 /sandbox/test.txt|Fix permissions on /sandbox/test.txt to 644|ls -la /sandbox/test.txt"
"Hidden Files|touch /sandbox/.secret && sudo chmod 000 /sandbox/.secret|Fix permissions on /sandbox/.secret to 644|ls -la /sandbox/.secret"
)
# Pick random scenario and parse using pipe delimiter
RANDOM_SCENARIO=${SCENARIOS[$RANDOM % ${#SCENARIOS[@]}]}
IFS='|' read -r TOPIC BREAK_CMD GOAL TELEMETRY <<< "$RANDOM_SCENARIO"
# Save active scenario to state file
echo "GOAL=\"$GOAL\"" > "$STATE_FILE"
echo "TELEMETRY=\"$TELEMETRY\"" >> "$STATE_FILE"
PROMPT="Generate a short, realistic sysadmin troubleshooting scenario where a Linux administrator broke '$TOPIC' using the command: '$BREAK_CMD'. Give it a title and a brief problem statement."
PAYLOAD=$(jq -n --arg model "$MODEL" --arg prompt "$PROMPT" '{model: $model, messages: [{"role": "user", "content": $prompt}], stream: false}')
RESPONSE=$(curl -s -X POST "$API_URL" -H "Content-Type: application/json" -H "Authorization: Bearer $GROQ_API_KEY" -d "$PAYLOAD")
if echo "$RESPONSE" | jq -e '.error' > /dev/null 2>&1; then
echo "API request failed:" && echo "$RESPONSE" | jq -r '.error.message // .' && exit 1
fi
echo ""
echo "--- INCOMING TRANSMISSION ---"
echo "$RESPONSE" | jq -r '.choices[0].message.content // empty'
echo "-----------------------------"
echo ""
echo "[Mutation] Applying chaotic state..."
sudo mkdir -p /sandbox
sudo chown zimasu:zimasu /sandbox
echo "critical config" | sudo tee /sandbox/test.txt > /dev/null
eval "$BREAK_CMD"
echo "Environment mutated. Good luck."
echo "Run 'kata check' when you think you have solved it."
;;
check)
if [ ! -f "$STATE_FILE" ]; then
echo "No active kata found. Run 'kata start' first."
exit 1
fi
# Load active scenario goals
source "$STATE_FILE"
echo "[Telemetry] Harvesting system state..."
CURRENT_STATE=$(eval "$TELEMETRY" 2>&1)
DIAGNOSTIC_PROMPT="You are a strict Linux grading engine.
The user's goal was: $GOAL
Here is the exact current system telemetry (output of '$TELEMETRY'):
$CURRENT_STATE
Did the user successfully fix the problem?
Format your response starting with either 'PASS' or 'FAIL', followed by a short explanation."
PAYLOAD=$(jq -n --arg model "$MODEL" --arg prompt "$DIAGNOSTIC_PROMPT" '{model: $model, messages: [{"role": "user", "content": $prompt}], stream: false}')
RESPONSE=$(curl -s -X POST "$API_URL" -H "Content-Type: application/json" -H "Authorization: Bearer $GROQ_API_KEY" -d "$PAYLOAD")
if echo "$RESPONSE" | jq -e '.error' > /dev/null 2>&1; then
echo "Grading API request failed:" && echo "$RESPONSE" | jq -r '.error.message // .' && exit 1
fi
DIAGNOSIS=$(echo "$RESPONSE" | jq -r '.choices[0].message.content // "Error"')
echo ""
echo "--- AI AUDIT RESULT ---"
echo "$DIAGNOSIS"
echo "-----------------------"
if [[ "$DIAGNOSIS" == *"PASS"* ]]; then
echo "Audit passed. Clearing state."
rm "$STATE_FILE"
sudo rm -rf /sandbox
echo "Cleanup complete. You are ready for the next kata."
fi
;;
help)
if [ ! -f "$STATE_FILE" ]; then
echo "No active kata found. Run 'kata start' first."
exit 1
fi
# Load active scenario goals
source "$STATE_FILE"
echo "[Help] Requesting tactical assistance from Groq..."
HELP_PROMPT="The user is currently stuck on a Linux troubleshooting challenge.
Their goal is: $GOAL
Provide a brief, conceptual hint or point them to the right Linux tool (e.g., man pages, specific commands) to use. Do not just give them the exact copy-paste solution immediately. Be encouraging."
PAYLOAD=$(jq -n --arg model "$MODEL" --arg prompt "$HELP_PROMPT" '{model: $model, messages: [{"role": "user", "content": $prompt}], stream: false}')
RESPONSE=$(curl -s -X POST "$API_URL" -H "Content-Type: application/json" -H "Authorization: Bearer $GROQ_API_KEY" -d "$PAYLOAD")
if echo "$RESPONSE" | jq -e '.error' > /dev/null 2>&1; then
echo "API request failed:" && echo "$RESPONSE" | jq -r '.error.message // .' && exit 1
fi
HINT=$(echo "$RESPONSE" | jq -r '.choices[0].message.content // "Error generating hint."')
echo ""
echo "--- TACTICAL HINT ---"
echo "$HINT"
echo "---------------------"
;;
*)
echo "Usage: kata {start|check|help}"
exit 1
;;
esac