aboutsummaryrefslogtreecommitdiff
path: root/claude-templates/.ai/scripts/flashcard-sync
blob: f5ba7fb65fe50853521683fad38041ca6074d49b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#!/usr/bin/env bash
# flashcard-sync: stats check + regenerate Anki apkg + place at ~/sync/phone/anki/
#
# Wraps flashcard-stats.py + flashcard-to-anki.py (and optionally
# flashcard-diff-ids.py) for the canonical "rewrote the deck, now ship
# it" step in the flashcard-review workflow.
#
# Usage:
#   flashcard-sync <source.org>
#   flashcard-sync <source.org> --diff-against <previous-version.org>
#
# Exits non-zero when the stats check warns, when --diff-against shows
# any disappeared / appeared IDs, or when flashcard-to-anki.py fails. The
# Anki apkg is not written when any gate fails.

set -euo pipefail

usage() {
    cat >&2 <<'EOF'
usage: flashcard-sync <source.org> [--diff-against <previous-version.org>]
EOF
    exit 2
}

if [[ $# -lt 1 ]]; then
    usage
fi

SOURCE="$1"
shift

DIFF_AGAINST=""
while [[ $# -gt 0 ]]; do
    case "$1" in
        --diff-against)
            [[ $# -ge 2 ]] || usage
            DIFF_AGAINST="$2"
            shift 2
            ;;
        -h|--help)
            usage
            ;;
        *)
            echo "unknown arg: $1" >&2
            usage
            ;;
    esac
done

if [[ ! -f "$SOURCE" ]]; then
    echo "error: $SOURCE not found" >&2
    exit 2
fi

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
STATS="$SCRIPT_DIR/flashcard-stats.py"
DIFF_IDS="$SCRIPT_DIR/flashcard-diff-ids.py"
TO_ANKI="$SCRIPT_DIR/flashcard-to-anki.py"

for helper in "$STATS" "$DIFF_IDS" "$TO_ANKI"; do
    if [[ ! -f "$helper" ]]; then
        echo "error: helper $helper not found" >&2
        exit 2
    fi
done

echo "=== flashcard-sync: $SOURCE ==="
echo
echo "--- stats ---"
if ! python3 "$STATS" "$SOURCE"; then
    echo
    echo "stats check failed — fix warnings before sync, or call flashcard-to-anki.py directly to override" >&2
    exit 1
fi
echo

if [[ -n "$DIFF_AGAINST" ]]; then
    if [[ ! -f "$DIFF_AGAINST" ]]; then
        echo "error: $DIFF_AGAINST not found" >&2
        exit 2
    fi
    echo "--- ID preservation ---"
    if ! python3 "$DIFF_IDS" "$DIFF_AGAINST" "$SOURCE"; then
        echo
        echo "ID preservation check failed — SRS state may have been lost" >&2
        exit 1
    fi
    echo
fi

BASENAME="$(basename "$SOURCE" .org)"
OUTPUT="$HOME/sync/phone/anki/${BASENAME}.apkg"

echo "--- regenerate apkg ---"
mkdir -p "$(dirname "$OUTPUT")"
"$TO_ANKI" "$SOURCE" --output "$OUTPUT"
echo
echo "deck synced to $OUTPUT"