1c6c1952e8
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>
145 lines
3.7 KiB
Bash
Executable File
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"
|