Self-healing autopoietic shell: f(), tests, docs, interactive demo, fx fix-source layer
This commit is contained in:
@@ -0,0 +1,55 @@
|
||||
#!/bin/sh
|
||||
# Verifies the learn -> persist -> auto-apply cycle for f().
|
||||
# Run from the repo root: sh test/test_f.sh
|
||||
set -e
|
||||
|
||||
WORKDIR=$(mktemp -d)
|
||||
trap 'rm -rf "$WORKDIR"' EXIT
|
||||
cp src/f.sh "$WORKDIR/f.sh"
|
||||
cd "$WORKDIR"
|
||||
|
||||
fail=0
|
||||
|
||||
# 1. First call: command fails, we supply a fix, command succeeds after retry.
|
||||
printf 'echo hello > needs-fix.txt\n' > fixinput.txt
|
||||
out=$(. ./f.sh; f cat needs-fix.txt < fixinput.txt)
|
||||
if [ "$out" != "hello" ]; then
|
||||
echo "FAIL: expected 'hello' from first (learning) call, got: $out"
|
||||
fail=1
|
||||
else
|
||||
echo "PASS: first call learns the fix and succeeds"
|
||||
fi
|
||||
|
||||
if [ ! -f p ]; then
|
||||
echo "FAIL: expected p to be created with the learned fix"
|
||||
fail=1
|
||||
else
|
||||
echo "PASS: fix persisted to p"
|
||||
fi
|
||||
|
||||
grep -qF 'cat needs-fix.txt=echo hello > needs-fix.txt' p || {
|
||||
echo "FAIL: p does not contain the expected key=fix line"
|
||||
fail=1
|
||||
}
|
||||
|
||||
# 2. Second call, fresh subshell (simulates a new terminal): fix auto-applies,
|
||||
# no prompt needed even though needs-fix.txt was removed again.
|
||||
rm -f needs-fix.txt
|
||||
out2=$(. ./f.sh && f cat needs-fix.txt < /dev/null)
|
||||
if [ "$out2" != "hello" ]; then
|
||||
echo "FAIL: expected learned fix to auto-apply on second call, got: $out2"
|
||||
fail=1
|
||||
else
|
||||
echo "PASS: learned fix auto-applies on a fresh call with no prompt"
|
||||
fi
|
||||
|
||||
# 3. A command that already succeeds should run once, untouched, no prompt.
|
||||
out3=$(. ./f.sh && f echo already-fine < /dev/null)
|
||||
if [ "$out3" != "already-fine" ]; then
|
||||
echo "FAIL: expected passthrough for already-succeeding command"
|
||||
fail=1
|
||||
else
|
||||
echo "PASS: already-succeeding commands pass through untouched"
|
||||
fi
|
||||
|
||||
exit $fail
|
||||
Reference in New Issue
Block a user