Scans all projects for session logs not yet processed by /reflect-logs, using .reflection-state.json to track reflected status. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
110 lines
3.0 KiB
Bash
Executable File
110 lines
3.0 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
SCRIPT="$SCRIPT_DIR/../scripts/unreflected-logs"
|
|
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
RESET='\033[0m'
|
|
|
|
PASS=0
|
|
FAIL=0
|
|
|
|
assert_exit() {
|
|
local desc="$1" expected="$2"
|
|
shift 2
|
|
local actual
|
|
set +e
|
|
"$@" >/dev/null 2>&1
|
|
actual=$?
|
|
set -e
|
|
if [[ "$actual" -eq "$expected" ]]; then
|
|
echo -e "${GREEN}PASS${RESET}: $desc"
|
|
PASS=$((PASS + 1))
|
|
else
|
|
echo -e "${RED}FAIL${RESET}: $desc (expected exit $expected, got $actual)"
|
|
FAIL=$((FAIL + 1))
|
|
fi
|
|
}
|
|
|
|
assert_contains() {
|
|
local desc="$1" pattern="$2"
|
|
shift 2
|
|
local output
|
|
set +e
|
|
output=$("$@" 2>&1)
|
|
set -e
|
|
if echo "$output" | grep -qF "$pattern"; then
|
|
echo -e "${GREEN}PASS${RESET}: $desc"
|
|
PASS=$((PASS + 1))
|
|
else
|
|
echo -e "${RED}FAIL${RESET}: $desc (output missing: '$pattern')"
|
|
echo " Got: $output"
|
|
FAIL=$((FAIL + 1))
|
|
fi
|
|
}
|
|
|
|
# Setup temp directory structure
|
|
TMPDIR="$(mktemp -d)"
|
|
trap 'rm -rf "$TMPDIR"' EXIT
|
|
|
|
# Project with all logs reflected
|
|
mkdir -p "$TMPDIR/proj-a/memory/log"
|
|
echo "# log 1" > "$TMPDIR/proj-a/memory/log/2026-03-12.100000.md"
|
|
cat > "$TMPDIR/proj-a/.reflection-state.json" <<'JSON'
|
|
{"version": 1, "processed": {"log/2026-03-12.100000.md": "abc123"}}
|
|
JSON
|
|
|
|
# Project with unreflected logs
|
|
mkdir -p "$TMPDIR/proj-b/memory/log"
|
|
echo "# log 1" > "$TMPDIR/proj-b/memory/log/2026-03-12.100000.md"
|
|
echo "# log 2" > "$TMPDIR/proj-b/memory/log/2026-03-13.100000.md"
|
|
cat > "$TMPDIR/proj-b/.reflection-state.json" <<'JSON'
|
|
{"version": 1, "processed": {"log/2026-03-12.100000.md": "abc123"}}
|
|
JSON
|
|
|
|
# Project with no reflection state file
|
|
mkdir -p "$TMPDIR/proj-c/memory/log"
|
|
echo "# log 1" > "$TMPDIR/proj-c/memory/log/2026-03-14.100000.md"
|
|
|
|
# Project with empty log dir
|
|
mkdir -p "$TMPDIR/proj-d/memory/log"
|
|
|
|
# --- Tests ---
|
|
|
|
echo "=== unreflected-logs tests ==="
|
|
echo
|
|
|
|
# Help flag
|
|
assert_exit "--help exits 0" 0 "$SCRIPT" --help
|
|
assert_contains "--help shows usage" "Usage:" "$SCRIPT" --help
|
|
|
|
# Dryrun
|
|
assert_contains "--dryrun lists projects" "[dryrun]" "$SCRIPT" --dryrun "$TMPDIR"
|
|
assert_exit "--dryrun always exits 0" 0 "$SCRIPT" --dryrun "$TMPDIR"
|
|
|
|
# Detects unreflected logs
|
|
assert_exit "exits 1 when unreflected logs exist" 1 "$SCRIPT" "$TMPDIR"
|
|
assert_contains "shows unreflected log filename" "2026-03-13.100000.md" "$SCRIPT" "$TMPDIR"
|
|
|
|
# Shows project with no state file as unreflected
|
|
assert_contains "missing state file = unreflected" "2026-03-14.100000.md" "$SCRIPT" "$TMPDIR"
|
|
|
|
# Shows reflected project count
|
|
assert_contains "shows reflected project count" "1 projects have all logs reflected" "$SCRIPT" "$TMPDIR"
|
|
|
|
# No projects found
|
|
EMPTY="$(mktemp -d)"
|
|
assert_contains "no projects message" "No projects with session logs" "$SCRIPT" "$EMPTY"
|
|
assert_exit "no projects exits 0" 0 "$SCRIPT" "$EMPTY"
|
|
rmdir "$EMPTY"
|
|
|
|
# All reflected (only proj-a)
|
|
assert_exit "all reflected exits 0" 0 "$SCRIPT" "$TMPDIR/proj-a"
|
|
|
|
echo
|
|
echo "---"
|
|
echo -e "Results: ${GREEN}$PASS passed${RESET}, ${RED}$FAIL failed${RESET}"
|
|
[[ $FAIL -eq 0 ]]
|