@@ -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