commit c402a7ef85607526d2bb21f44a934e3d2f7935db Author: zimasu Date: Tue Oct 13 18:46:33 2026 +0000 Initial commit: Kataclysm continuous learning engine v1.0 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c08c869 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.env +.kata_state diff --git a/kata b/kata new file mode 100755 index 0000000..54788bc --- /dev/null +++ b/kata @@ -0,0 +1,145 @@ +#!/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 diff --git a/scenarios.txt b/scenarios.txt new file mode 100644 index 0000000..0f18937 --- /dev/null +++ b/scenarios.txt @@ -0,0 +1,3 @@ +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 +Directory Ownership|sudo chown root:root /sandbox|Change ownership of /sandbox back to zimasu:zimasu|ls -ld /sandbox