Files
Kill_LIFE/tools/hw/sync_kicad_v10_libs.sh
T
kxkm 1c6c1952e8 fix+feat: restore CI/PIO regressions, 30-entry HF dataset, new tests & hardware
Regressions fixed (aa916de simplification):
- firmware/platformio.ini: restore esp32s3_waveshare (pioarduino platform,
  lib_deps: ArduinoJson/ESP32_Display_Panel/ESP32-audioI2S/IO_Expander,
  BOARD_HAS_PSRAM, I2S pins), restore esp32s3_qemu (extends waveshare +
  QEMU_BUILD), fix default_envs=esp32s3_waveshare, keep build_dir=/tmp/kl_pio_build
- .github/workflows/ci.yml: restore firmware-native (112 Unity tests),
  firmware-build (esp32s3_waveshare artifact), firmware-sim (Wokwi gated),
  hardware-export (KiCad ERC + SVG/PDF/netlist + KiBot + compliance)
- .gitignore: add .kibot-venv/ and .pio-venv/ (prevent committing venvs)

Dataset (HuggingFace clemsail/kill-life-embedded-qa v2):
- generate_hf_dataset.py: rag_query timeout 30s->120s (LLM takes ~45s),
  rag_search timeout 15s->30s; resolves intermittent server-busy failures
- 30 entries (10+10+5+5) -- 100% coverage vs 21/40 previously

Firmware tests (112/112):
- 4 suites: test_basic (39), test_modules (32), test_radio_state (26),
  test_wifi_state (15); test_logic.cpp now a stub (content moved to test_basic)

Hardware:
- esp32_minimal.kicad_pcb, esp32s3_enclosure.FCStd/.step, gen_pcb.py,
  gen_enclosure.py, REGISTRY.md, ERC reports for all design blocks

MCP tools:
- apify_mcp.py: +5 Kill_LIFE tools (fetch_espressif_docs, fetch_kicad_library_info,
  fetch_platformio_registry, ingest_to_rag, get_runtime_info)
- mcp_runtime_status.py: fix classify_overall -- accept_degraded respected for
  failed checks, task annotations, optional_degraded logic cleaned up
- deploy/cad/docker-compose.yml: path mascarade->mascarade-main

Specs & docs:
- docs/plans/TODO_2026-03-26.md, TODO_2026-03-27.md
- ai-agentic-embedded-base/specs: arch, tasks, intake, spec updates
- docs/playbooks/kicad_happy_hw_bom_forge.md

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-26 22:14:33 +01:00

145 lines
3.7 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
REPO_PARENT="$(cd "$ROOT_DIR/.." && pwd)"
IMAGE="${KICAD_MCP_IMAGE:-kill_life_cad-kicad-mcp:latest}"
DEST="${KICAD_AUX_CONTAINER_CACHE_DIR:-$HOME/Kill_LIFE/.cad-home/kicad-mcp/kicad-v10-libs}"
MASCARADE_DIR="${MASCARADE_DIR:-$REPO_PARENT/mascarade-main}"
INDEX_BUILDER="$MASCARADE_DIR/finetune/kicad_kic_ai/build_kicad_v10_indexes.py"
REFRESH=0
VERBOSE=0
usage() {
cat <<'EOF'
Usage: tools/hw/sync_kicad_v10_libs.sh [--refresh] [--verbose]
Export KiCad v10 symbol and footprint libraries from the KiCad MCP container image
into a local cache directory used by the auxiliary MCP servers.
Options:
--refresh Rebuild the local cache even if it already exists
--verbose Print executed Docker operations
-h, --help Show this help
Environment:
KICAD_MCP_IMAGE Container image to inspect
KICAD_AUX_CONTAINER_CACHE_DIR Destination cache directory
MASCARADE_DIR Companion repo used to prebuild indexes
EOF
}
log() {
printf '[kill_life:kicad-v10-libs] %s\n' "$*" >&2
}
die() {
printf '[kill_life:kicad-v10-libs][err] %s\n' "$*" >&2
exit 1
}
run_cmd() {
if [ "$VERBOSE" -eq 1 ]; then
log "run: $*"
fi
"$@"
}
while [ "$#" -gt 0 ]; do
case "$1" in
--refresh)
REFRESH=1
shift
;;
--verbose)
VERBOSE=1
shift
;;
-h|--help)
usage
exit 0
;;
*)
die "unknown argument: $1"
;;
esac
done
command -v docker >/dev/null 2>&1 || die "docker is required"
run_cmd docker image inspect "$IMAGE" >/dev/null 2>&1 || die "image not found: $IMAGE"
DEST="$(python3 - <<'PY' "$DEST"
import os
import sys
print(os.path.abspath(os.path.expanduser(sys.argv[1])))
PY
)"
SYMBOLS_DIR="$DEST/symbols"
FOOTPRINTS_DIR="$DEST/footprints"
SYMBOL_INDEX_FILE="$DEST/.symbol_index.sqlite3"
FOOTPRINT_INDEX_FILE="$DEST/.footprint_index.json"
if [ "$REFRESH" -eq 0 ] && [ -d "$SYMBOLS_DIR" ] && [ -d "$FOOTPRINTS_DIR" ]; then
if [ -f "$SYMBOL_INDEX_FILE" ] && [ -f "$FOOTPRINT_INDEX_FILE" ]; then
log "cache already present at $DEST"
exit 0
fi
if [ -f "$INDEX_BUILDER" ]; then
log "library cache present at $DEST; prewarming missing indexes"
run_cmd env \
KICAD_AUX_CONTAINER_CACHE_DIR="$DEST" \
python3 "$INDEX_BUILDER" >/dev/null
else
log "library cache present at $DEST but index builder not found at $INDEX_BUILDER"
fi
exit 0
fi
STAGE_DIR="$(mktemp -d "${DEST%/*}/.kicad-v10-libs.stage.XXXXXX")"
CONTAINER_ID=""
BACKUP_DIR=""
cleanup() {
if [ -n "$CONTAINER_ID" ]; then
docker rm -f "$CONTAINER_ID" >/dev/null 2>&1 || true
fi
if [ -n "$STAGE_DIR" ] && [ -d "$STAGE_DIR" ]; then
rm -rf "$STAGE_DIR"
fi
if [ -n "$BACKUP_DIR" ] && [ -d "$BACKUP_DIR" ]; then
rm -rf "$BACKUP_DIR"
fi
}
trap cleanup EXIT INT TERM
mkdir -p "$STAGE_DIR"
CONTAINER_ID="$(docker create "$IMAGE")"
run_cmd docker cp "$CONTAINER_ID:/usr/share/kicad/symbols" "$STAGE_DIR"
run_cmd docker cp "$CONTAINER_ID:/usr/share/kicad/footprints" "$STAGE_DIR"
if [ -f "$INDEX_BUILDER" ]; then
log "prewarming KiCad v10 indexes"
run_cmd env \
KICAD_AUX_CONTAINER_CACHE_DIR="$STAGE_DIR" \
python3 "$INDEX_BUILDER" --refresh >/dev/null
else
log "index builder not found at $INDEX_BUILDER; skipping prewarm"
fi
mkdir -p "$(dirname "$DEST")"
if [ -e "$DEST" ]; then
BACKUP_DIR="$(mktemp -d "${DEST%/*}/.kicad-v10-libs.backup.XXXXXX")"
rmdir "$BACKUP_DIR"
mv "$DEST" "$BACKUP_DIR"
fi
mv "$STAGE_DIR" "$DEST"
STAGE_DIR=""
if [ -n "$BACKUP_DIR" ] && [ -d "$BACKUP_DIR" ]; then
rm -rf "$BACKUP_DIR"
BACKUP_DIR=""
fi
trap - EXIT INT TERM
cleanup
log "synced KiCad v10 libraries to $DEST"