@@ -261,17 +261,25 @@ init:
261261# BUILD & COMPILE
262262# ═══════════════════════════════════════════════════════════════════════════════
263263
264- # Build all Zig FFI layers (catalogue + cartridges)
264+ # Build all Zig FFI layers (catalogue + all cartridges)
265265build * args :
266- @ echo " Building BoJ catalogue FFI..."
267- cd ffi/ zig && zig build {{ args}}
268- @ echo " Building cartridge FFIs..."
269- cd cartridges/ fleet-mcp/ ffi && zig build {{ args}}
270- cd cartridges/ nesy-mcp/ ffi && zig build {{ args}}
271- cd cartridges/ database-mcp/ ffi && zig build {{ args}}
272- cd cartridges/ agent-mcp/ ffi && zig build {{ args}}
273- cd cartridges/ feedback-mcp/ ffi && zig build {{ args}}
274- @ echo " Build complete"
266+ #!/usr/bin/env bash
267+ set -euo pipefail
268+ echo " Building BoJ catalogue FFI..."
269+ (cd ffi/zig && zig build {{args}})
270+ echo " Building cartridge FFIs..."
271+ FAILED=()
272+ for d in cartridges/* /ffi; do
273+ [ -f " $d /build.zig" ] || continue
274+ if ! (cd " $d " && zig build {{args}} 2>&1 ); then
275+ FAILED+=(" $d " )
276+ fi
277+ done
278+ if [ ${# FAILED[@]} -gt 0 ]; then
279+ echo " WARNING: ${# FAILED[@]} cartridge FFI(s) failed to build:"
280+ for f in " ${FAILED[@]} " ; do echo " $f " ; done
281+ fi
282+ echo " Build complete"
275283
276284# Build in release mode with optimizations
277285build-release * args :
@@ -476,7 +484,9 @@ run *args: build
476484 just build-adapter
477485 fi
478486 echo " Starting BoJ Server..."
479- exec " $ADAPTER " {{args}}
487+ LLP=" $( pwd) /ffi/zig/zig-out/lib"
488+ for d in cartridges/* /ffi/zig-out/lib; do [ -d " $d " ] && LLP=" ${LLP} :$( pwd) /${d} " ; done
489+ LD_LIBRARY_PATH=" ${LLP}${LD_LIBRARY_PATH: +: $LD_LIBRARY_PATH } " exec " $ADAPTER " {{args}}
480490
481491# Run with verbose output
482492run-verbose * args : build
@@ -491,7 +501,7 @@ build-adapter: build
491501 for d in cartridges/* /ffi/zig-out/lib; do
492502 [ -d " $d " ] && LFLAGS=" ${LFLAGS} -L$( pwd) /${d} "
493503 done
494- v -cc gcc -cflags " ${LFLAGS} -Wl,--allow-multiple-definition" \
504+ v -cc gcc -cflags " ${LFLAGS} -Wl,--allow-multiple-definition -no-pie " \
495505 -o adapter/v/boj-server adapter/v/src/
496506 echo " Built: adapter/v/boj-server ($( du -h adapter/v/boj-server | cut -f1) )"
497507
@@ -1170,73 +1180,102 @@ heal:
11701180 echo "═══════════════════════════════════════════════════"
11711181 echo ""
11721182 HEALED=0
1173- # --- Missing tool install instructions / attempts ---
1174- if ! command -v deno >/dev/null 2>&1; then
1175- echo "Deno not found (REQUIRED — runtime & package manager)."
1176- echo " curl -fsSL https://deno.land/install.sh | sh"
1177- echo " Or via asdf: asdf plugin add deno && asdf install deno latest"
1178- echo ""
1179- fi
1180- if ! command -v idris2 >/dev/null 2>&1; then
1181- echo "Idris2 not found (REQUIRED — ABI definitions)."
1182- if command -v asdf >/dev/null 2>&1; then
1183- echo " Installing via asdf..."
1184- asdf install idris2 latest || echo " asdf install failed — try: https://github.com/stefan-hoeck/idris2-pack"
1185- else
1186- echo " Install via pack: https://github.com/stefan-hoeck/idris2-pack"
1187- echo " Or via asdf: asdf plugin add idris2 && asdf install idris2 latest"
1183+ # --- Bootstrap asdf if missing ---
1184+ if ! command -v asdf >/dev/null 2>&1; then
1185+ if [ ! -f "$HOME /.asdf/asdf.sh" ]; then
1186+ echo "Installing asdf version manager..."
1187+ git clone https://github.com/asdf-vm/asdf.git "$HOME /.asdf" --branch v0.14.1
1188+ HEALED=$(( HEALED + 1 ))
11881189 fi
1190+ # shellcheck source=/dev/null
1191+ source "$HOME /.asdf/asdf.sh"
1192+ # Persist for future shells
1193+ if ! grep -q 'asdf.sh' "$HOME /.bashrc" 2>/dev/null; then
1194+ echo '. "$HOME /.asdf/asdf.sh"' >> "$HOME /.bashrc"
1195+ fi
1196+ if ! grep -q 'asdf.sh' "$HOME /.zshrc" 2>/dev/null; then
1197+ echo '. "$HOME /.asdf/asdf.sh"' >> "$HOME /.zshrc" 2>/dev/null || true
1198+ fi
1199+ echo " asdf ready."
11891200 echo ""
1201+ else
1202+ source "$HOME /.asdf/asdf.sh" 2>/dev/null || true
11901203 fi
1204+ # --- Install Zig via asdf ---
11911205 if ! command -v zig >/dev/null 2>&1; then
1192- echo "Zig not found (REQUIRED — FFI layer)."
1193- if command -v asdf >/dev/null 2>&1; then
1194- echo " Installing via asdf..."
1195- asdf install zig latest || echo " asdf install failed — try: https://ziglang.org/download/"
1196- else
1197- echo " Install manually: https://ziglang.org/download/"
1198- echo " Or via asdf: asdf plugin add zig && asdf install zig latest"
1199- fi
1206+ echo "Installing Zig (FFI layer)..."
1207+ asdf plugin add zig 2>/dev/null || true
1208+ asdf install zig latest
1209+ ZIG_VER=$( asdf list zig 2> /dev/null | tail -1 | tr -d ' ' )
1210+ asdf global zig "$ZIG_VER "
1211+ echo " Zig $ZIG_VER installed."
1212+ HEALED=$(( HEALED + 1 ))
12001213 echo ""
1214+ elif ! asdf current zig >/dev/null 2>&1; then
1215+ # Zig installed but no global version set
1216+ ZIG_VER=$( asdf list zig 2> /dev/null | tail -1 | tr -d ' ' )
1217+ [ -n "$ZIG_VER " ] && asdf global zig "$ZIG_VER " && echo " Zig global version set: $ZIG_VER "
12011218 fi
1219+ # --- Install V (vlang) ---
12021220 if ! command -v v >/dev/null 2>&1; then
1203- echo "V (vlang) not found (REQUIRED — API triple adapter)."
1204- if command -v asdf >/dev/null 2>&1; then
1205- echo " Installing via asdf..."
1206- asdf install vlang latest || echo " asdf install failed — try: https://vlang.io"
1207- else
1208- echo " Install manually: https://vlang.io"
1209- echo " Or via asdf: asdf plugin add vlang && asdf install vlang latest"
1221+ echo "Installing V (API adapter)..."
1222+ if [ ! -d "$HOME /vlang" ]; then
1223+ git clone https://github.com/vlang/v "$HOME /vlang"
1224+ fi
1225+ (cd "$HOME /vlang" && make)
1226+ # Symlink without sudo — use ~/.local/bin if writable
1227+ mkdir -p "$HOME /.local/bin"
1228+ ln -sf "$HOME /vlang/v" "$HOME /.local/bin/v"
1229+ export PATH="$HOME /.local/bin:$PATH "
1230+ if ! grep -q '\.local/bin' "$HOME /.bashrc" 2>/dev/null; then
1231+ echo 'export PATH="$HOME /.local/bin:$PATH "' >> "$HOME /.bashrc"
12101232 fi
1233+ echo " V installed at ~/.local/bin/v"
1234+ echo " (If 'v' is still not found in a new shell, run: sudo ~/vlang/v symlink)"
1235+ HEALED=$(( HEALED + 1 ))
12111236 echo ""
12121237 fi
1213- if ! command -v just >/dev/null 2>&1; then
1214- echo "Installing just..."
1215- cargo install just 2>/dev/null || echo " Install cargo first, then: cargo install just"
1238+ # --- System library dependencies ---
1239+ if command -v apt-get >/dev/null 2>&1; then
1240+ MISSING_PKGS=""
1241+ dpkg -s libsqlite3-dev >/dev/null 2>&1 || MISSING_PKGS="$MISSING_PKGS libsqlite3-dev"
1242+ if [ -n "$MISSING_PKGS " ]; then
1243+ echo "Installing system libraries:$MISSING_PKGS "
1244+ sudo apt-get install -y $MISSING_PKGS
1245+ HEALED=$(( HEALED + 1 ))
1246+ echo ""
1247+ fi
1248+ fi
1249+ # --- Idris2 (ABI definitions — no asdf plugin, manual only) ---
1250+ if ! command -v idris2 >/dev/null 2>&1; then
1251+ echo "Idris2 not found (REQUIRED — ABI definitions)."
1252+ echo " Install via pack: https://github.com/stefan-hoeck/idris2-pack"
12161253 echo ""
12171254 fi
1255+ # --- panic-attack (optional) ---
12181256 if ! command -v panic-attack >/dev/null 2>&1; then
12191257 echo "panic-attack not found (optional — pre-commit scans):"
12201258 echo " cargo install --git https://github.com/hyperpolymath/panic-attacker"
12211259 echo ""
12221260 fi
1223- # --- Clear stale caches ---
1261+ # --- Clear stale Zig caches ---
12241262 echo "Clearing stale Zig caches..."
1225- rm -rf ffi/zig/.zig-cache cartridges/*/ffi/.zig-cache 2>/dev/null && HEALED=$(( HEALED + 1 )) || true
1263+ rm -rf ffi/zig/.zig-cache cartridges/*/ffi/.zig-cache 2>/dev/null || true
1264+ HEALED=$(( HEALED + 1 ))
12261265 echo " Cleared."
1227- # --- Rebuild FFI if tools are present ---
1266+ echo ""
1267+ # --- Rebuild all FFI layers ---
12281268 if command -v zig >/dev/null 2>&1; then
1229- echo ""
1230- echo "Rebuilding catalogue FFI..."
1231- if (cd ffi/zig && zig build 2>/dev/null); then
1232- echo " Catalogue FFI rebuilt successfully."
1233- HEALED=$(( HEALED + 1 ))
1234- else
1235- echo " Catalogue FFI rebuild failed — check 'just doctor' output."
1236- fi
1269+ echo "Rebuilding all FFI layers..."
1270+ (cd ffi/zig && zig build) && echo " Catalogue FFI: OK" || echo " Catalogue FFI: FAILED"
1271+ for d in cartridges/*/ffi; do
1272+ [ -f "$d /build.zig" ] || continue
1273+ (cd "$d " && zig build 2>/dev/null) && echo " $d : OK" || echo " $d : FAILED"
1274+ done
1275+ HEALED=$(( HEALED + 1 ))
12371276 fi
12381277 echo ""
1239- echo "Healed $HEALED items. Run 'just doctor' to verify."
1278+ echo "Healed $HEALED items. Run 'just doctor' to verify, then 'just run' to start ."
12401279
12411280# Guided tour of the project structure and key concepts
12421281tour:
0 commit comments