Skip to content

Commit 61643f5

Browse files
committed
Fixed install and initialisation.
1 parent 78b1048 commit 61643f5

2 files changed

Lines changed: 117 additions & 57 deletions

File tree

Justfile

Lines changed: 96 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -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)
265265
build *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
277285
build-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
482492
run-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
12421281
tour:

ffi/zig/build.zig

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,27 @@ pub fn build(b: *std.Build) void {
208208
const community_step = b.step("community", "Run community cartridge submission tests");
209209
community_step.dependOn(&run_community_tests.step);
210210

211+
// --- Safety module (C-ABI input validation for V-lang adapter) ---
212+
const safety_mod = b.addModule("boj_safety", .{
213+
.root_source_file = b.path("src/safety.zig"),
214+
.target = target,
215+
.optimize = optimize,
216+
});
217+
218+
const safety_lib = b.addLibrary(.{
219+
.name = "boj_safety",
220+
.root_module = safety_mod,
221+
});
222+
b.installArtifact(safety_lib);
223+
224+
const safety_tests = b.addTest(.{
225+
.root_module = safety_mod,
226+
});
227+
const run_safety_tests = b.addRunArtifact(safety_tests);
228+
229+
const safety_step = b.step("safety", "Run safety input validation tests");
230+
safety_step.dependOn(&run_safety_tests.step);
231+
211232
// --- Auto-SDP module ---
212233
const sdp_mod = b.addModule("boj_sdp", .{
213234
.root_source_file = b.path("src/sdp.zig"),

0 commit comments

Comments
 (0)