diff --git a/.agents/tools/graphics/build-in-subos.sh b/.agents/tools/graphics/build-in-subos.sh index 523bf384..82b588d7 100755 --- a/.agents/tools/graphics/build-in-subos.sh +++ b/.agents/tools/graphics/build-in-subos.sh @@ -63,7 +63,19 @@ rm -rf "$STAGE" mkdir -p "$SRC" "$STAGE" # ── fetch ─────────────────────────────────────────────────────────────── -TARBALL="$SRC/$(basename "$URL")" +# Cached under NAME-VERSION, not under the URL's basename. +# +# Every GitHub archive URL is `.../archive/refs/tags/v.tar.gz`, so the +# basename carries the tag and nothing about the project. Vulkan-Headers and +# Vulkan-Loader are both released as v1.4.313, so the second build found the +# first one's `v1.4.313.tar.gz` already in $SRC, skipped the download, and +# configured, built, staged, leak-checked and PACKAGED the wrong source -- +# producing a `vulkan-loader` payload containing Vulkan-Headers, with every step +# reporting success. It was caught only because the resulting package had no +# lib/ directory. +# +# The basename is kept as a suffix so the file is still recognisable on disk. +TARBALL="$SRC/${NAME}-${VERSION}-$(basename "$URL")" [[ -f "$TARBALL" ]] || { log "fetching $(basename "$URL")" curl -fsSL --retry 3 -o "$TARBALL" "$URL" || fail "download failed" @@ -189,7 +201,22 @@ for dep in $DEPS; do fail "--deps $dep: not installed in $XHOME (xlings install $dep)" fi log " dep $dep -> ${depdir#"$XHOME"/data/xpkgs/}" - if [[ -d "$depdir/lib/pkgconfig" ]]; then + # BOTH pkgconfig locations, and the second one is not a nicety. + # + # `lib/pkgconfig` is where a library puts its .pc. A PROTOCOL-ONLY package + # installs no library at all and puts its .pc in `share/pkgconfig` -- + # xorgproto ships 40 of them there (xineramaproto, damageproto, ...), and + # xcb-proto is the same shape. + # + # Looking only at `lib/` therefore made every protocol package invisible to + # pkg-config while its HEADERS were still spliced in by `-I` below. That + # combination is why the gap survived: mesa builds fine, because it includes + # the headers and never asks pkg-config for a protocol module. libXinerama + # does ask, and dies on `XINERAMA_CFLAGS ... no such package` for a package + # that is sitting right there and whose headers are already on the command + # line. + for pcsrc in "$depdir/lib/pkgconfig" "$depdir/share/pkgconfig"; do + [[ -d "$pcsrc" ]] || continue # Rewrite `prefix=` into a scratch copy rather than use the payload's # .pc as-is. libxml2's ships `prefix=/tmp/libxml2-install` — the # directory it was built in, on a machine that no longer exists — so @@ -202,12 +229,15 @@ for dep in $DEPS; do # as far as a build is concerned. pcdir="$WORK/pc/$dep" mkdir -p "$pcdir" - for pc in "$depdir"/lib/pkgconfig/*.pc; do + for pc in "$pcsrc"/*.pc; do [[ -e "$pc" ]] || continue sed "s#^prefix=.*#prefix=${depdir%/}#" "$pc" > "$pcdir/$(basename "$pc")" done - PKG_CONFIG_LIBDIR="$PKG_CONFIG_LIBDIR:$pcdir" - fi + case ":$PKG_CONFIG_LIBDIR:" in + *":$pcdir:"*) ;; + *) PKG_CONFIG_LIBDIR="$PKG_CONFIG_LIBDIR:$pcdir" ;; + esac + done [[ -d "$depdir/include" ]] && CPPFLAGS="$CPPFLAGS -I$depdir/include" if [[ -d "$depdir/lib" ]]; then # A staged copy with an RPATH, not the payload itself. diff --git a/.agents/tools/graphics/vendorprobe.c b/.agents/tools/graphics/vendorprobe.c new file mode 100644 index 00000000..86b46803 --- /dev/null +++ b/.agents/tools/graphics/vendorprobe.c @@ -0,0 +1,20 @@ +/* Does glvnd's vendor actually load, and does its entry point exist? + * + * S1 fails with zero vendors and mesa printing nothing, which narrows the + * failure to glvnd's load-then-__egl_Main step. Everything upstream of it was + * eliminated by measurement (namespaces, /usr, /dev, /sys, the dependency + * closure, JSON readability). This asks the one remaining question directly. */ +#include +#include +int main(int argc, char **argv) { + if (argc < 2) { fprintf(stderr, "usage: vendorprobe \n"); return 2; } + void *h = dlopen(argv[1], RTLD_LAZY | RTLD_LOCAL); + if (!h) { printf("DLOPEN=fail\nERR=%s\n", dlerror()); return 1; } + printf("DLOPEN=ok\n"); + dlerror(); + void *m = dlsym(h, "__egl_Main"); + const char *e = dlerror(); + printf("EGL_MAIN=%s\n", m ? "present" : "MISSING"); + if (e) printf("DLSYM_ERR=%s\n", e); + return 0; +} diff --git a/.agents/tools/graphics/verify-stack.sh b/.agents/tools/graphics/verify-stack.sh new file mode 100755 index 00000000..047a6af4 --- /dev/null +++ b/.agents/tools/graphics/verify-stack.sh @@ -0,0 +1,357 @@ +#!/usr/bin/env bash +# Verify the xlings graphics stack on THIS machine, in a dedicated subos. +# +# verify-stack.sh [--subos NAME] [--home DIR] [--keep] [--json] +# +# WHY THIS EXISTS +# +# Verification of this stack was three scripts that each covered one slice: +# verify-host-link.sh (NVIDIA only, needs a GPU), selfcontained-check.sh +# (empty host, needs bwrap and a subos compiler), and whatever the developer +# typed that day. Each had its own setup, none knew about the others, and the +# union was never reported anywhere. So "the ecosystem works" rested on one +# machine with one GPU -- an RTX 4080 -- and every other cell of the matrix was +# untested in a way that produced no output at all. +# +# THE RULE THIS ENCODES +# +# A cell that could not be exercised HERE is a third outcome, not a pass and +# not a failure. It is printed, counted, and carried into the summary. Anything +# else makes "we do not have that hardware" and "it works" look identical -- +# which is the failure mode this whole stack keeps producing and keeps having to +# re-learn (see project_silent_success_pattern). +# +# HOW COVERAGE IS MEANT TO ACCUMULATE +# +# No single machine can cover the matrix: nobody has an NVIDIA, an AMD, an Intel +# and a WSL2 host at once. So this script is designed to be run by DIFFERENT +# people and its summary pasted into an issue. The union of runs is the +# ecosystem's coverage, and the SKIP lines are the recruitment list. +# +# Design: xlings/.agents/docs/2026-08-07-graphics-experience-industry-survey-and-plan.md §10 +set -uo pipefail + +SUBOS="gfxverify"; KEEP=0; JSON=0; XHOME_ARG="" +while [[ $# -gt 0 ]]; do + case "$1" in + --subos) SUBOS="$2"; shift 2 ;; + --home) XHOME_ARG="$2"; shift 2 ;; + --keep) KEEP=1; shift ;; + --json) JSON=1; shift ;; + -h|--help) sed -n '2,8p' "$0"; exit 0 ;; + *) echo "unknown argument: $1" >&2; exit 2 ;; + esac +done + +XB="${XLINGS_BIN:-$(command -v xlings 2>/dev/null)}" +[[ -x "$XB" ]] || { echo "no xlings on PATH; set XLINGS_BIN" >&2; exit 2; } +export XLINGS_HOME="${XHOME_ARG:-${XLINGS_HOME:-$HOME/.xlings}}" +HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +S="$XLINGS_HOME/subos/$SUBOS" + +pass=0; fail=0; skip=0 +declare -a ROWS +ok() { printf ' \033[0;32m✓\033[0m %-34s %s\n' "$1" "${2:-}"; pass=$((pass+1)); ROWS+=("PASS|$1|${2:-}"); } +bad() { printf ' \033[0;31m✗\033[0m %-34s %s\n' "$1" "${2:-}"; fail=$((fail+1)); ROWS+=("FAIL|$1|${2:-}"); } +# A skip carries its REASON into the summary. "not applicable here" without a +# reason is indistinguishable from "forgot to implement it". +na() { printf ' \033[0;33m·\033[0m %-34s %s\n' "$1" "not here: ${2}"; skip=$((skip+1)); ROWS+=("SKIP|$1|$2"); } +sect() { printf '\n\033[1;36m── %s\033[0m\n' "$1"; } + +# ── what this host is ─────────────────────────────────────────────────── +sect "0. host capability probe" + +# Every probe below answers "is this cell exercisable here", and each one is a +# FACT about the machine rather than a guess from /etc/os-release. +has_nvidia=0; [[ -r /sys/module/nvidia/version ]] && has_nvidia=1 +nv_ver=""; [[ $has_nvidia -eq 1 ]] && nv_ver=$(cat /sys/module/nvidia/version) +has_dxg=0; [[ -e /dev/dxg ]] && has_dxg=1 +has_dri=0; [[ -d /dev/dri ]] && has_dri=1 +has_bwrap=0; command -v bwrap >/dev/null 2>&1 && has_bwrap=1 +has_display=0; [[ -n "${DISPLAY:-}" ]] && has_display=1 +has_wayland=0; [[ -n "${WAYLAND_DISPLAY:-}" ]] && has_wayland=1 + +# GPU vendors by PCI class, from /sys — not from lspci, which may be absent. +vendors="" +for d in /sys/class/drm/card*/device/vendor; do + [[ -r "$d" ]] || continue + case "$(cat "$d")" in + 0x10de) vendors="$vendors nvidia" ;; + 0x1002) vendors="$vendors amd" ;; + 0x8086) vendors="$vendors intel" ;; + esac +done +vendors="$(tr ' ' '\n' <<<"$vendors" | sort -u | tr '\n' ' ' | sed 's/^ *//')" + +echo " xlings $("$XB" --version 2>/dev/null | head -1)" +echo " home $XLINGS_HOME" +echo " subos $SUBOS" +echo " DRM vendors ${vendors:-none}" +echo " nvidia kmod ${nv_ver:-none}" +echo " /dev/dxg $([[ $has_dxg -eq 1 ]] && echo present || echo absent) (WSL2)" +echo " DISPLAY ${DISPLAY:-unset} WAYLAND_DISPLAY ${WAYLAND_DISPLAY:-unset}" +echo " bwrap $([[ $has_bwrap -eq 1 ]] && echo yes || echo no)" + +# ── the stack ─────────────────────────────────────────────────────────── +sect "1. the stack installs into a subos" + +"$XB" subos new "$SUBOS" >/dev/null 2>&1 # idempotent; ignore "exists" +if ! "$XB" subos use "$SUBOS" --cmd 'true' >/dev/null 2>&1; then + bad "subos '$SUBOS' usable" "could not enter it" + echo; echo "cannot continue without a subos"; exit 1 +fi +ok "subos '$SUBOS' created/usable" + +if "$XB" install graphics -y >/tmp/gfxverify-install.log 2>&1; then + n=$(grep -cE "✓ (xim|local):" /tmp/gfxverify-install.log || true) + # "installed 0 packages" and "installed the whole stack" both exit 0, and the + # first one is what a re-run looks like. Say WHICH, rather than printing a + # count that reads as coverage -- the same trap #532 hit in CI, where a green + # install test had exercised nothing. + if [[ "$n" -gt 0 ]]; then + ok "xlings install graphics" "$n package(s) installed" + else + ok "xlings install graphics" "already satisfied (nothing to install this run)" + fi +else + bad "xlings install graphics" "see /tmp/gfxverify-install.log" +fi + +sect "2. the discovery layer is declared, not assumed" +envout="$("$XB" subos use "$SUBOS" --shell sh 2>/dev/null)" +for v in LIBGL_DRIVERS_PATH __EGL_VENDOR_LIBRARY_DIRS XDG_DATA_DIRS; do + if grep -q "$v" <<<"$envout"; then ok "$v declared"; else bad "$v declared" "no package declares it"; fi +done + +# The shared vendor directory is what makes 10_nvidia < 50_mesa mean anything; +# with one directory per package the order came from xlings' binding sort. +VD="$S/share/glvnd/egl_vendor.d" +if [[ -d "$VD" ]]; then + ok "one shared glvnd vendor dir" "$(ls "$VD" 2>/dev/null | tr '\n' ' ')" +else + bad "one shared glvnd vendor dir" "$VD absent" +fi +[[ -d "$S/usr/lib/dri" ]] \ + && ok "dri modules in the subos" "$(ls "$S/usr/lib/dri" | wc -l | tr -d ' ') modules" \ + || bad "dri modules in the subos" "$S/usr/lib/dri absent" + +# ── rendering, per driver path ────────────────────────────────────────── +sect "3. rendering" + +CC="${CC:-}"; [[ -n "$CC" ]] || for c in /usr/bin/gcc /usr/bin/cc /usr/bin/clang; do + [[ -x "$c" ]] && { CC="$c"; break; } +done +PROBE="" +if [[ -n "$CC" && -f "$HERE/glprobe.c" ]]; then + INC="$(find "$XLINGS_HOME/data/xpkgs" -maxdepth 4 -type d -path '*libglvnd*/include' 2>/dev/null | head -1)" + if "$CC" -O0 -o /tmp/gfxverify-probe "$HERE/glprobe.c" ${INC:+-I"$INC"} \ + -L"$S/lib" -lEGL -lGL -Wl,--dynamic-linker="$S/lib/ld-linux-x86-64.so.2" \ + -Wl,-rpath,"$S/lib" -Wl,--disable-new-dtags 2>/tmp/gfxverify-probe.log; then + PROBE=/tmp/gfxverify-probe + fi +fi + +run_probe() { # $1..: extra env assignments + [[ -n "$PROBE" ]] || return 1 + env -u LD_LIBRARY_PATH \ + LIBGL_DRIVERS_PATH="$S/usr/lib/dri" \ + __EGL_VENDOR_LIBRARY_DIRS="$VD" \ + "$@" "$PROBE" 2>&1 +} + +if [[ -z "$PROBE" ]]; then + na "software rendering (llvmpipe)" "no host compiler to build the probe" +else + # LIBGL_ALWAYS_SOFTWARE, not just "pick the mesa vendor". + # + # Selecting mesa is not the same as selecting SOFTWARE. The moment a Vulkan + # loader appeared in the stack, this cell started reporting + # zink Vulkan 1.3 (NVIDIA GeForce RTX 4080 (NVIDIA_PROPRIETARY)) + # -- mesa had switched to zink, its GL-over-Vulkan driver, which is a real and + # welcome capability but is emphatically not the CPU path this cell exists to + # prove. The cell was named for llvmpipe and was measuring "whatever mesa + # chose". + out="$(run_probe __EGL_VENDOR_LIBRARY_FILENAMES="$VD/50_mesa.json" LIBGL_ALWAYS_SOFTWARE=1)" + r="$(sed -n 's/^GL_RENDERER=//p' <<<"$out")" + if grep -q "^RESULT=ok" <<<"$out" && grep -qiE "llvmpipe|softpipe|swrast" <<<"$r"; then + ok "software rendering (llvmpipe)" "$r" + else + bad "software rendering (llvmpipe)" "${r:-no renderer}" + fi +fi + +# NVIDIA proprietary -- delegated to the dedicated verifier, which checks +# provenance rather than the renderer string. +if [[ $has_nvidia -eq 1 ]]; then + if [[ -x "$HERE/verify-host-link.sh" ]]; then + if XLINGS_BIN="$XB" CC="$CC" bash "$HERE/verify-host-link.sh" "$XLINGS_HOME" "$SUBOS" >/tmp/gfxverify-nv.log 2>&1; then + ok "NVIDIA proprietary (interposed)" "$(grep -oE 'PASS: [0-9]+ checks' /tmp/gfxverify-nv.log | head -1)" + else + bad "NVIDIA proprietary (interposed)" "$(grep -oE 'FAIL:.*' /tmp/gfxverify-nv.log | head -1)" + fi + else + na "NVIDIA proprietary (interposed)" "verify-host-link.sh not present" + fi +else + na "NVIDIA proprietary (interposed)" "no nvidia kernel module on this host" +fi + +# The open-driver cells. Each needs the matching GPU; MESA_LOADER_DRIVER_OVERRIDE +# is NOT used as a substitute, because forcing a driver onto absent hardware +# tests the loader, not the driver. +for pair in "amd:radeonsi" "intel:iris" "nvidia:nouveau"; do + v="${pair%%:*}"; drv="${pair##*:}" + if ! grep -qw "$v" <<<"$vendors"; then + na "$drv (hardware $v)" "no $v GPU in /sys/class/drm" + elif [[ ! -e "$S/usr/lib/dri/${drv}_dri.so" ]]; then + bad "$drv (hardware $v)" "GPU present but ${drv}_dri.so is NOT in the payload" + elif [[ "$drv" == nouveau && $has_nvidia -eq 1 ]]; then + # The open driver cannot bind a GPU the proprietary kernel module owns. + na "$drv (hardware $v)" "proprietary nvidia.ko is bound to this GPU" + elif [[ -z "$PROBE" ]]; then + na "$drv (hardware $v)" "no compiler to build the probe" + else + out="$(run_probe __EGL_VENDOR_LIBRARY_FILENAMES="$VD/50_mesa.json" MESA_LOADER_DRIVER_OVERRIDE="$drv")" + r="$(sed -n 's/^GL_RENDERER=//p' <<<"$out")" + # RESULT=ok is NOT enough, and this script caught itself getting this wrong: + # with MESA_LOADER_DRIVER_OVERRIDE=nouveau on a proprietary-driver machine it + # rendered fine -- on llvmpipe -- and the cell reported PASS. A hardware cell + # must assert the renderer is the hardware, or it is measuring the software + # fallback and calling it driver coverage. + if ! grep -q "^RESULT=ok" <<<"$out"; then + bad "$drv (hardware $v)" "${r:-did not render}" + elif grep -qi "llvmpipe\|softpipe\|swrast" <<<"$r"; then + bad "$drv (hardware $v)" "fell back to software: $r" + else + ok "$drv (hardware $v)" "$r" + fi + fi +done + +# WSL2 +if [[ $has_dxg -eq 1 ]]; then + if [[ ! -e "$S/usr/lib/dri/d3d12_dri.so" ]]; then + bad "WSL2 d3d12" "/dev/dxg present but d3d12_dri.so is NOT in the payload" + elif [[ -z "$PROBE" ]]; then + na "WSL2 d3d12" "no compiler to build the probe" + else + out="$(run_probe GALLIUM_DRIVER=d3d12 __EGL_VENDOR_LIBRARY_FILENAMES="$VD/50_mesa.json")" + grep -q "^RESULT=ok" <<<"$out" \ + && ok "WSL2 d3d12" "$(sed -n 's/^GL_RENDERER=//p' <<<"$out")" \ + || bad "WSL2 d3d12" "$(sed -n 's/^GL_RENDERER=//p' <<<"$out" || echo 'did not render')" + fi +else + na "WSL2 d3d12" "/dev/dxg absent (not WSL2)" +fi + +# ── APIs and window systems ───────────────────────────────────────────── +sect "4. APIs and window systems" + +if [[ ! -e "$S/lib/libvulkan.so.1" ]]; then + na "Vulkan loader + our ICD" "no vulkan-loader package in the stack yet" +else + # A loader with none of OUR ICDs in the subos is not Vulkan support -- it is a + # loader that will find the HOST's ICDs and report success. Exactly the + # boundary the GL side needed interposers for, one API over. This first + # reported "loader + 0 ICD manifest(s)" as a PASS, which is the same shape as + # counting zero installed packages as coverage. + icds=$(ls "$S/share/vulkan/icd.d"/*.json 2>/dev/null | wc -l | tr -d ' ') + if [[ "${icds:-0}" -gt 0 ]]; then + ok "Vulkan loader + our ICD" "$icds ICD manifest(s) in the subos" + else + bad "Vulkan loader + our ICD" \ + "libvulkan.so.1 present but NO ICD of ours in $S/share/vulkan/icd.d — any Vulkan here is the host's" + fi +fi + +if [[ $has_display -eq 1 ]]; then + if [[ -n "$PROBE" && -f "$HERE/glxprobe.c" ]]; then + ok "X11 / GLX reachable" "DISPLAY=$DISPLAY (depth checked by verify-host-link)" + else + na "X11 / GLX reachable" "no glxprobe to build" + fi +else + na "X11 / GLX reachable" "DISPLAY unset" +fi +[[ $has_wayland -eq 1 ]] \ + && na "Wayland" "WAYLAND_DISPLAY set but no Wayland probe exists yet (O4)" \ + || na "Wayland" "WAYLAND_DISPLAY unset" + +# ── a real application ────────────────────────────────────────────────── +sect "5. a real GUI application, not a probe" + +# The distinction this section exists for: mesa's dependency closure is a +# RENDERING library's closure. An application also opens windows, draws text and +# reads input, and dlopens every library for that itself -- so those appear in no +# DT_NEEDED and in no graph derived from one. A surfaceless probe needs none of +# them and therefore cannot detect their absence. +APP_EXE="$(ls "$XLINGS_HOME"/data/xpkgs/*-godot/*/godot 2>/dev/null | head -1)" +if [[ -z "$APP_EXE" ]]; then + na "GUI application starts" "godot not installed (xlings install godot)" +elif [[ $has_display -eq 0 ]]; then + na "GUI application starts" "no DISPLAY to open a window on" +else + aout="$(env -u LD_LIBRARY_PATH \ + LIBGL_DRIVERS_PATH="$S/usr/lib/dri" __EGL_VENDOR_LIBRARY_DIRS="$VD" \ + XDG_DATA_DIRS="$S/share:${XDG_DATA_DIRS:-/usr/share}" \ + timeout 120 "$APP_EXE" --quit --path /tmp 2>&1)" + if grep -qiE "OpenGL API|Vulkan API" <<<"$aout"; then + ok "GUI application starts" "$(grep -oiE '(OpenGL|Vulkan) API.*' <<<"$aout" | head -1 | cut -c1-64)" + else + bad "GUI application starts" "$(grep -oE '[a-z0-9+_-]+\.so[.0-9]*: cannot open[^\"]*' <<<"$aout" | head -1)" + fi + # Unresolved dlopens that did NOT stop it are still coverage gaps, and the + # application will not report them as failures. + miss=$(grep -oE '^lib[a-z0-9+_.-]+\.so[.0-9]*' <<<"$aout" | sort -u | tr '\n' ' ') + [[ -n "$miss" ]] && printf ' \033[0;33m!\033[0m non-fatal unresolved dlopen: %s\n' "$miss" + + # The claim A7 rests on: with the stack present, no host directory is on the + # application's RPATH. A renderer string cannot show this. + hostdirs=$(patchelf --print-rpath "$APP_EXE" 2>/dev/null | tr ':' '\n' | grep -cE '^/usr/lib|^/lib' || true) + [[ "${hostdirs:-0}" -eq 0 ]] \ + && ok "app RPATH free of host dirs" "0 host directories" \ + || bad "app RPATH free of host dirs" "$hostdirs host directories still on it" +fi + +# ── self-containment ──────────────────────────────────────────────────── +sect "6. self-containment (no /usr at all)" +if [[ $has_bwrap -eq 0 ]]; then + na "empty-host self-containment" "bwrap not installed" +elif [[ ! -x "$HERE/selfcontained-check.sh" ]]; then + na "empty-host self-containment" "selfcontained-check.sh not present" +else + XLINGS_BIN="$XB" XLINGS_GFX_SUBOS="$SUBOS" bash "$HERE/selfcontained-check.sh" >/tmp/gfxverify-sc.log 2>&1 + rc=$? + case $rc in + 0) ok "empty-host self-containment" "S1-S4 pass" ;; + 2) na "empty-host self-containment" "INCONCLUSIVE — the control run also failed; see /tmp/gfxverify-sc.log" ;; + *) bad "empty-host self-containment" "$(grep -oE 'FAIL:.*' /tmp/gfxverify-sc.log | head -1)" ;; + esac +fi + +# ── summary ───────────────────────────────────────────────────────────── +sect "summary" +printf ' pass %d fail %d not-exercised-here %d\n\n' "$pass" "$fail" "$skip" +if [[ $skip -gt 0 ]]; then + echo " Cells this machine could not exercise — someone with that hardware must:" + for r in "${ROWS[@]}"; do + [[ "${r%%|*}" == SKIP ]] || continue + n="${r#SKIP|}"; echo " · ${n%%|*} (${n#*|})" + done + echo +fi +if [[ $JSON -eq 1 ]]; then + printf '{"host":{"vendors":"%s","nvidia":"%s","dxg":%s},"results":[' \ + "$vendors" "${nv_ver:-}" "$([[ $has_dxg -eq 1 ]] && echo true || echo false)" + sep="" + for r in "${ROWS[@]}"; do + st="${r%%|*}"; n="${r#*|}" + printf '%s{"status":"%s","cell":"%s","note":"%s"}' "$sep" "$st" "${n%%|*}" "${n#*|}"; sep="," + done + printf ']}\n' +fi + +[[ $KEEP -eq 1 ]] || echo " (subos '$SUBOS' kept; remove with: xlings subos remove $SUBOS)" +# Skips do not fail the run. They are a coverage report, and treating "I do not +# have an AMD GPU" as a failure would make the script useless to everyone. +[[ $fail -eq 0 ]] && exit 0 || exit 1 diff --git a/.github/scripts/posix-test.sh b/.github/scripts/posix-test.sh index 511d910f..371bfaf5 100755 --- a/.github/scripts/posix-test.sh +++ b/.github/scripts/posix-test.sh @@ -151,10 +151,80 @@ fi # Same reasoning as the scode line above — make the things a dependency can # point at resolvable first, then test. Registration is idempotent, so the # loop's own add-xpkg stays as it is. +# A recipe under test SHADOWS its published copy; it does not coexist with it. +# +# `config --add-xpkg` registers the changed recipe under `local:`, while the +# published one stays in the `xim:` index. Two candidates for one package is a +# state that never exists after merge, and it breaks the run in two ways that +# both look like bugs in the diff: +# +# 1. AMBIGUITY. Any recipe -- including a PUBLISHED one this PR cannot edit -- +# that names a dep WITHOUT a namespace now has two candidates and fails +# with "package 'expat@2.6.2' is ambiguous". Published `xim:fontconfig` +# says `expat@2.6.2`, so merely touching expat broke fontconfig AND +# graphics. Whether a PR passes then depends on which OTHER packages it +# happens to touch. +# +# 2. DOUBLE INSTALL FROM ONE EXTRACTION. `xim:libffi` gets pulled in as some +# other package's dependency and its install hook MOVES the extracted +# source tree into place. When `local:libffi` is then installed for its own +# test, there is no download artifact and therefore no extraction, the +# recipe's `os.mv` finds nothing, `install()` returns true anyway, and +# xlings prints a tick over an EMPTY payload directory. The only complaint +# came from the config hook two steps later, about pkgconfig globs. +# +# So the recipe under test is written OVER the published one, in place, in the +# same namespace. One candidate, and it is the PR's -- exactly the state the +# merge produces. +# +# Deleting the published copy instead is not equivalent and was tried: it also +# leaves one candidate, but it removes the `xim:` NAME, so every dep that +# qualifies itself -- `xim:expat@2.6.2`, `xim:libffi@>=3.4` -- stops resolving. +# Overlay keeps the name and changes only the content. +# +# Guarded to a real directory: when the index path is a symlink (a developer +# pointing their home at this very checkout) the copy would write back into the +# source tree. In that case, and if the overlay fails for any other reason, the +# caller falls back to the old `--add-xpkg` behaviour rather than skipping the +# package. +# Only for a recipe that ALREADY EXISTS upstream — i.e. a change to a published +# package. That is precisely the case that produces the duplicate, and it is the +# only case overlay can serve. +# +# A package the PR ADDS is not in the index, so asking for it by its index name +# makes xlings say `'xim:' not in current index; refreshing index...` and +# re-fetch the whole index — which overwrites the file that was just placed +# there, and the install then fails with `not found`. New packages therefore +# keep the `--add-xpkg` / `local:` path, where they are unambiguous anyway: +# nothing published shares the name, so there is no second candidate. +# +# This also matches the namespace rule the index already follows — a new package +# is referenced bare, a changed published one with `xim:`. +INDEX_DIR="$XLINGS_HOME_DIR/data/xim-pkgindex" +overlay_recipe() { + local rel_file="$1" + [[ -d "$INDEX_DIR" && ! -L "$INDEX_DIR" ]] || return 1 + [[ -f "$INDEX_DIR/$rel_file" ]] || return 1 # not published: not ours to overlay + cp -f "$WORKSPACE_ROOT/$rel_file" "$INDEX_DIR/$rel_file" || return 1 + return 0 +} + +# The same reasoning applies to libs/: a recipe overlaid into the xim index +# imports `xim.pkgindex.*` from THAT index, so the PR's helpers have to be there +# too. Without this the imports fall through to the permissive stub and every +# helper call is a truthy no-op -- the failure mode already described above for +# the local index. +if [[ -d "$WORKSPACE_ROOT/libs" && -d "$INDEX_DIR" && ! -L "$INDEX_DIR" ]]; then + mkdir -p "$INDEX_DIR/libs" + cp "$WORKSPACE_ROOT/libs/"*.lua "$INDEX_DIR/libs/" 2>/dev/null || true +fi + for rel_file in "${files[@]}"; do [[ -n "$rel_file" ]] || continue [[ -f "$WORKSPACE_ROOT/$rel_file" ]] || continue - "$XLINGS_CMD" config --add-xpkg "$WORKSPACE_ROOT/$rel_file" >/dev/null 2>&1 || true + if ! overlay_recipe "$rel_file"; then + "$XLINGS_CMD" config --add-xpkg "$WORKSPACE_ROOT/$rel_file" >/dev/null 2>&1 || true + fi done for rel_file in "${files[@]}"; do @@ -207,7 +277,12 @@ for rel_file in "${files[@]}"; do tested=$((tested+1)) step "[$pkg] register (type=$pkg_type)" - if ! "$XLINGS_CMD" config --add-xpkg "$lua_file"; then + # Overlay wins; `--add-xpkg` is the fallback for a home whose index copy is + # not writable. `pkg_ns` is corrected below to match whichever ran. + if overlay_recipe "$rel_file"; then + [[ "$pkg_ns" == "local" ]] && pkg_ns="xim" + info "overlaid into the index as ${pkg_ns}:${pkg}" + elif ! "$XLINGS_CMD" config --add-xpkg "$lua_file"; then log_fail "config --add-xpkg failed"; failures+=("$rel_file (register)"); continue fi diff --git a/.xlings-index-cache.json b/.xlings-index-cache.json index a9b18ce7..e9c08d3b 100644 --- a/.xlings-index-cache.json +++ b/.xlings-index-cache.json @@ -1 +1 @@ -{"default_namespace":"xim","entries":{"config:claude-llm":{"canonical_name":"config:claude-llm","description":"Configure Claude Code to use DeepSeek Anthropic-compatible API","entry_key":"config:claude-llm","identity":{"name":"claude-llm","namespace":"config"},"name":"claude-llm","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/c/claude-llm.lua","ref":"","type":3,"version":""},"config:fontconfig-user-moyingji":{"canonical_name":"config:fontconfig-user-moyingji","description":"Basic user configuration for Linux Fontconfig written by MoYingJi","entry_key":"config:fontconfig-user-moyingji","identity":{"name":"fontconfig-user-moyingji","namespace":"config"},"name":"fontconfig-user-moyingji","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/f/fontconfig-user-moyingji.lua","ref":"","type":3,"version":""},"config:gitcode-hosts":{"canonical_name":"config:gitcode-hosts","description":"Config gitcode.com ip mapping-groups to hosts file","entry_key":"config:gitcode-hosts","identity":{"name":"gitcode-hosts","namespace":"config"},"name":"gitcode-hosts","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/g/gitcode-hosts.lua","ref":"","type":3,"version":""},"config:mcpp-vscode-clangd":{"canonical_name":"config:mcpp-vscode-clangd","description":"Configure VSCode clangd support for mcpp LLVM projects","entry_key":"config:mcpp-vscode-clangd","identity":{"name":"mcpp-vscode-clangd","namespace":"config"},"name":"mcpp-vscode-clangd","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/m/mcpp-vscode-clangd.lua","ref":"","type":3,"version":""},"config:powershell-execpolicy":{"canonical_name":"config:powershell-execpolicy","description":"fix execution policy issue when open Powershell(load .ps1 file)","entry_key":"config:powershell-execpolicy","identity":{"name":"powershell-execpolicy","namespace":"config"},"name":"powershell-execpolicy","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/p/powershell-execpolicy.lua","ref":"","type":0,"version":""},"config:rust-crates-mirror":{"canonical_name":"config:rust-crates-mirror","description":"Config Index Mirror for Rust Crates (Cargo)","entry_key":"config:rust-crates-mirror","identity":{"name":"rust-crates-mirror","namespace":"config"},"name":"rust-crates-mirror","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/r/rust-crates-mirror.lua","ref":"","type":3,"version":""},"config:rustup-mirror":{"canonical_name":"config:rustup-mirror","description":"Config Mirror for Rustup","entry_key":"config:rustup-mirror","identity":{"name":"rustup-mirror","namespace":"config"},"name":"rustup-mirror","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/r/rustup-mirror.lua","ref":"","type":3,"version":""},"config:virtualbox-ubuntu":{"canonical_name":"config:virtualbox-ubuntu","description":"Provision a ready-to-use Ubuntu 24.04 VM in VirtualBox (unattended install)","entry_key":"config:virtualbox-ubuntu","identity":{"name":"virtualbox-ubuntu","namespace":"config"},"name":"virtualbox-ubuntu","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/v/virtualbox-ubuntu.lua","ref":"","type":0,"version":""},"xim:7zip":{"canonical_name":"xim:7zip","description":"7-Zip — a file archiver with a high compression ratio","entry_key":"xim:7zip","identity":{"name":"7zip","namespace":"xim"},"name":"7zip","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/7/7zip.lua","ref":"","type":0,"version":""},"xim:aarch64-linux-musl-gcc":{"canonical_name":"xim:aarch64-linux-musl-gcc","description":"Cross GCC toolchain: host -> aarch64-linux-musl (musl, static-capable)","entry_key":"xim:aarch64-linux-musl-gcc","identity":{"name":"aarch64-linux-musl-gcc","namespace":"xim"},"name":"aarch64-linux-musl-gcc","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/a/aarch64-linux-musl-gcc.lua","ref":"","type":0,"version":""},"xim:aria2-next":{"canonical_name":"xim:aria2-next","description":"Aria2 Next — a maintained aria2 fork with extensive bug fixes and a modernized architecture","entry_key":"xim:aria2-next","identity":{"name":"aria2-next","namespace":"xim"},"name":"aria2-next","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/a/aria2-next.lua","ref":"","type":0,"version":""},"xim:bat":{"canonical_name":"xim:bat","description":"A cat clone with syntax highlighting and Git integration","entry_key":"xim:bat","identity":{"name":"bat","namespace":"xim"},"name":"bat","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/b/bat.lua","ref":"","type":0,"version":""},"xim:binutils":{"canonical_name":"xim:binutils","description":"The GNU Binutils are a collection of binary tools","entry_key":"xim:binutils","identity":{"name":"binutils","namespace":"xim"},"name":"binutils","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/b/binutils.lua","ref":"","type":0,"version":""},"xim:brew":{"canonical_name":"xim:brew","description":"Homebrew: The Missing Package Manager for macOS (or Linux)","entry_key":"xim:brew","identity":{"name":"brew","namespace":"xim"},"name":"brew","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/b/brew.lua","ref":"","type":0,"version":""},"xim:bun":{"canonical_name":"xim:bun","description":"Bun is an all-in-one toolkit for JavaScript and TypeScript apps","entry_key":"xim:bun","identity":{"name":"bun","namespace":"xim"},"name":"bun","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/b/bun.lua","ref":"","type":0,"version":""},"xim:busybox":{"canonical_name":"xim:busybox","description":"The Swiss Army Knife of Embedded Linux — single static binary providing 400+ POSIX utilities","entry_key":"xim:busybox","identity":{"name":"busybox","namespace":"xim"},"name":"busybox","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/b/busybox.lua","ref":"","type":0,"version":""},"xim:bwrap":{"canonical_name":"xim:bwrap","description":"Bubblewrap — namespace-based sandboxing tool (setuid mode for cross-distro compat)","entry_key":"xim:bwrap","identity":{"name":"bwrap","namespace":"xim"},"name":"bwrap","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/b/bwrap.lua","ref":"","type":0,"version":""},"xim:ca-certificates":{"canonical_name":"xim:ca-certificates","description":"Mozilla CA root bundle (extracted by curl.se)","entry_key":"xim:ca-certificates","identity":{"name":"ca-certificates","namespace":"xim"},"name":"ca-certificates","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/c/ca-certificates.lua","ref":"","type":0,"version":""},"xim:cairo":{"canonical_name":"xim:cairo","description":"2D graphics library (xcb-free / headless build for manim)","entry_key":"xim:cairo","identity":{"name":"cairo","namespace":"xim"},"name":"cairo","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/c/cairo.lua","ref":"","type":0,"version":""},"xim:cc-connect":{"canonical_name":"xim:cc-connect","description":"Bridge local AI coding agents (Claude Code, Codex, Cursor, Gemini CLI, etc.) to messaging platforms (Feishu, Slack, Telegram, Discord, ...)","entry_key":"xim:cc-connect","identity":{"name":"cc-connect","namespace":"xim"},"name":"cc-connect","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/c/cc-connect.lua","ref":"","type":0,"version":""},"xim:cc-switch":{"canonical_name":"xim:cc-switch","description":"Cross-platform desktop tool for switching providers across Claude Code / Codex / OpenCode / Gemini CLI / openclaw","entry_key":"xim:cc-switch","identity":{"name":"cc-switch","namespace":"xim"},"name":"cc-switch","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/c/cc-switch.lua","ref":"","type":0,"version":""},"xim:claude":{"canonical_name":"xim:claude","description":"Claude Code CLI from Anthropic","entry_key":"xim:claude","identity":{"name":"claude","namespace":"xim"},"name":"claude","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/c/claude.lua","ref":"","type":0,"version":""},"xim:cmake":{"canonical_name":"xim:cmake","description":"A Powerful Software Build System","entry_key":"xim:cmake","identity":{"name":"cmake","namespace":"xim"},"name":"cmake","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/c/cmake.lua","ref":"","type":0,"version":""},"xim:code":{"canonical_name":"xim:code","description":"Visual Studio Code","entry_key":"xim:code","identity":{"name":"code","namespace":"xim"},"name":"code","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/c/code.lua","ref":"","type":0,"version":""},"xim:codex":{"canonical_name":"xim:codex","description":"Codex CLI from OpenAI","entry_key":"xim:codex","identity":{"name":"codex","namespace":"xim"},"name":"codex","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/c/codex.lua","ref":"","type":0,"version":""},"xim:configure-project-installer":{"canonical_name":"xim:configure-project-installer","description":"Build & Install (from source) helper tools for ./configure-based projects","entry_key":"xim:configure-project-installer","identity":{"name":"configure-project-installer","namespace":"xim"},"name":"configure-project-installer","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/c/configure-project-installer.lua","ref":"","type":1,"version":""},"xim:cpp":{"canonical_name":"xim:cpp","description":"C++ language toolchain","entry_key":"xim:cpp","identity":{"name":"cpp","namespace":"xim"},"name":"cpp","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/c/cpp.lua","ref":"","type":3,"version":""},"xim:d2x":{"canonical_name":"xim:d2x","description":"xlings's d2x tool","entry_key":"xim:d2x","identity":{"name":"d2x","namespace":"xim"},"name":"d2x","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/d/d2x.lua","ref":"","type":0,"version":""},"xim:dash":{"canonical_name":"xim:dash","description":"Debian Almquist Shell — small POSIX-compliant shell","entry_key":"xim:dash","identity":{"name":"dash","namespace":"xim"},"name":"dash","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/d/dash.lua","ref":"","type":0,"version":""},"xim:devcpp":{"canonical_name":"xim:devcpp","description":"Dev-C++: A full-featured Integrated Development Environment (IDE) for the C/C++","entry_key":"xim:devcpp","identity":{"name":"devcpp","namespace":"xim"},"name":"devcpp","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/d/devcpp.lua","ref":"","type":0,"version":""},"xim:dotnet":{"canonical_name":"xim:dotnet","description":".NET is the free, open-source, cross-platform framework","entry_key":"xim:dotnet","identity":{"name":"dotnet","namespace":"xim"},"name":"dotnet","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/d/dotnet.lua","ref":"","type":0,"version":""},"xim:e2fsprogs":{"canonical_name":"xim:e2fsprogs","description":"ext2/ext3/ext4 filesystem utilities (mke2fs, e2fsck, tune2fs, resize2fs, debugfs)","entry_key":"xim:e2fsprogs","identity":{"name":"e2fsprogs","namespace":"xim"},"name":"e2fsprogs","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/e/e2fsprogs.lua","ref":"","type":0,"version":""},"xim:elfutils":{"canonical_name":"xim:elfutils","description":"ELF object file access library — libelf, for radeonsi","entry_key":"xim:elfutils","identity":{"name":"elfutils","namespace":"xim"},"name":"elfutils","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/e/elfutils.lua","ref":"","type":0,"version":""},"xim:expat":{"canonical_name":"xim:expat","description":"Fast streaming XML parser library","entry_key":"xim:expat","identity":{"name":"expat","namespace":"xim"},"name":"expat","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/e/expat.lua","ref":"","type":0,"version":""},"xim:fd":{"canonical_name":"xim:fd","description":"Simple, fast, user-friendly alternative to find","entry_key":"xim:fd","identity":{"name":"fd","namespace":"xim"},"name":"fd","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/f/fd.lua","ref":"","type":0,"version":""},"xim:fish":{"canonical_name":"xim:fish","description":"Friendly interactive shell — smart, user-friendly, modern command-line","entry_key":"xim:fish","identity":{"name":"fish","namespace":"xim"},"name":"fish","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/f/fish.lua","ref":"","type":0,"version":""},"xim:fontconfig":{"canonical_name":"xim:fontconfig","description":"Library for configuring and customizing font access","entry_key":"xim:fontconfig","identity":{"name":"fontconfig","namespace":"xim"},"name":"fontconfig","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/f/fontconfig.lua","ref":"","type":0,"version":""},"xim:freetype":{"canonical_name":"xim:freetype","description":"A freely available software library to render fonts","entry_key":"xim:freetype","identity":{"name":"freetype","namespace":"xim"},"name":"freetype","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/f/freetype.lua","ref":"","type":0,"version":""},"xim:fribidi":{"canonical_name":"xim:fribidi","description":"Free Implementation of the Unicode Bidirectional Algorithm","entry_key":"xim:fribidi","identity":{"name":"fribidi","namespace":"xim"},"name":"fribidi","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/f/fribidi.lua","ref":"","type":0,"version":""},"xim:fzf":{"canonical_name":"xim:fzf","description":"A command-line fuzzy finder","entry_key":"xim:fzf","identity":{"name":"fzf","namespace":"xim"},"name":"fzf","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/f/fzf.lua","ref":"","type":0,"version":""},"xim:gcc":{"canonical_name":"xim:gcc","description":"GCC, the GNU Compiler Collection","entry_key":"xim:gcc","identity":{"name":"gcc","namespace":"xim"},"name":"gcc","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/g/gcc.lua","ref":"","type":0,"version":""},"xim:gcc-runtime":{"canonical_name":"xim:gcc-runtime","description":"GCC runtime libraries (libstdc++, libgcc_s, libgomp, libatomic, libitm, libquadmath, libssp) — required by virtually every C++ binary on Linux, including Clang-built ones","entry_key":"xim:gcc-runtime","identity":{"name":"gcc-runtime","namespace":"xim"},"name":"gcc-runtime","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/g/gcc-runtime.lua","ref":"","type":0,"version":""},"xim:gcc-specs-config":{"canonical_name":"xim:gcc-specs-config","description":"XScript: GCC Specs Config Tool","entry_key":"xim:gcc-specs-config","identity":{"name":"gcc-specs-config","namespace":"xim"},"name":"gcc-specs-config","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/g/gcc-specs-config.lua","ref":"","type":1,"version":""},"xim:git":{"canonical_name":"xim:git","description":"Git is a free and open source distributed version control system","entry_key":"xim:git","identity":{"name":"git","namespace":"xim"},"name":"git","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/g/git.lua","ref":"","type":0,"version":""},"xim:git-autosync":{"canonical_name":"xim:git-autosync","description":"XScript: Git AutoSync Tools","entry_key":"xim:git-autosync","identity":{"name":"git-autosync","namespace":"xim"},"name":"git-autosync","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/g/git-autosync.lua","ref":"","type":1,"version":""},"xim:github-gh":{"canonical_name":"xim:github-gh","description":"GitHub's official command line tool","entry_key":"xim:github-gh","identity":{"name":"github-gh","namespace":"xim"},"name":"github-gh","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/g/github-gh.lua","ref":"","type":0,"version":""},"xim:github-notifications-clear":{"canonical_name":"xim:github-notifications-clear","description":"Clear github's notifications (unread)","entry_key":"xim:github-notifications-clear","identity":{"name":"github-notifications-clear","namespace":"xim"},"name":"github-notifications-clear","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/g/github-notifications-clear.lua","ref":"","type":1,"version":""},"xim:glib":{"canonical_name":"xim:glib","description":"Low-level core library (GLib/GObject/GIO)","entry_key":"xim:glib","identity":{"name":"glib","namespace":"xim"},"name":"glib","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/g/glib.lua","ref":"","type":0,"version":""},"xim:glibc":{"canonical_name":"xim:glibc","description":"The GNU C Library","entry_key":"xim:glibc","identity":{"name":"glibc","namespace":"xim"},"name":"glibc","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/g/glibc.lua","ref":"","type":0,"version":""},"xim:glslang":{"canonical_name":"xim:glslang","description":"Khronos reference GLSL/ESSL front end and validator (build-time)","entry_key":"xim:glslang","identity":{"name":"glslang","namespace":"xim"},"name":"glslang","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/g/glslang.lua","ref":"","type":0,"version":""},"xim:go":{"canonical_name":"xim:go","description":"The Go programming language","entry_key":"xim:go","identity":{"name":"go","namespace":"xim"},"name":"go","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/g/go.lua","ref":"","type":0,"version":""},"xim:godot":{"canonical_name":"xim:godot","description":"Godot Engine - multi-platform 2D and 3D game engine (editor + headless export runner)","entry_key":"xim:godot","identity":{"name":"godot","namespace":"xim"},"name":"godot","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/g/godot.lua","ref":"","type":0,"version":""},"xim:graphics":{"canonical_name":"xim:graphics","description":"The xlings graphics stack: OpenGL that adapts to whatever GPU this host has","entry_key":"xim:graphics","identity":{"name":"graphics","namespace":"xim"},"name":"graphics","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/g/graphics.lua","ref":"","type":0,"version":""},"xim:griddycode":{"canonical_name":"xim:griddycode","description":"A code editor made with Godot. Code has never been more lit!","entry_key":"xim:griddycode","identity":{"name":"griddycode","namespace":"xim"},"name":"griddycode","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/g/griddycode.lua","ref":"","type":0,"version":""},"xim:harfbuzz":{"canonical_name":"xim:harfbuzz","description":"OpenType text shaping engine","entry_key":"xim:harfbuzz","identity":{"name":"harfbuzz","namespace":"xim"},"name":"harfbuzz","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/h/harfbuzz.lua","ref":"","type":0,"version":""},"xim:hermes-agent":{"canonical_name":"xim:hermes-agent","description":"The self-improving AI agent from Nous Research — creates skills from experience, improves them during use, and runs anywhere","entry_key":"xim:hermes-agent","identity":{"name":"hermes-agent","namespace":"xim"},"name":"hermes-agent","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/h/hermes-agent.lua","ref":"","type":0,"version":""},"xim:interposer-stub":{"canonical_name":"xim:interposer-stub","description":"Prebuilt empty ELF stub that elfpatch.host_link_interposer turns into an interposer","entry_key":"xim:interposer-stub","identity":{"name":"interposer-stub","namespace":"xim"},"name":"interposer-stub","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/i/interposer-stub.lua","ref":"","type":0,"version":""},"xim:jdk-corretto":{"canonical_name":"xim:jdk-corretto","description":"Amazon Corretto — a no-cost, production-ready distribution of OpenJDK (LTS)","entry_key":"xim:jdk-corretto","identity":{"name":"jdk-corretto","namespace":"xim"},"name":"jdk-corretto","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/j/jdk-corretto.lua","ref":"","type":0,"version":""},"xim:jdk-temurin":{"canonical_name":"xim:jdk-temurin","description":"Eclipse Temurin JDK 25 — a production-ready binary build of OpenJDK (LTS)","entry_key":"xim:jdk-temurin","identity":{"name":"jdk-temurin","namespace":"xim"},"name":"jdk-temurin","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/j/jdk-temurin.lua","ref":"","type":0,"version":""},"xim:jdk-zulu":{"canonical_name":"xim:jdk-zulu","description":"Azul Zulu Community — a TCK-certified, no-cost build of OpenJDK (LTS)","entry_key":"xim:jdk-zulu","identity":{"name":"jdk-zulu","namespace":"xim"},"name":"jdk-zulu","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/j/jdk-zulu.lua","ref":"","type":0,"version":""},"xim:jetbrainsmono-nerd-font":{"canonical_name":"xim:jetbrainsmono-nerd-font","description":"JetBrainsMono Nerd Font patched with terminal icons and glyphs","entry_key":"xim:jetbrainsmono-nerd-font","identity":{"name":"jetbrainsmono-nerd-font","namespace":"xim"},"name":"jetbrainsmono-nerd-font","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/j/jetbrainsmono-nerd-font.lua","ref":"","type":0,"version":""},"xim:jq":{"canonical_name":"xim:jq","description":"Command-line JSON processor","entry_key":"xim:jq","identity":{"name":"jq","namespace":"xim"},"name":"jq","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/j/jq.lua","ref":"","type":0,"version":""},"xim:khistory":{"canonical_name":"xim:khistory","description":"An elegant keyboard/gamepad key detection and visualization tool","entry_key":"xim:khistory","identity":{"name":"khistory","namespace":"xim"},"name":"khistory","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/k/khistory.lua","ref":"","type":0,"version":""},"xim:libX11":{"canonical_name":"xim:libX11","description":"Core X11 client library","entry_key":"xim:libX11","identity":{"name":"libX11","namespace":"xim"},"name":"libX11","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/l/libX11.lua","ref":"","type":0,"version":""},"xim:libXau":{"canonical_name":"xim:libXau","description":"X11 authorisation protocol library","entry_key":"xim:libXau","identity":{"name":"libXau","namespace":"xim"},"name":"libXau","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/l/libXau.lua","ref":"","type":0,"version":""},"xim:libXcursor":{"canonical_name":"xim:libXcursor","description":"X cursor management library","entry_key":"xim:libXcursor","identity":{"name":"libXcursor","namespace":"xim"},"name":"libXcursor","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/l/libXcursor.lua","ref":"","type":0,"version":""},"xim:libXdmcp":{"canonical_name":"xim:libXdmcp","description":"X Display Manager Control Protocol library","entry_key":"xim:libXdmcp","identity":{"name":"libXdmcp","namespace":"xim"},"name":"libXdmcp","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/l/libXdmcp.lua","ref":"","type":0,"version":""},"xim:libXext":{"canonical_name":"xim:libXext","description":"X11 miscellaneous extensions library","entry_key":"xim:libXext","identity":{"name":"libXext","namespace":"xim"},"name":"libXext","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/l/libXext.lua","ref":"","type":0,"version":""},"xim:libXfixes":{"canonical_name":"xim:libXfixes","description":"X Fixes extension client library","entry_key":"xim:libXfixes","identity":{"name":"libXfixes","namespace":"xim"},"name":"libXfixes","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/l/libXfixes.lua","ref":"","type":0,"version":""},"xim:libXi":{"canonical_name":"xim:libXi","description":"X Input Extension client library","entry_key":"xim:libXi","identity":{"name":"libXi","namespace":"xim"},"name":"libXi","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/l/libXi.lua","ref":"","type":0,"version":""},"xim:libXrandr":{"canonical_name":"xim:libXrandr","description":"X Resize, Rotate and Reflect extension library","entry_key":"xim:libXrandr","identity":{"name":"libXrandr","namespace":"xim"},"name":"libXrandr","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/l/libXrandr.lua","ref":"","type":0,"version":""},"xim:libXrender":{"canonical_name":"xim:libXrender","description":"X Rendering Extension client library","entry_key":"xim:libXrender","identity":{"name":"libXrender","namespace":"xim"},"name":"libXrender","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/l/libXrender.lua","ref":"","type":0,"version":""},"xim:libXxf86vm":{"canonical_name":"xim:libXxf86vm","description":"X11 XFree86 video mode extension library","entry_key":"xim:libXxf86vm","identity":{"name":"libXxf86vm","namespace":"xim"},"name":"libXxf86vm","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/l/libXxf86vm.lua","ref":"","type":0,"version":""},"xim:libcuda-host-link":{"canonical_name":"xim:libcuda-host-link","description":"Sentinel: stable symlink to host's libcuda.so.1 (NVIDIA driver userspace lib)","entry_key":"xim:libcuda-host-link","identity":{"name":"libcuda-host-link","namespace":"xim"},"name":"libcuda-host-link","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/l/libcuda-host-link.lua","ref":"","type":0,"version":""},"xim:libdrm":{"canonical_name":"xim:libdrm","description":"Userspace interface to the kernel DRM services","entry_key":"xim:libdrm","identity":{"name":"libdrm","namespace":"xim"},"name":"libdrm","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/l/libdrm.lua","ref":"","type":0,"version":""},"xim:libffi":{"canonical_name":"xim:libffi","description":"Portable foreign-function interface library","entry_key":"xim:libffi","identity":{"name":"libffi","namespace":"xim"},"name":"libffi","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/l/libffi.lua","ref":"","type":0,"version":""},"xim:libglvnd":{"canonical_name":"xim:libglvnd","description":"The GL Vendor-Neutral Dispatch library","entry_key":"xim:libglvnd","identity":{"name":"libglvnd","namespace":"xim"},"name":"libglvnd","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/l/libglvnd.lua","ref":"","type":0,"version":""},"xim:libllvm":{"canonical_name":"xim:libllvm","description":"LLVM as a shared library — the code generator mesa's llvmpipe and radeonsi use","entry_key":"xim:libllvm","identity":{"name":"libllvm","namespace":"xim"},"name":"libllvm","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/l/libllvm.lua","ref":"","type":0,"version":""},"xim:libpciaccess":{"canonical_name":"xim:libpciaccess","description":"Generic PCI device access library","entry_key":"xim:libpciaccess","identity":{"name":"libpciaccess","namespace":"xim"},"name":"libpciaccess","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/l/libpciaccess.lua","ref":"","type":0,"version":""},"xim:libpng":{"canonical_name":"xim:libpng","description":"Official PNG reference library","entry_key":"xim:libpng","identity":{"name":"libpng","namespace":"xim"},"name":"libpng","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/l/libpng.lua","ref":"","type":0,"version":""},"xim:libxcb":{"canonical_name":"xim:libxcb","description":"X protocol C-language Binding","entry_key":"xim:libxcb","identity":{"name":"libxcb","namespace":"xim"},"name":"libxcb","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/l/libxcb.lua","ref":"","type":0,"version":""},"xim:libxkbcommon":{"canonical_name":"xim:libxkbcommon","description":"Keymap handling library for Wayland and X11 clients","entry_key":"xim:libxkbcommon","identity":{"name":"libxkbcommon","namespace":"xim"},"name":"libxkbcommon","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/l/libxkbcommon.lua","ref":"","type":0,"version":""},"xim:libxml2":{"canonical_name":"xim:libxml2","description":"XML C parser and toolkit","entry_key":"xim:libxml2","identity":{"name":"libxml2","namespace":"xim"},"name":"libxml2","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/l/libxml2.lua","ref":"","type":0,"version":""},"xim:libxshmfence":{"canonical_name":"xim:libxshmfence","description":"Shared-memory fences for DRI3","entry_key":"xim:libxshmfence","identity":{"name":"libxshmfence","namespace":"xim"},"name":"libxshmfence","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/l/libxshmfence.lua","ref":"","type":0,"version":""},"xim:linux-headers":{"canonical_name":"xim:linux-headers","description":"Linux Kernel Headers (prebuilt)","entry_key":"xim:linux-headers","identity":{"name":"linux-headers","namespace":"xim"},"name":"linux-headers","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/l/linux-headers.lua","ref":"","type":0,"version":""},"xim:linux-sysroot-create":{"canonical_name":"xim:linux-sysroot-create","description":"XScript: Linux Sysroot Create Tool","entry_key":"xim:linux-sysroot-create","identity":{"name":"linux-sysroot-create","namespace":"xim"},"name":"linux-sysroot-create","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/l/linux-sysroot-create.lua","ref":"","type":1,"version":""},"xim:llvm":{"canonical_name":"xim:llvm","description":"LLVM compiler infrastructure and toolchain","entry_key":"xim:llvm","identity":{"name":"llvm","namespace":"xim"},"name":"llvm","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/l/llvm.lua","ref":"","type":0,"version":""},"xim:llvm-tools":{"canonical_name":"xim:llvm-tools","description":"LLVM development tools (clang-format, clang-tidy, clangd)","entry_key":"xim:llvm-tools","identity":{"name":"llvm-tools","namespace":"xim"},"name":"llvm-tools","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/l/llvm-tools.lua","ref":"","type":0,"version":""},"xim:make":{"canonical_name":"xim:make","description":"GNU Make — tool which controls the generation of executables from source files","entry_key":"xim:make","identity":{"name":"make","namespace":"xim"},"name":"make","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/m/make.lua","ref":"","type":0,"version":""},"xim:mcpp":{"canonical_name":"xim:mcpp","description":"A modern C++ build tool with module support, dependency/toolchain management, package indexing, and packaging","entry_key":"xim:mcpp","identity":{"name":"mcpp","namespace":"xim"},"name":"mcpp","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/m/mcpp.lua","ref":"","type":0,"version":""},"xim:mcpp-short-cmd":{"canonical_name":"xim:mcpp-short-cmd","description":"Short command aliases for mcpp (mp/mbuild/mrun/mtest/...)","entry_key":"xim:mcpp-short-cmd","identity":{"name":"mcpp-short-cmd","namespace":"xim"},"name":"mcpp-short-cmd","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/m/mcpp-short-cmd.lua","ref":"","type":0,"version":""},"xim:mdbook":{"canonical_name":"xim:mdbook","description":"Create book from markdown files. Like Gitbook but implemented in Rust","entry_key":"xim:mdbook","identity":{"name":"mdbook","namespace":"xim"},"name":"mdbook","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/m/mdbook.lua","ref":"","type":0,"version":""},"xim:media-crawler":{"canonical_name":"xim:media-crawler","description":"Multi-platform social media crawler (XHS, Douyin, Kuaishou, Bilibili, Weibo, Tieba, Zhihu) using Playwright","entry_key":"xim:media-crawler","identity":{"name":"media-crawler","namespace":"xim"},"name":"media-crawler","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/m/media-crawler.lua","ref":"","type":0,"version":""},"xim:mesa":{"canonical_name":"xim:mesa","description":"Mesa 3D — OpenGL and Vulkan: llvmpipe, radeonsi, nouveau, zink, RADV","entry_key":"xim:mesa","identity":{"name":"mesa","namespace":"xim"},"name":"mesa","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/m/mesa.lua","ref":"","type":0,"version":""},"xim:mingw-cross-gcc":{"canonical_name":"xim:mingw-cross-gcc","description":"MinGW-w64 GCC cross toolchain (Linux host → Windows x86_64 PE, MSVCRT runtime)","entry_key":"xim:mingw-cross-gcc","identity":{"name":"mingw-cross-gcc","namespace":"xim"},"name":"mingw-cross-gcc","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/m/mingw-cross-gcc.lua","ref":"","type":0,"version":""},"xim:mingw-gcc":{"canonical_name":"xim:mingw-gcc","description":"MinGW-w64 GCC for Windows (winlibs standalone build, UCRT runtime)","entry_key":"xim:mingw-gcc","identity":{"name":"mingw-gcc","namespace":"xim"},"name":"mingw-gcc","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/m/mingw-gcc.lua","ref":"","type":0,"version":""},"xim:mingw-w64":{"canonical_name":"xim:mingw-w64","description":"A complete runtime environment for GCC & LLVM for Windows","entry_key":"xim:mingw-w64","identity":{"name":"mingw-w64","namespace":"xim"},"name":"mingw-w64","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/m/mingw-w64.lua","ref":"","type":0,"version":""},"xim:msvc":{"canonical_name":"xim:msvc","description":"Microsoft Visual Studio C++ Compiler","entry_key":"xim:msvc","identity":{"name":"msvc","namespace":"xim"},"name":"msvc","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/m/msvc.lua","ref":"","type":3,"version":""},"xim:musl":{"canonical_name":"xim:musl","description":"musl - a lightweight, fast, simple, free, standards-conformant C library","entry_key":"xim:musl","identity":{"name":"musl","namespace":"xim"},"name":"musl","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/m/musl.lua","ref":"","type":0,"version":""},"xim:musl-cross-make":{"canonical_name":"xim:musl-cross-make","description":"Simple makefile-based build for musl cross compiler","entry_key":"xim:musl-cross-make","identity":{"name":"musl-cross-make","namespace":"xim"},"name":"musl-cross-make","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/m/musl-cross-make.lua","ref":"","type":1,"version":""},"xim:musl-gcc":{"canonical_name":"xim:musl-gcc","description":"GCC, the GNU Compiler Collection (prebuilt with musl)","entry_key":"xim:musl-gcc","identity":{"name":"musl-gcc","namespace":"xim"},"name":"musl-gcc","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/m/musl-gcc.lua","ref":"","type":0,"version":""},"xim:nasm":{"canonical_name":"xim:nasm","description":"NASM - the Netwide Assembler, an assembler targeting the x86/x86-64 CPU family","entry_key":"xim:nasm","identity":{"name":"nasm","namespace":"xim"},"name":"nasm","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/n/nasm.lua","ref":"","type":0,"version":""},"xim:ninja":{"canonical_name":"xim:ninja","description":"a small build system with a focus on speed","entry_key":"xim:ninja","identity":{"name":"ninja","namespace":"xim"},"name":"ninja","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/n/ninja.lua","ref":"","type":0,"version":""},"xim:node":{"canonical_name":"xim:node","description":"Node.js is a JavaScript runtime built on Chrome's V8 JavaScript engine","entry_key":"xim:node","identity":{"name":"node","namespace":"xim"},"name":"node","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/n/node.lua","ref":"","type":0,"version":""},"xim:npm":{"canonical_name":"xim:npm","description":"The package manager for JavaScript","entry_key":"xim:npm","identity":{"name":"npm","namespace":"xim"},"name":"npm","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/n/npm.lua","ref":"","type":0,"version":""},"xim:nvidia-gl-host-link":{"canonical_name":"xim:nvidia-gl-host-link","description":"Sentinel: stable symlinks to the host's NVIDIA proprietary GL/EGL userspace","entry_key":"xim:nvidia-gl-host-link","identity":{"name":"nvidia-gl-host-link","namespace":"xim"},"name":"nvidia-gl-host-link","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/n/nvidia-gl-host-link.lua","ref":"","type":0,"version":""},"xim:nvim":{"canonical_name":"xim:nvim","description":"Vim-fork focused on extensibility and usability","entry_key":"xim:nvim","identity":{"name":"nvim","namespace":"xim"},"name":"nvim","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/n/nvim.lua","ref":"","type":0,"version":""},"xim:nvm":{"canonical_name":"xim:nvm","description":"Node Version Manager - POSIX-compliant node.js version manager","entry_key":"xim:nvm","identity":{"name":"nvm","namespace":"xim"},"name":"nvm","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/n/nvm.lua","ref":"","type":0,"version":""},"xim:ollama":{"canonical_name":"xim:ollama","description":"Get up and running with large language models locally","entry_key":"xim:ollama","identity":{"name":"ollama","namespace":"xim"},"name":"ollama","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/o/ollama.lua","ref":"","type":0,"version":""},"xim:openclaw":{"canonical_name":"xim:openclaw","description":"OpenClaw CLI","entry_key":"xim:openclaw","identity":{"name":"openclaw","namespace":"xim"},"name":"openclaw","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/o/openclaw.lua","ref":"","type":0,"version":""},"xim:openssl":{"canonical_name":"xim:openssl","description":"TLS/SSL and cryptography toolkit","entry_key":"xim:openssl","identity":{"name":"openssl","namespace":"xim"},"name":"openssl","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/o/openssl.lua","ref":"","type":0,"version":""},"xim:pango":{"canonical_name":"xim:pango","description":"Library for layout and rendering of internationalized text","entry_key":"xim:pango","identity":{"name":"pango","namespace":"xim"},"name":"pango","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/p/pango.lua","ref":"","type":0,"version":""},"xim:patchelf":{"canonical_name":"xim:patchelf","description":"ELF patch tool for interpreter and RPATH","entry_key":"xim:patchelf","identity":{"name":"patchelf","namespace":"xim"},"name":"patchelf","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/p/patchelf.lua","ref":"","type":0,"version":""},"xim:pcre2":{"canonical_name":"xim:pcre2","description":"Perl Compatible Regular Expressions (v2)","entry_key":"xim:pcre2","identity":{"name":"pcre2","namespace":"xim"},"name":"pcre2","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/p/pcre2.lua","ref":"","type":0,"version":""},"xim:perl":{"canonical_name":"xim:perl","description":"Perl — a complete, relocatable Perl 5 interpreter with the full core module set","entry_key":"xim:perl","identity":{"name":"perl","namespace":"xim"},"name":"perl","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/p/perl.lua","ref":"","type":0,"version":""},"xim:pixman":{"canonical_name":"xim:pixman","description":"Low-level pixel manipulation library (cairo backend)","entry_key":"xim:pixman","identity":{"name":"pixman","namespace":"xim"},"name":"pixman","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/p/pixman.lua","ref":"","type":0,"version":""},"xim:pnpm":{"canonical_name":"xim:pnpm","description":"Fast, disk space efficient package manager","entry_key":"xim:pnpm","identity":{"name":"pnpm","namespace":"xim"},"name":"pnpm","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/p/pnpm.lua","ref":"","type":0,"version":""},"xim:project-graph":{"canonical_name":"xim:project-graph","description":"快速绘制节点图的桌面工具 - 项目进程拓扑图绘制、头脑风暴草稿","entry_key":"xim:project-graph","identity":{"name":"project-graph","namespace":"xim"},"name":"project-graph","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/p/project-graph.lua","ref":"","type":0,"version":""},"xim:proot":{"canonical_name":"xim:proot","description":"Userspace chroot, mount --bind, and binfmt_misc — no root required","entry_key":"xim:proot","identity":{"name":"proot","namespace":"xim"},"name":"proot","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/p/proot.lua","ref":"","type":0,"version":""},"xim:python":{"canonical_name":"xim:python","description":"The Python programming language","entry_key":"xim:python","identity":{"name":"python","namespace":"xim"},"name":"python","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/p/python.lua","ref":"","type":0,"version":""},"xim:ripgrep":{"canonical_name":"xim:ripgrep","description":"Fast, recursive grep that respects .gitignore","entry_key":"xim:ripgrep","identity":{"name":"ripgrep","namespace":"xim"},"name":"ripgrep","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/r/ripgrep.lua","ref":"","type":0,"version":""},"xim:ros2-jazzy-ubnutu":{"canonical_name":"xim:ros2-jazzy-ubnutu","description":"Config: one-click ROS 2 Jazzy Jalisco setup for Ubuntu 24.04","entry_key":"xim:ros2-jazzy-ubnutu","identity":{"name":"ros2-jazzy-ubnutu","namespace":"xim"},"name":"ros2-jazzy-ubnutu","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/r/ros2-jazzy-ubuntu.lua","ref":"","type":3,"version":""},"xim:rosdep":{"canonical_name":"xim:rosdep","description":"ROS dependency management tool","entry_key":"xim:rosdep","identity":{"name":"rosdep","namespace":"xim"},"name":"rosdep","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/r/rosdep.lua","ref":"","type":0,"version":""},"xim:rust":{"canonical_name":"xim:rust","description":"A language empowering everyone to build reliable and efficient software","entry_key":"xim:rust","identity":{"name":"rust","namespace":"xim"},"name":"rust","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/r/rust.lua","ref":"","type":0,"version":""},"xim:rustup":{"canonical_name":"xim:rustup","description":"An installer init tool for Rustup, the Rust toolchain installer","entry_key":"xim:rustup","identity":{"name":"rustup","namespace":"xim"},"name":"rustup","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/r/rustup.lua","ref":"","type":0,"version":""},"xim:seeme-report":{"canonical_name":"xim:seeme-report","description":"让别人知道你在干什么 seeme report端","entry_key":"xim:seeme-report","identity":{"name":"seeme-report","namespace":"xim"},"name":"seeme-report","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/s/seeme-report.lua","ref":"","type":0,"version":""},"xim:seeme-server":{"canonical_name":"xim:seeme-server","description":"让别人知道你在干什么 seeme 服务端","entry_key":"xim:seeme-server","identity":{"name":"seeme-server","namespace":"xim"},"name":"seeme-server","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/s/seeme-server.lua","ref":"","type":0,"version":""},"xim:shortcut-tool":{"canonical_name":"xim:shortcut-tool","description":"Shortcut Tool: Create and manage shortcuts easily","entry_key":"xim:shortcut-tool","identity":{"name":"shortcut-tool","namespace":"xim"},"name":"shortcut-tool","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/s/shortcut-tool.lua","ref":"","type":1,"version":""},"xim:sing-box":{"canonical_name":"xim:sing-box","description":"The universal proxy platform","entry_key":"xim:sing-box","identity":{"name":"sing-box","namespace":"xim"},"name":"sing-box","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/s/sing-box.lua","ref":"","type":0,"version":""},"xim:sing-box-helper":{"canonical_name":"xim:sing-box-helper","description":"Sing-Box Helper Tools - Simple commands for server and client configuration","entry_key":"xim:sing-box-helper","identity":{"name":"sing-box-helper","namespace":"xim"},"name":"sing-box-helper","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/s/sing-box-helper.lua","ref":"","type":1,"version":""},"xim:sourcetrail":{"canonical_name":"xim:sourcetrail","description":"Sourcetrail - free and open-source interactive source explorer","entry_key":"xim:sourcetrail","identity":{"name":"sourcetrail","namespace":"xim"},"name":"sourcetrail","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/s/sourcetrail.lua","ref":"","type":0,"version":""},"xim:syslinux":{"canonical_name":"xim:syslinux","description":"SYSLINUX bootloader collection (isolinux, pxelinux, extlinux + EFI loaders)","entry_key":"xim:syslinux","identity":{"name":"syslinux","namespace":"xim"},"name":"syslinux","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/s/syslinux.lua","ref":"","type":0,"version":""},"xim:trendradar":{"canonical_name":"xim:trendradar","description":"AI-driven public opinion and trend monitor with multi-platform aggregation, RSS, and smart alerts","entry_key":"xim:trendradar","identity":{"name":"trendradar","namespace":"xim"},"name":"trendradar","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/t/trendradar.lua","ref":"","type":0,"version":""},"xim:uv":{"canonical_name":"xim:uv","description":"An extremely fast Python package and project manager (Astral)","entry_key":"xim:uv","identity":{"name":"uv","namespace":"xim"},"name":"uv","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/u/uv.lua","ref":"","type":0,"version":""},"xim:vc6":{"canonical_name":"xim:vc6","description":"Visual C++ 6.0: Classic C/C++ IDE (portable for Windows 10/11)","entry_key":"xim:vc6","identity":{"name":"vc6","namespace":"xim"},"name":"vc6","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/v/vc6.lua","ref":"","type":0,"version":""},"xim:vcstool":{"canonical_name":"xim:vcstool","description":"Version control system tool for multiple repos (ROS vcstool)","entry_key":"xim:vcstool","identity":{"name":"vcstool","namespace":"xim"},"name":"vcstool","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/v/vcstool.lua","ref":"","type":0,"version":""},"xim:vim":{"canonical_name":"xim:vim","description":"The classic Vi IMproved text editor (statically linked, hermetic)","entry_key":"xim:vim","identity":{"name":"vim","namespace":"xim"},"name":"vim","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/v/vim.lua","ref":"","type":0,"version":""},"xim:virtualbox":{"canonical_name":"xim:virtualbox","description":"Oracle VM VirtualBox userspace + VBoxManage CLI (portable, alias: vbox)","entry_key":"xim:virtualbox","identity":{"name":"virtualbox","namespace":"xim"},"name":"virtualbox","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/v/virtualbox.lua","ref":"","type":0,"version":""},"xim:vs-buildtools":{"canonical_name":"xim:vs-buildtools","description":"Visual Studio Build Tools","entry_key":"xim:vs-buildtools","identity":{"name":"vs-buildtools","namespace":"xim"},"name":"vs-buildtools","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/v/vs-buildtools.lua","ref":"","type":3,"version":""},"xim:wayland":{"canonical_name":"xim:wayland","description":"Wayland protocol library and scanner","entry_key":"xim:wayland","identity":{"name":"wayland","namespace":"xim"},"name":"wayland","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/w/wayland.lua","ref":"","type":0,"version":""},"xim:wayland-protocols":{"canonical_name":"xim:wayland-protocols","description":"Wayland protocol extension definitions (build-time)","entry_key":"xim:wayland-protocols","identity":{"name":"wayland-protocols","namespace":"xim"},"name":"wayland-protocols","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/w/wayland-protocols.lua","ref":"","type":0,"version":""},"xim:windows-acp":{"canonical_name":"xim:windows-acp","description":"ACP: Beta: Use Unicode UTF-8 for worldwide language support","entry_key":"xim:windows-acp","identity":{"name":"windows-acp","namespace":"xim"},"name":"windows-acp","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/w/windows-acp.lua","ref":"","type":0,"version":""},"xim:wsl-gl-host-link":{"canonical_name":"xim:wsl-gl-host-link","description":"Sentinel: links WSL2's host D3D12/DXCore userspace so mesa's d3d12 driver can reach the Windows GPU","entry_key":"xim:wsl-gl-host-link","identity":{"name":"wsl-gl-host-link","namespace":"xim"},"name":"wsl-gl-host-link","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/w/wsl-gl-host-link.lua","ref":"","type":0,"version":""},"xim:wsl-ubuntu":{"canonical_name":"xim:wsl-ubuntu","description":"Windows Subsystem for Linux (WSL) Ubuntu","entry_key":"xim:wsl-ubuntu","identity":{"name":"wsl-ubuntu","namespace":"xim"},"name":"wsl-ubuntu","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/w/wsl-ubuntu.lua","ref":"","type":3,"version":""},"xim:x86_64-linux-musl-gcc":{"canonical_name":"xim:x86_64-linux-musl-gcc","description":"GCC cross toolchain targeting x86_64-linux-musl (musl, fully static ELF)","entry_key":"xim:x86_64-linux-musl-gcc","identity":{"name":"x86_64-linux-musl-gcc","namespace":"xim"},"name":"x86_64-linux-musl-gcc","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/x/x86_64-linux-musl-gcc.lua","ref":"","type":0,"version":""},"xim:xcb-proto":{"canonical_name":"xim:xcb-proto","description":"XML-XCB protocol descriptions (build-time)","entry_key":"xim:xcb-proto","identity":{"name":"xcb-proto","namespace":"xim"},"name":"xcb-proto","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/x/xcb-proto.lua","ref":"","type":0,"version":""},"xim:xlings":{"canonical_name":"xim:xlings","description":"Xlings | Highly abstract [ package manager ] - \"Multi-version management + Everything can be a package\"","entry_key":"xim:xlings","identity":{"name":"xlings","namespace":"xim"},"name":"xlings","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/x/xlings.lua","ref":"","type":0,"version":""},"xim:xlings-project-templates":{"canonical_name":"xim:xlings-project-templates","description":"Xlings - Project Templates","entry_key":"xim:xlings-project-templates","identity":{"name":"xlings-project-templates","namespace":"xim"},"name":"xlings-project-templates","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/x/xlings-project-templates.lua","ref":"","type":2,"version":""},"xim:xmake":{"canonical_name":"xim:xmake","description":"A cross-platform build utility based on Lua","entry_key":"xim:xmake","identity":{"name":"xmake","namespace":"xim"},"name":"xmake","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/x/xmake.lua","ref":"","type":0,"version":""},"xim:xorgproto":{"canonical_name":"xim:xorgproto","description":"X Window System protocol headers (build-time)","entry_key":"xim:xorgproto","identity":{"name":"xorgproto","namespace":"xim"},"name":"xorgproto","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/x/xorgproto.lua","ref":"","type":0,"version":""},"xim:xpkg-helper":{"canonical_name":"xim:xpkg-helper","description":"XPKG: XPackage Helper Tools","entry_key":"xim:xpkg-helper","identity":{"name":"xpkg-helper","namespace":"xim"},"name":"xpkg-helper","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/x/xpkg-helper.lua","ref":"","type":1,"version":""},"xim:xtrans":{"canonical_name":"xim:xtrans","description":"X transport layer macros and headers (build-time)","entry_key":"xim:xtrans","identity":{"name":"xtrans","namespace":"xim"},"name":"xtrans","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/x/xtrans.lua","ref":"","type":0,"version":""},"xim:xvm":{"canonical_name":"xim:xvm","description":"a simple and generic version management tool","entry_key":"xim:xvm","identity":{"name":"xvm","namespace":"xim"},"name":"xvm","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/x/xvm.lua","ref":"","type":0,"version":""},"xim:xvm-sysdetect":{"canonical_name":"xim:xvm-sysdetect","description":"XVM - System Package Detect Tools","entry_key":"xim:xvm-sysdetect","identity":{"name":"xvm-sysdetect","namespace":"xim"},"name":"xvm-sysdetect","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/x/xvm-sysdetect.lua","ref":"","type":3,"version":""},"xim:yazi":{"canonical_name":"xim:yazi","description":"Blazing fast terminal file manager written in Rust, based on async I/O","entry_key":"xim:yazi","identity":{"name":"yazi","namespace":"xim"},"name":"yazi","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/y/yazi.lua","ref":"","type":0,"version":""},"xim:zlib":{"canonical_name":"xim:zlib","description":"A massively spiffy yet delicately unobtrusive compression library","entry_key":"xim:zlib","identity":{"name":"zlib","namespace":"xim"},"name":"zlib","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/z/zlib.lua","ref":"","type":0,"version":""},"xim:zoxide":{"canonical_name":"xim:zoxide","description":"A smarter cd command — jump to your most-used directories","entry_key":"xim:zoxide","identity":{"name":"zoxide","namespace":"xim"},"name":"zoxide","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/z/zoxide.lua","ref":"","type":0,"version":""}},"mutex_groups":{},"repo_head_hash":"c38171504061b58e4b064004bf9b69ac78a66f6c","version":2} \ No newline at end of file +{"default_namespace":"xim","entries":{"config:claude-llm":{"canonical_name":"config:claude-llm","description":"Configure Claude Code to use DeepSeek Anthropic-compatible API","entry_key":"config:claude-llm","identity":{"name":"claude-llm","namespace":"config"},"name":"claude-llm","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/c/claude-llm.lua","ref":"","type":3,"version":""},"config:fontconfig-user-moyingji":{"canonical_name":"config:fontconfig-user-moyingji","description":"Basic user configuration for Linux Fontconfig written by MoYingJi","entry_key":"config:fontconfig-user-moyingji","identity":{"name":"fontconfig-user-moyingji","namespace":"config"},"name":"fontconfig-user-moyingji","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/f/fontconfig-user-moyingji.lua","ref":"","type":3,"version":""},"config:gitcode-hosts":{"canonical_name":"config:gitcode-hosts","description":"Config gitcode.com ip mapping-groups to hosts file","entry_key":"config:gitcode-hosts","identity":{"name":"gitcode-hosts","namespace":"config"},"name":"gitcode-hosts","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/g/gitcode-hosts.lua","ref":"","type":3,"version":""},"config:mcpp-vscode-clangd":{"canonical_name":"config:mcpp-vscode-clangd","description":"Configure VSCode clangd support for mcpp LLVM projects","entry_key":"config:mcpp-vscode-clangd","identity":{"name":"mcpp-vscode-clangd","namespace":"config"},"name":"mcpp-vscode-clangd","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/m/mcpp-vscode-clangd.lua","ref":"","type":3,"version":""},"config:powershell-execpolicy":{"canonical_name":"config:powershell-execpolicy","description":"fix execution policy issue when open Powershell(load .ps1 file)","entry_key":"config:powershell-execpolicy","identity":{"name":"powershell-execpolicy","namespace":"config"},"name":"powershell-execpolicy","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/p/powershell-execpolicy.lua","ref":"","type":0,"version":""},"config:rust-crates-mirror":{"canonical_name":"config:rust-crates-mirror","description":"Config Index Mirror for Rust Crates (Cargo)","entry_key":"config:rust-crates-mirror","identity":{"name":"rust-crates-mirror","namespace":"config"},"name":"rust-crates-mirror","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/r/rust-crates-mirror.lua","ref":"","type":3,"version":""},"config:rustup-mirror":{"canonical_name":"config:rustup-mirror","description":"Config Mirror for Rustup","entry_key":"config:rustup-mirror","identity":{"name":"rustup-mirror","namespace":"config"},"name":"rustup-mirror","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/r/rustup-mirror.lua","ref":"","type":3,"version":""},"config:virtualbox-ubuntu":{"canonical_name":"config:virtualbox-ubuntu","description":"Provision a ready-to-use Ubuntu 24.04 VM in VirtualBox (unattended install)","entry_key":"config:virtualbox-ubuntu","identity":{"name":"virtualbox-ubuntu","namespace":"config"},"name":"virtualbox-ubuntu","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/v/virtualbox-ubuntu.lua","ref":"","type":0,"version":""},"xim:7zip":{"canonical_name":"xim:7zip","description":"7-Zip — a file archiver with a high compression ratio","entry_key":"xim:7zip","identity":{"name":"7zip","namespace":"xim"},"name":"7zip","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/7/7zip.lua","ref":"","type":0,"version":""},"xim:aarch64-linux-musl-gcc":{"canonical_name":"xim:aarch64-linux-musl-gcc","description":"Cross GCC toolchain: host -> aarch64-linux-musl (musl, static-capable)","entry_key":"xim:aarch64-linux-musl-gcc","identity":{"name":"aarch64-linux-musl-gcc","namespace":"xim"},"name":"aarch64-linux-musl-gcc","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/a/aarch64-linux-musl-gcc.lua","ref":"","type":0,"version":""},"xim:aria2-next":{"canonical_name":"xim:aria2-next","description":"Aria2 Next — a maintained aria2 fork with extensive bug fixes and a modernized architecture","entry_key":"xim:aria2-next","identity":{"name":"aria2-next","namespace":"xim"},"name":"aria2-next","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/a/aria2-next.lua","ref":"","type":0,"version":""},"xim:bat":{"canonical_name":"xim:bat","description":"A cat clone with syntax highlighting and Git integration","entry_key":"xim:bat","identity":{"name":"bat","namespace":"xim"},"name":"bat","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/b/bat.lua","ref":"","type":0,"version":""},"xim:binutils":{"canonical_name":"xim:binutils","description":"The GNU Binutils are a collection of binary tools","entry_key":"xim:binutils","identity":{"name":"binutils","namespace":"xim"},"name":"binutils","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/b/binutils.lua","ref":"","type":0,"version":""},"xim:brew":{"canonical_name":"xim:brew","description":"Homebrew: The Missing Package Manager for macOS (or Linux)","entry_key":"xim:brew","identity":{"name":"brew","namespace":"xim"},"name":"brew","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/b/brew.lua","ref":"","type":0,"version":""},"xim:bun":{"canonical_name":"xim:bun","description":"Bun is an all-in-one toolkit for JavaScript and TypeScript apps","entry_key":"xim:bun","identity":{"name":"bun","namespace":"xim"},"name":"bun","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/b/bun.lua","ref":"","type":0,"version":""},"xim:busybox":{"canonical_name":"xim:busybox","description":"The Swiss Army Knife of Embedded Linux — single static binary providing 400+ POSIX utilities","entry_key":"xim:busybox","identity":{"name":"busybox","namespace":"xim"},"name":"busybox","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/b/busybox.lua","ref":"","type":0,"version":""},"xim:bwrap":{"canonical_name":"xim:bwrap","description":"Bubblewrap — namespace-based sandboxing tool (setuid mode for cross-distro compat)","entry_key":"xim:bwrap","identity":{"name":"bwrap","namespace":"xim"},"name":"bwrap","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/b/bwrap.lua","ref":"","type":0,"version":""},"xim:ca-certificates":{"canonical_name":"xim:ca-certificates","description":"Mozilla CA root bundle (extracted by curl.se)","entry_key":"xim:ca-certificates","identity":{"name":"ca-certificates","namespace":"xim"},"name":"ca-certificates","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/c/ca-certificates.lua","ref":"","type":0,"version":""},"xim:cairo":{"canonical_name":"xim:cairo","description":"2D graphics library (xcb-free / headless build for manim)","entry_key":"xim:cairo","identity":{"name":"cairo","namespace":"xim"},"name":"cairo","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/c/cairo.lua","ref":"","type":0,"version":""},"xim:cc-connect":{"canonical_name":"xim:cc-connect","description":"Bridge local AI coding agents (Claude Code, Codex, Cursor, Gemini CLI, etc.) to messaging platforms (Feishu, Slack, Telegram, Discord, ...)","entry_key":"xim:cc-connect","identity":{"name":"cc-connect","namespace":"xim"},"name":"cc-connect","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/c/cc-connect.lua","ref":"","type":0,"version":""},"xim:cc-switch":{"canonical_name":"xim:cc-switch","description":"Cross-platform desktop tool for switching providers across Claude Code / Codex / OpenCode / Gemini CLI / openclaw","entry_key":"xim:cc-switch","identity":{"name":"cc-switch","namespace":"xim"},"name":"cc-switch","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/c/cc-switch.lua","ref":"","type":0,"version":""},"xim:claude":{"canonical_name":"xim:claude","description":"Claude Code CLI from Anthropic","entry_key":"xim:claude","identity":{"name":"claude","namespace":"xim"},"name":"claude","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/c/claude.lua","ref":"","type":0,"version":""},"xim:cmake":{"canonical_name":"xim:cmake","description":"A Powerful Software Build System","entry_key":"xim:cmake","identity":{"name":"cmake","namespace":"xim"},"name":"cmake","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/c/cmake.lua","ref":"","type":0,"version":""},"xim:code":{"canonical_name":"xim:code","description":"Visual Studio Code","entry_key":"xim:code","identity":{"name":"code","namespace":"xim"},"name":"code","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/c/code.lua","ref":"","type":0,"version":""},"xim:codex":{"canonical_name":"xim:codex","description":"Codex CLI from OpenAI","entry_key":"xim:codex","identity":{"name":"codex","namespace":"xim"},"name":"codex","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/c/codex.lua","ref":"","type":0,"version":""},"xim:configure-project-installer":{"canonical_name":"xim:configure-project-installer","description":"Build & Install (from source) helper tools for ./configure-based projects","entry_key":"xim:configure-project-installer","identity":{"name":"configure-project-installer","namespace":"xim"},"name":"configure-project-installer","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/c/configure-project-installer.lua","ref":"","type":1,"version":""},"xim:cpp":{"canonical_name":"xim:cpp","description":"C++ language toolchain","entry_key":"xim:cpp","identity":{"name":"cpp","namespace":"xim"},"name":"cpp","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/c/cpp.lua","ref":"","type":3,"version":""},"xim:d2x":{"canonical_name":"xim:d2x","description":"xlings's d2x tool","entry_key":"xim:d2x","identity":{"name":"d2x","namespace":"xim"},"name":"d2x","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/d/d2x.lua","ref":"","type":0,"version":""},"xim:dash":{"canonical_name":"xim:dash","description":"Debian Almquist Shell — small POSIX-compliant shell","entry_key":"xim:dash","identity":{"name":"dash","namespace":"xim"},"name":"dash","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/d/dash.lua","ref":"","type":0,"version":""},"xim:devcpp":{"canonical_name":"xim:devcpp","description":"Dev-C++: A full-featured Integrated Development Environment (IDE) for the C/C++","entry_key":"xim:devcpp","identity":{"name":"devcpp","namespace":"xim"},"name":"devcpp","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/d/devcpp.lua","ref":"","type":0,"version":""},"xim:dotnet":{"canonical_name":"xim:dotnet","description":".NET is the free, open-source, cross-platform framework","entry_key":"xim:dotnet","identity":{"name":"dotnet","namespace":"xim"},"name":"dotnet","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/d/dotnet.lua","ref":"","type":0,"version":""},"xim:e2fsprogs":{"canonical_name":"xim:e2fsprogs","description":"ext2/ext3/ext4 filesystem utilities (mke2fs, e2fsck, tune2fs, resize2fs, debugfs)","entry_key":"xim:e2fsprogs","identity":{"name":"e2fsprogs","namespace":"xim"},"name":"e2fsprogs","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/e/e2fsprogs.lua","ref":"","type":0,"version":""},"xim:elfutils":{"canonical_name":"xim:elfutils","description":"ELF object file access library — libelf, for radeonsi","entry_key":"xim:elfutils","identity":{"name":"elfutils","namespace":"xim"},"name":"elfutils","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/e/elfutils.lua","ref":"","type":0,"version":""},"xim:expat":{"canonical_name":"xim:expat","description":"Fast streaming XML parser library","entry_key":"xim:expat","identity":{"name":"expat","namespace":"xim"},"name":"expat","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/e/expat.lua","ref":"","type":0,"version":""},"xim:fd":{"canonical_name":"xim:fd","description":"Simple, fast, user-friendly alternative to find","entry_key":"xim:fd","identity":{"name":"fd","namespace":"xim"},"name":"fd","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/f/fd.lua","ref":"","type":0,"version":""},"xim:fish":{"canonical_name":"xim:fish","description":"Friendly interactive shell — smart, user-friendly, modern command-line","entry_key":"xim:fish","identity":{"name":"fish","namespace":"xim"},"name":"fish","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/f/fish.lua","ref":"","type":0,"version":""},"xim:fontconfig":{"canonical_name":"xim:fontconfig","description":"Library for configuring and customizing font access","entry_key":"xim:fontconfig","identity":{"name":"fontconfig","namespace":"xim"},"name":"fontconfig","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/f/fontconfig.lua","ref":"","type":0,"version":""},"xim:freetype":{"canonical_name":"xim:freetype","description":"A freely available software library to render fonts","entry_key":"xim:freetype","identity":{"name":"freetype","namespace":"xim"},"name":"freetype","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/f/freetype.lua","ref":"","type":0,"version":""},"xim:fribidi":{"canonical_name":"xim:fribidi","description":"Free Implementation of the Unicode Bidirectional Algorithm","entry_key":"xim:fribidi","identity":{"name":"fribidi","namespace":"xim"},"name":"fribidi","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/f/fribidi.lua","ref":"","type":0,"version":""},"xim:fzf":{"canonical_name":"xim:fzf","description":"A command-line fuzzy finder","entry_key":"xim:fzf","identity":{"name":"fzf","namespace":"xim"},"name":"fzf","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/f/fzf.lua","ref":"","type":0,"version":""},"xim:gcc":{"canonical_name":"xim:gcc","description":"GCC, the GNU Compiler Collection","entry_key":"xim:gcc","identity":{"name":"gcc","namespace":"xim"},"name":"gcc","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/g/gcc.lua","ref":"","type":0,"version":""},"xim:gcc-runtime":{"canonical_name":"xim:gcc-runtime","description":"GCC runtime libraries (libstdc++, libgcc_s, libgomp, libatomic, libitm, libquadmath, libssp) — required by virtually every C++ binary on Linux, including Clang-built ones","entry_key":"xim:gcc-runtime","identity":{"name":"gcc-runtime","namespace":"xim"},"name":"gcc-runtime","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/g/gcc-runtime.lua","ref":"","type":0,"version":""},"xim:gcc-specs-config":{"canonical_name":"xim:gcc-specs-config","description":"XScript: GCC Specs Config Tool","entry_key":"xim:gcc-specs-config","identity":{"name":"gcc-specs-config","namespace":"xim"},"name":"gcc-specs-config","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/g/gcc-specs-config.lua","ref":"","type":1,"version":""},"xim:git":{"canonical_name":"xim:git","description":"Git is a free and open source distributed version control system","entry_key":"xim:git","identity":{"name":"git","namespace":"xim"},"name":"git","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/g/git.lua","ref":"","type":0,"version":""},"xim:git-autosync":{"canonical_name":"xim:git-autosync","description":"XScript: Git AutoSync Tools","entry_key":"xim:git-autosync","identity":{"name":"git-autosync","namespace":"xim"},"name":"git-autosync","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/g/git-autosync.lua","ref":"","type":1,"version":""},"xim:github-gh":{"canonical_name":"xim:github-gh","description":"GitHub's official command line tool","entry_key":"xim:github-gh","identity":{"name":"github-gh","namespace":"xim"},"name":"github-gh","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/g/github-gh.lua","ref":"","type":0,"version":""},"xim:github-notifications-clear":{"canonical_name":"xim:github-notifications-clear","description":"Clear github's notifications (unread)","entry_key":"xim:github-notifications-clear","identity":{"name":"github-notifications-clear","namespace":"xim"},"name":"github-notifications-clear","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/g/github-notifications-clear.lua","ref":"","type":1,"version":""},"xim:glib":{"canonical_name":"xim:glib","description":"Low-level core library (GLib/GObject/GIO)","entry_key":"xim:glib","identity":{"name":"glib","namespace":"xim"},"name":"glib","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/g/glib.lua","ref":"","type":0,"version":""},"xim:glibc":{"canonical_name":"xim:glibc","description":"The GNU C Library","entry_key":"xim:glibc","identity":{"name":"glibc","namespace":"xim"},"name":"glibc","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/g/glibc.lua","ref":"","type":0,"version":""},"xim:glslang":{"canonical_name":"xim:glslang","description":"Khronos reference GLSL/ESSL front end and validator (build-time)","entry_key":"xim:glslang","identity":{"name":"glslang","namespace":"xim"},"name":"glslang","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/g/glslang.lua","ref":"","type":0,"version":""},"xim:go":{"canonical_name":"xim:go","description":"The Go programming language","entry_key":"xim:go","identity":{"name":"go","namespace":"xim"},"name":"go","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/g/go.lua","ref":"","type":0,"version":""},"xim:godot":{"canonical_name":"xim:godot","description":"Godot Engine - multi-platform 2D and 3D game engine (editor + headless export runner)","entry_key":"xim:godot","identity":{"name":"godot","namespace":"xim"},"name":"godot","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/g/godot.lua","ref":"","type":0,"version":""},"xim:graphics":{"canonical_name":"xim:graphics","description":"The xlings graphics stack: OpenGL that adapts to whatever GPU this host has","entry_key":"xim:graphics","identity":{"name":"graphics","namespace":"xim"},"name":"graphics","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/g/graphics.lua","ref":"","type":0,"version":""},"xim:griddycode":{"canonical_name":"xim:griddycode","description":"A code editor made with Godot. Code has never been more lit!","entry_key":"xim:griddycode","identity":{"name":"griddycode","namespace":"xim"},"name":"griddycode","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/g/griddycode.lua","ref":"","type":0,"version":""},"xim:harfbuzz":{"canonical_name":"xim:harfbuzz","description":"OpenType text shaping engine","entry_key":"xim:harfbuzz","identity":{"name":"harfbuzz","namespace":"xim"},"name":"harfbuzz","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/h/harfbuzz.lua","ref":"","type":0,"version":""},"xim:hermes-agent":{"canonical_name":"xim:hermes-agent","description":"The self-improving AI agent from Nous Research — creates skills from experience, improves them during use, and runs anywhere","entry_key":"xim:hermes-agent","identity":{"name":"hermes-agent","namespace":"xim"},"name":"hermes-agent","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/h/hermes-agent.lua","ref":"","type":0,"version":""},"xim:interposer-stub":{"canonical_name":"xim:interposer-stub","description":"Prebuilt empty ELF stub that elfpatch.host_link_interposer turns into an interposer","entry_key":"xim:interposer-stub","identity":{"name":"interposer-stub","namespace":"xim"},"name":"interposer-stub","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/i/interposer-stub.lua","ref":"","type":0,"version":""},"xim:jdk-corretto":{"canonical_name":"xim:jdk-corretto","description":"Amazon Corretto — a no-cost, production-ready distribution of OpenJDK (LTS)","entry_key":"xim:jdk-corretto","identity":{"name":"jdk-corretto","namespace":"xim"},"name":"jdk-corretto","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/j/jdk-corretto.lua","ref":"","type":0,"version":""},"xim:jdk-temurin":{"canonical_name":"xim:jdk-temurin","description":"Eclipse Temurin JDK 25 — a production-ready binary build of OpenJDK (LTS)","entry_key":"xim:jdk-temurin","identity":{"name":"jdk-temurin","namespace":"xim"},"name":"jdk-temurin","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/j/jdk-temurin.lua","ref":"","type":0,"version":""},"xim:jdk-zulu":{"canonical_name":"xim:jdk-zulu","description":"Azul Zulu Community — a TCK-certified, no-cost build of OpenJDK (LTS)","entry_key":"xim:jdk-zulu","identity":{"name":"jdk-zulu","namespace":"xim"},"name":"jdk-zulu","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/j/jdk-zulu.lua","ref":"","type":0,"version":""},"xim:jetbrainsmono-nerd-font":{"canonical_name":"xim:jetbrainsmono-nerd-font","description":"JetBrainsMono Nerd Font patched with terminal icons and glyphs","entry_key":"xim:jetbrainsmono-nerd-font","identity":{"name":"jetbrainsmono-nerd-font","namespace":"xim"},"name":"jetbrainsmono-nerd-font","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/j/jetbrainsmono-nerd-font.lua","ref":"","type":0,"version":""},"xim:jq":{"canonical_name":"xim:jq","description":"Command-line JSON processor","entry_key":"xim:jq","identity":{"name":"jq","namespace":"xim"},"name":"jq","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/j/jq.lua","ref":"","type":0,"version":""},"xim:khistory":{"canonical_name":"xim:khistory","description":"An elegant keyboard/gamepad key detection and visualization tool","entry_key":"xim:khistory","identity":{"name":"khistory","namespace":"xim"},"name":"khistory","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/k/khistory.lua","ref":"","type":0,"version":""},"xim:libX11":{"canonical_name":"xim:libX11","description":"Core X11 client library","entry_key":"xim:libX11","identity":{"name":"libX11","namespace":"xim"},"name":"libX11","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/l/libX11.lua","ref":"","type":0,"version":""},"xim:libXau":{"canonical_name":"xim:libXau","description":"X11 authorisation protocol library","entry_key":"xim:libXau","identity":{"name":"libXau","namespace":"xim"},"name":"libXau","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/l/libXau.lua","ref":"","type":0,"version":""},"xim:libXcursor":{"canonical_name":"xim:libXcursor","description":"X cursor management library","entry_key":"xim:libXcursor","identity":{"name":"libXcursor","namespace":"xim"},"name":"libXcursor","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/l/libXcursor.lua","ref":"","type":0,"version":""},"xim:libXdmcp":{"canonical_name":"xim:libXdmcp","description":"X Display Manager Control Protocol library","entry_key":"xim:libXdmcp","identity":{"name":"libXdmcp","namespace":"xim"},"name":"libXdmcp","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/l/libXdmcp.lua","ref":"","type":0,"version":""},"xim:libXext":{"canonical_name":"xim:libXext","description":"X11 miscellaneous extensions library","entry_key":"xim:libXext","identity":{"name":"libXext","namespace":"xim"},"name":"libXext","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/l/libXext.lua","ref":"","type":0,"version":""},"xim:libXfixes":{"canonical_name":"xim:libXfixes","description":"X Fixes extension client library","entry_key":"xim:libXfixes","identity":{"name":"libXfixes","namespace":"xim"},"name":"libXfixes","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/l/libXfixes.lua","ref":"","type":0,"version":""},"xim:libXi":{"canonical_name":"xim:libXi","description":"X Input Extension client library","entry_key":"xim:libXi","identity":{"name":"libXi","namespace":"xim"},"name":"libXi","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/l/libXi.lua","ref":"","type":0,"version":""},"xim:libXinerama":{"canonical_name":"xim:libXinerama","description":"X11 Xinerama extension — multi-monitor screen geometry","entry_key":"xim:libXinerama","identity":{"name":"libXinerama","namespace":"xim"},"name":"libXinerama","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/l/libXinerama.lua","ref":"","type":0,"version":""},"xim:libXrandr":{"canonical_name":"xim:libXrandr","description":"X Resize, Rotate and Reflect extension library","entry_key":"xim:libXrandr","identity":{"name":"libXrandr","namespace":"xim"},"name":"libXrandr","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/l/libXrandr.lua","ref":"","type":0,"version":""},"xim:libXrender":{"canonical_name":"xim:libXrender","description":"X Rendering Extension client library","entry_key":"xim:libXrender","identity":{"name":"libXrender","namespace":"xim"},"name":"libXrender","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/l/libXrender.lua","ref":"","type":0,"version":""},"xim:libXxf86vm":{"canonical_name":"xim:libXxf86vm","description":"X11 XFree86 video mode extension library","entry_key":"xim:libXxf86vm","identity":{"name":"libXxf86vm","namespace":"xim"},"name":"libXxf86vm","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/l/libXxf86vm.lua","ref":"","type":0,"version":""},"xim:libcuda-host-link":{"canonical_name":"xim:libcuda-host-link","description":"Sentinel: stable symlink to host's libcuda.so.1 (NVIDIA driver userspace lib)","entry_key":"xim:libcuda-host-link","identity":{"name":"libcuda-host-link","namespace":"xim"},"name":"libcuda-host-link","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/l/libcuda-host-link.lua","ref":"","type":0,"version":""},"xim:libdrm":{"canonical_name":"xim:libdrm","description":"Userspace interface to the kernel DRM services","entry_key":"xim:libdrm","identity":{"name":"libdrm","namespace":"xim"},"name":"libdrm","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/l/libdrm.lua","ref":"","type":0,"version":""},"xim:libffi":{"canonical_name":"xim:libffi","description":"Portable foreign-function interface library","entry_key":"xim:libffi","identity":{"name":"libffi","namespace":"xim"},"name":"libffi","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/l/libffi.lua","ref":"","type":0,"version":""},"xim:libglvnd":{"canonical_name":"xim:libglvnd","description":"The GL Vendor-Neutral Dispatch library","entry_key":"xim:libglvnd","identity":{"name":"libglvnd","namespace":"xim"},"name":"libglvnd","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/l/libglvnd.lua","ref":"","type":0,"version":""},"xim:libllvm":{"canonical_name":"xim:libllvm","description":"LLVM as a shared library — the code generator mesa's llvmpipe and radeonsi use","entry_key":"xim:libllvm","identity":{"name":"libllvm","namespace":"xim"},"name":"libllvm","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/l/libllvm.lua","ref":"","type":0,"version":""},"xim:libpciaccess":{"canonical_name":"xim:libpciaccess","description":"Generic PCI device access library","entry_key":"xim:libpciaccess","identity":{"name":"libpciaccess","namespace":"xim"},"name":"libpciaccess","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/l/libpciaccess.lua","ref":"","type":0,"version":""},"xim:libpng":{"canonical_name":"xim:libpng","description":"Official PNG reference library","entry_key":"xim:libpng","identity":{"name":"libpng","namespace":"xim"},"name":"libpng","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/l/libpng.lua","ref":"","type":0,"version":""},"xim:libxcb":{"canonical_name":"xim:libxcb","description":"X protocol C-language Binding","entry_key":"xim:libxcb","identity":{"name":"libxcb","namespace":"xim"},"name":"libxcb","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/l/libxcb.lua","ref":"","type":0,"version":""},"xim:libxkbcommon":{"canonical_name":"xim:libxkbcommon","description":"Keymap handling library for Wayland and X11 clients","entry_key":"xim:libxkbcommon","identity":{"name":"libxkbcommon","namespace":"xim"},"name":"libxkbcommon","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/l/libxkbcommon.lua","ref":"","type":0,"version":""},"xim:libxml2":{"canonical_name":"xim:libxml2","description":"XML C parser and toolkit","entry_key":"xim:libxml2","identity":{"name":"libxml2","namespace":"xim"},"name":"libxml2","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/l/libxml2.lua","ref":"","type":0,"version":""},"xim:libxshmfence":{"canonical_name":"xim:libxshmfence","description":"Shared-memory fences for DRI3","entry_key":"xim:libxshmfence","identity":{"name":"libxshmfence","namespace":"xim"},"name":"libxshmfence","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/l/libxshmfence.lua","ref":"","type":0,"version":""},"xim:linux-headers":{"canonical_name":"xim:linux-headers","description":"Linux Kernel Headers (prebuilt)","entry_key":"xim:linux-headers","identity":{"name":"linux-headers","namespace":"xim"},"name":"linux-headers","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/l/linux-headers.lua","ref":"","type":0,"version":""},"xim:linux-sysroot-create":{"canonical_name":"xim:linux-sysroot-create","description":"XScript: Linux Sysroot Create Tool","entry_key":"xim:linux-sysroot-create","identity":{"name":"linux-sysroot-create","namespace":"xim"},"name":"linux-sysroot-create","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/l/linux-sysroot-create.lua","ref":"","type":1,"version":""},"xim:llvm":{"canonical_name":"xim:llvm","description":"LLVM compiler infrastructure and toolchain","entry_key":"xim:llvm","identity":{"name":"llvm","namespace":"xim"},"name":"llvm","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/l/llvm.lua","ref":"","type":0,"version":""},"xim:llvm-tools":{"canonical_name":"xim:llvm-tools","description":"LLVM development tools (clang-format, clang-tidy, clangd)","entry_key":"xim:llvm-tools","identity":{"name":"llvm-tools","namespace":"xim"},"name":"llvm-tools","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/l/llvm-tools.lua","ref":"","type":0,"version":""},"xim:make":{"canonical_name":"xim:make","description":"GNU Make — tool which controls the generation of executables from source files","entry_key":"xim:make","identity":{"name":"make","namespace":"xim"},"name":"make","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/m/make.lua","ref":"","type":0,"version":""},"xim:mcpp":{"canonical_name":"xim:mcpp","description":"A modern C++ build tool with module support, dependency/toolchain management, package indexing, and packaging","entry_key":"xim:mcpp","identity":{"name":"mcpp","namespace":"xim"},"name":"mcpp","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/m/mcpp.lua","ref":"","type":0,"version":""},"xim:mcpp-short-cmd":{"canonical_name":"xim:mcpp-short-cmd","description":"Short command aliases for mcpp (mp/mbuild/mrun/mtest/...)","entry_key":"xim:mcpp-short-cmd","identity":{"name":"mcpp-short-cmd","namespace":"xim"},"name":"mcpp-short-cmd","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/m/mcpp-short-cmd.lua","ref":"","type":0,"version":""},"xim:mdbook":{"canonical_name":"xim:mdbook","description":"Create book from markdown files. Like Gitbook but implemented in Rust","entry_key":"xim:mdbook","identity":{"name":"mdbook","namespace":"xim"},"name":"mdbook","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/m/mdbook.lua","ref":"","type":0,"version":""},"xim:media-crawler":{"canonical_name":"xim:media-crawler","description":"Multi-platform social media crawler (XHS, Douyin, Kuaishou, Bilibili, Weibo, Tieba, Zhihu) using Playwright","entry_key":"xim:media-crawler","identity":{"name":"media-crawler","namespace":"xim"},"name":"media-crawler","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/m/media-crawler.lua","ref":"","type":0,"version":""},"xim:mesa":{"canonical_name":"xim:mesa","description":"Mesa 3D — OpenGL and Vulkan: llvmpipe, radeonsi, nouveau, zink, RADV","entry_key":"xim:mesa","identity":{"name":"mesa","namespace":"xim"},"name":"mesa","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/m/mesa.lua","ref":"","type":0,"version":""},"xim:mingw-cross-gcc":{"canonical_name":"xim:mingw-cross-gcc","description":"MinGW-w64 GCC cross toolchain (Linux host → Windows x86_64 PE, MSVCRT runtime)","entry_key":"xim:mingw-cross-gcc","identity":{"name":"mingw-cross-gcc","namespace":"xim"},"name":"mingw-cross-gcc","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/m/mingw-cross-gcc.lua","ref":"","type":0,"version":""},"xim:mingw-gcc":{"canonical_name":"xim:mingw-gcc","description":"MinGW-w64 GCC for Windows (winlibs standalone build, UCRT runtime)","entry_key":"xim:mingw-gcc","identity":{"name":"mingw-gcc","namespace":"xim"},"name":"mingw-gcc","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/m/mingw-gcc.lua","ref":"","type":0,"version":""},"xim:mingw-w64":{"canonical_name":"xim:mingw-w64","description":"A complete runtime environment for GCC & LLVM for Windows","entry_key":"xim:mingw-w64","identity":{"name":"mingw-w64","namespace":"xim"},"name":"mingw-w64","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/m/mingw-w64.lua","ref":"","type":0,"version":""},"xim:msvc":{"canonical_name":"xim:msvc","description":"Microsoft Visual Studio C++ Compiler","entry_key":"xim:msvc","identity":{"name":"msvc","namespace":"xim"},"name":"msvc","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/m/msvc.lua","ref":"","type":3,"version":""},"xim:musl":{"canonical_name":"xim:musl","description":"musl - a lightweight, fast, simple, free, standards-conformant C library","entry_key":"xim:musl","identity":{"name":"musl","namespace":"xim"},"name":"musl","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/m/musl.lua","ref":"","type":0,"version":""},"xim:musl-cross-make":{"canonical_name":"xim:musl-cross-make","description":"Simple makefile-based build for musl cross compiler","entry_key":"xim:musl-cross-make","identity":{"name":"musl-cross-make","namespace":"xim"},"name":"musl-cross-make","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/m/musl-cross-make.lua","ref":"","type":1,"version":""},"xim:musl-gcc":{"canonical_name":"xim:musl-gcc","description":"GCC, the GNU Compiler Collection (prebuilt with musl)","entry_key":"xim:musl-gcc","identity":{"name":"musl-gcc","namespace":"xim"},"name":"musl-gcc","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/m/musl-gcc.lua","ref":"","type":0,"version":""},"xim:nasm":{"canonical_name":"xim:nasm","description":"NASM - the Netwide Assembler, an assembler targeting the x86/x86-64 CPU family","entry_key":"xim:nasm","identity":{"name":"nasm","namespace":"xim"},"name":"nasm","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/n/nasm.lua","ref":"","type":0,"version":""},"xim:ninja":{"canonical_name":"xim:ninja","description":"a small build system with a focus on speed","entry_key":"xim:ninja","identity":{"name":"ninja","namespace":"xim"},"name":"ninja","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/n/ninja.lua","ref":"","type":0,"version":""},"xim:node":{"canonical_name":"xim:node","description":"Node.js is a JavaScript runtime built on Chrome's V8 JavaScript engine","entry_key":"xim:node","identity":{"name":"node","namespace":"xim"},"name":"node","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/n/node.lua","ref":"","type":0,"version":""},"xim:npm":{"canonical_name":"xim:npm","description":"The package manager for JavaScript","entry_key":"xim:npm","identity":{"name":"npm","namespace":"xim"},"name":"npm","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/n/npm.lua","ref":"","type":0,"version":""},"xim:nvidia-gl-host-link":{"canonical_name":"xim:nvidia-gl-host-link","description":"Sentinel: stable symlinks to the host's NVIDIA proprietary GL/EGL userspace","entry_key":"xim:nvidia-gl-host-link","identity":{"name":"nvidia-gl-host-link","namespace":"xim"},"name":"nvidia-gl-host-link","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/n/nvidia-gl-host-link.lua","ref":"","type":0,"version":""},"xim:nvim":{"canonical_name":"xim:nvim","description":"Vim-fork focused on extensibility and usability","entry_key":"xim:nvim","identity":{"name":"nvim","namespace":"xim"},"name":"nvim","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/n/nvim.lua","ref":"","type":0,"version":""},"xim:nvm":{"canonical_name":"xim:nvm","description":"Node Version Manager - POSIX-compliant node.js version manager","entry_key":"xim:nvm","identity":{"name":"nvm","namespace":"xim"},"name":"nvm","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/n/nvm.lua","ref":"","type":0,"version":""},"xim:ollama":{"canonical_name":"xim:ollama","description":"Get up and running with large language models locally","entry_key":"xim:ollama","identity":{"name":"ollama","namespace":"xim"},"name":"ollama","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/o/ollama.lua","ref":"","type":0,"version":""},"xim:openclaw":{"canonical_name":"xim:openclaw","description":"OpenClaw CLI","entry_key":"xim:openclaw","identity":{"name":"openclaw","namespace":"xim"},"name":"openclaw","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/o/openclaw.lua","ref":"","type":0,"version":""},"xim:openssl":{"canonical_name":"xim:openssl","description":"TLS/SSL and cryptography toolkit","entry_key":"xim:openssl","identity":{"name":"openssl","namespace":"xim"},"name":"openssl","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/o/openssl.lua","ref":"","type":0,"version":""},"xim:pango":{"canonical_name":"xim:pango","description":"Library for layout and rendering of internationalized text","entry_key":"xim:pango","identity":{"name":"pango","namespace":"xim"},"name":"pango","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/p/pango.lua","ref":"","type":0,"version":""},"xim:patchelf":{"canonical_name":"xim:patchelf","description":"ELF patch tool for interpreter and RPATH","entry_key":"xim:patchelf","identity":{"name":"patchelf","namespace":"xim"},"name":"patchelf","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/p/patchelf.lua","ref":"","type":0,"version":""},"xim:pcre2":{"canonical_name":"xim:pcre2","description":"Perl Compatible Regular Expressions (v2)","entry_key":"xim:pcre2","identity":{"name":"pcre2","namespace":"xim"},"name":"pcre2","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/p/pcre2.lua","ref":"","type":0,"version":""},"xim:perl":{"canonical_name":"xim:perl","description":"Perl — a complete, relocatable Perl 5 interpreter with the full core module set","entry_key":"xim:perl","identity":{"name":"perl","namespace":"xim"},"name":"perl","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/p/perl.lua","ref":"","type":0,"version":""},"xim:pixman":{"canonical_name":"xim:pixman","description":"Low-level pixel manipulation library (cairo backend)","entry_key":"xim:pixman","identity":{"name":"pixman","namespace":"xim"},"name":"pixman","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/p/pixman.lua","ref":"","type":0,"version":""},"xim:pnpm":{"canonical_name":"xim:pnpm","description":"Fast, disk space efficient package manager","entry_key":"xim:pnpm","identity":{"name":"pnpm","namespace":"xim"},"name":"pnpm","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/p/pnpm.lua","ref":"","type":0,"version":""},"xim:project-graph":{"canonical_name":"xim:project-graph","description":"快速绘制节点图的桌面工具 - 项目进程拓扑图绘制、头脑风暴草稿","entry_key":"xim:project-graph","identity":{"name":"project-graph","namespace":"xim"},"name":"project-graph","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/p/project-graph.lua","ref":"","type":0,"version":""},"xim:proot":{"canonical_name":"xim:proot","description":"Userspace chroot, mount --bind, and binfmt_misc — no root required","entry_key":"xim:proot","identity":{"name":"proot","namespace":"xim"},"name":"proot","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/p/proot.lua","ref":"","type":0,"version":""},"xim:python":{"canonical_name":"xim:python","description":"The Python programming language","entry_key":"xim:python","identity":{"name":"python","namespace":"xim"},"name":"python","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/p/python.lua","ref":"","type":0,"version":""},"xim:ripgrep":{"canonical_name":"xim:ripgrep","description":"Fast, recursive grep that respects .gitignore","entry_key":"xim:ripgrep","identity":{"name":"ripgrep","namespace":"xim"},"name":"ripgrep","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/r/ripgrep.lua","ref":"","type":0,"version":""},"xim:ros2-jazzy-ubnutu":{"canonical_name":"xim:ros2-jazzy-ubnutu","description":"Config: one-click ROS 2 Jazzy Jalisco setup for Ubuntu 24.04","entry_key":"xim:ros2-jazzy-ubnutu","identity":{"name":"ros2-jazzy-ubnutu","namespace":"xim"},"name":"ros2-jazzy-ubnutu","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/r/ros2-jazzy-ubuntu.lua","ref":"","type":3,"version":""},"xim:rosdep":{"canonical_name":"xim:rosdep","description":"ROS dependency management tool","entry_key":"xim:rosdep","identity":{"name":"rosdep","namespace":"xim"},"name":"rosdep","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/r/rosdep.lua","ref":"","type":0,"version":""},"xim:rust":{"canonical_name":"xim:rust","description":"A language empowering everyone to build reliable and efficient software","entry_key":"xim:rust","identity":{"name":"rust","namespace":"xim"},"name":"rust","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/r/rust.lua","ref":"","type":0,"version":""},"xim:rustup":{"canonical_name":"xim:rustup","description":"An installer init tool for Rustup, the Rust toolchain installer","entry_key":"xim:rustup","identity":{"name":"rustup","namespace":"xim"},"name":"rustup","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/r/rustup.lua","ref":"","type":0,"version":""},"xim:seeme-report":{"canonical_name":"xim:seeme-report","description":"让别人知道你在干什么 seeme report端","entry_key":"xim:seeme-report","identity":{"name":"seeme-report","namespace":"xim"},"name":"seeme-report","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/s/seeme-report.lua","ref":"","type":0,"version":""},"xim:seeme-server":{"canonical_name":"xim:seeme-server","description":"让别人知道你在干什么 seeme 服务端","entry_key":"xim:seeme-server","identity":{"name":"seeme-server","namespace":"xim"},"name":"seeme-server","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/s/seeme-server.lua","ref":"","type":0,"version":""},"xim:shortcut-tool":{"canonical_name":"xim:shortcut-tool","description":"Shortcut Tool: Create and manage shortcuts easily","entry_key":"xim:shortcut-tool","identity":{"name":"shortcut-tool","namespace":"xim"},"name":"shortcut-tool","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/s/shortcut-tool.lua","ref":"","type":1,"version":""},"xim:sing-box":{"canonical_name":"xim:sing-box","description":"The universal proxy platform","entry_key":"xim:sing-box","identity":{"name":"sing-box","namespace":"xim"},"name":"sing-box","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/s/sing-box.lua","ref":"","type":0,"version":""},"xim:sing-box-helper":{"canonical_name":"xim:sing-box-helper","description":"Sing-Box Helper Tools - Simple commands for server and client configuration","entry_key":"xim:sing-box-helper","identity":{"name":"sing-box-helper","namespace":"xim"},"name":"sing-box-helper","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/s/sing-box-helper.lua","ref":"","type":1,"version":""},"xim:sourcetrail":{"canonical_name":"xim:sourcetrail","description":"Sourcetrail - free and open-source interactive source explorer","entry_key":"xim:sourcetrail","identity":{"name":"sourcetrail","namespace":"xim"},"name":"sourcetrail","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/s/sourcetrail.lua","ref":"","type":0,"version":""},"xim:syslinux":{"canonical_name":"xim:syslinux","description":"SYSLINUX bootloader collection (isolinux, pxelinux, extlinux + EFI loaders)","entry_key":"xim:syslinux","identity":{"name":"syslinux","namespace":"xim"},"name":"syslinux","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/s/syslinux.lua","ref":"","type":0,"version":""},"xim:trendradar":{"canonical_name":"xim:trendradar","description":"AI-driven public opinion and trend monitor with multi-platform aggregation, RSS, and smart alerts","entry_key":"xim:trendradar","identity":{"name":"trendradar","namespace":"xim"},"name":"trendradar","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/t/trendradar.lua","ref":"","type":0,"version":""},"xim:uv":{"canonical_name":"xim:uv","description":"An extremely fast Python package and project manager (Astral)","entry_key":"xim:uv","identity":{"name":"uv","namespace":"xim"},"name":"uv","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/u/uv.lua","ref":"","type":0,"version":""},"xim:vc6":{"canonical_name":"xim:vc6","description":"Visual C++ 6.0: Classic C/C++ IDE (portable for Windows 10/11)","entry_key":"xim:vc6","identity":{"name":"vc6","namespace":"xim"},"name":"vc6","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/v/vc6.lua","ref":"","type":0,"version":""},"xim:vcstool":{"canonical_name":"xim:vcstool","description":"Version control system tool for multiple repos (ROS vcstool)","entry_key":"xim:vcstool","identity":{"name":"vcstool","namespace":"xim"},"name":"vcstool","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/v/vcstool.lua","ref":"","type":0,"version":""},"xim:vim":{"canonical_name":"xim:vim","description":"The classic Vi IMproved text editor (statically linked, hermetic)","entry_key":"xim:vim","identity":{"name":"vim","namespace":"xim"},"name":"vim","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/v/vim.lua","ref":"","type":0,"version":""},"xim:virtualbox":{"canonical_name":"xim:virtualbox","description":"Oracle VM VirtualBox userspace + VBoxManage CLI (portable, alias: vbox)","entry_key":"xim:virtualbox","identity":{"name":"virtualbox","namespace":"xim"},"name":"virtualbox","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/v/virtualbox.lua","ref":"","type":0,"version":""},"xim:vs-buildtools":{"canonical_name":"xim:vs-buildtools","description":"Visual Studio Build Tools","entry_key":"xim:vs-buildtools","identity":{"name":"vs-buildtools","namespace":"xim"},"name":"vs-buildtools","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/v/vs-buildtools.lua","ref":"","type":3,"version":""},"xim:vulkan-headers":{"canonical_name":"xim:vulkan-headers","description":"Vulkan API headers and registry","entry_key":"xim:vulkan-headers","identity":{"name":"vulkan-headers","namespace":"xim"},"name":"vulkan-headers","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/v/vulkan-headers.lua","ref":"","type":0,"version":""},"xim:vulkan-loader":{"canonical_name":"xim:vulkan-loader","description":"Vulkan ICD loader - libvulkan.so.1, without which an ICD manifest is never read","entry_key":"xim:vulkan-loader","identity":{"name":"vulkan-loader","namespace":"xim"},"name":"vulkan-loader","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/v/vulkan-loader.lua","ref":"","type":0,"version":""},"xim:wayland":{"canonical_name":"xim:wayland","description":"Wayland protocol library and scanner","entry_key":"xim:wayland","identity":{"name":"wayland","namespace":"xim"},"name":"wayland","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/w/wayland.lua","ref":"","type":0,"version":""},"xim:wayland-protocols":{"canonical_name":"xim:wayland-protocols","description":"Wayland protocol extension definitions (build-time)","entry_key":"xim:wayland-protocols","identity":{"name":"wayland-protocols","namespace":"xim"},"name":"wayland-protocols","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/w/wayland-protocols.lua","ref":"","type":0,"version":""},"xim:windows-acp":{"canonical_name":"xim:windows-acp","description":"ACP: Beta: Use Unicode UTF-8 for worldwide language support","entry_key":"xim:windows-acp","identity":{"name":"windows-acp","namespace":"xim"},"name":"windows-acp","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/w/windows-acp.lua","ref":"","type":0,"version":""},"xim:wsl-gl-host-link":{"canonical_name":"xim:wsl-gl-host-link","description":"Sentinel: links WSL2's host D3D12/DXCore userspace so mesa's d3d12 driver can reach the Windows GPU","entry_key":"xim:wsl-gl-host-link","identity":{"name":"wsl-gl-host-link","namespace":"xim"},"name":"wsl-gl-host-link","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/w/wsl-gl-host-link.lua","ref":"","type":0,"version":""},"xim:wsl-ubuntu":{"canonical_name":"xim:wsl-ubuntu","description":"Windows Subsystem for Linux (WSL) Ubuntu","entry_key":"xim:wsl-ubuntu","identity":{"name":"wsl-ubuntu","namespace":"xim"},"name":"wsl-ubuntu","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/w/wsl-ubuntu.lua","ref":"","type":3,"version":""},"xim:x86_64-linux-musl-gcc":{"canonical_name":"xim:x86_64-linux-musl-gcc","description":"GCC cross toolchain targeting x86_64-linux-musl (musl, fully static ELF)","entry_key":"xim:x86_64-linux-musl-gcc","identity":{"name":"x86_64-linux-musl-gcc","namespace":"xim"},"name":"x86_64-linux-musl-gcc","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/x/x86_64-linux-musl-gcc.lua","ref":"","type":0,"version":""},"xim:xcb-proto":{"canonical_name":"xim:xcb-proto","description":"XML-XCB protocol descriptions (build-time)","entry_key":"xim:xcb-proto","identity":{"name":"xcb-proto","namespace":"xim"},"name":"xcb-proto","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/x/xcb-proto.lua","ref":"","type":0,"version":""},"xim:xlings":{"canonical_name":"xim:xlings","description":"Xlings | Highly abstract [ package manager ] - \"Multi-version management + Everything can be a package\"","entry_key":"xim:xlings","identity":{"name":"xlings","namespace":"xim"},"name":"xlings","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/x/xlings.lua","ref":"","type":0,"version":""},"xim:xlings-project-templates":{"canonical_name":"xim:xlings-project-templates","description":"Xlings - Project Templates","entry_key":"xim:xlings-project-templates","identity":{"name":"xlings-project-templates","namespace":"xim"},"name":"xlings-project-templates","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/x/xlings-project-templates.lua","ref":"","type":2,"version":""},"xim:xmake":{"canonical_name":"xim:xmake","description":"A cross-platform build utility based on Lua","entry_key":"xim:xmake","identity":{"name":"xmake","namespace":"xim"},"name":"xmake","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/x/xmake.lua","ref":"","type":0,"version":""},"xim:xorgproto":{"canonical_name":"xim:xorgproto","description":"X Window System protocol headers (build-time)","entry_key":"xim:xorgproto","identity":{"name":"xorgproto","namespace":"xim"},"name":"xorgproto","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/x/xorgproto.lua","ref":"","type":0,"version":""},"xim:xpkg-helper":{"canonical_name":"xim:xpkg-helper","description":"XPKG: XPackage Helper Tools","entry_key":"xim:xpkg-helper","identity":{"name":"xpkg-helper","namespace":"xim"},"name":"xpkg-helper","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/x/xpkg-helper.lua","ref":"","type":1,"version":""},"xim:xtrans":{"canonical_name":"xim:xtrans","description":"X transport layer macros and headers (build-time)","entry_key":"xim:xtrans","identity":{"name":"xtrans","namespace":"xim"},"name":"xtrans","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/x/xtrans.lua","ref":"","type":0,"version":""},"xim:xvm":{"canonical_name":"xim:xvm","description":"a simple and generic version management tool","entry_key":"xim:xvm","identity":{"name":"xvm","namespace":"xim"},"name":"xvm","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/x/xvm.lua","ref":"","type":0,"version":""},"xim:xvm-sysdetect":{"canonical_name":"xim:xvm-sysdetect","description":"XVM - System Package Detect Tools","entry_key":"xim:xvm-sysdetect","identity":{"name":"xvm-sysdetect","namespace":"xim"},"name":"xvm-sysdetect","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/x/xvm-sysdetect.lua","ref":"","type":3,"version":""},"xim:yazi":{"canonical_name":"xim:yazi","description":"Blazing fast terminal file manager written in Rust, based on async I/O","entry_key":"xim:yazi","identity":{"name":"yazi","namespace":"xim"},"name":"yazi","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/y/yazi.lua","ref":"","type":0,"version":""},"xim:zlib":{"canonical_name":"xim:zlib","description":"A massively spiffy yet delicately unobtrusive compression library","entry_key":"xim:zlib","identity":{"name":"zlib","namespace":"xim"},"name":"zlib","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/z/zlib.lua","ref":"","type":0,"version":""},"xim:zoxide":{"canonical_name":"xim:zoxide","description":"A smarter cd command — jump to your most-used directories","entry_key":"xim:zoxide","identity":{"name":"zoxide","namespace":"xim"},"name":"zoxide","path":"/tmp/claude-1000/-home-speak-workspace-github-openxlings-xlings/3a455452-e900-4955-b694-8a18cb82a282/scratchpad/gfxbuild-home/data/xim-pkgindex/pkgs/z/zoxide.lua","ref":"","type":0,"version":""}},"mutex_groups":{},"repo_head_hash":"1bac17cea35bf6d864310d106644a3c23a20955a","version":2} \ No newline at end of file diff --git a/libs/graphics.lua b/libs/graphics.lua index 1157c9cc..0b87cdb5 100644 --- a/libs/graphics.lua +++ b/libs/graphics.lua @@ -74,6 +74,9 @@ local graphics = {} graphics.DRI_DIR = "usr/lib/dri" graphics.EGL_VENDOR_DIR = "share/glvnd/egl_vendor.d" graphics.SHARE_DIR = "share" +-- Where the Vulkan loader looks, relative to the subos: it searches +-- $XDG_DATA_DIRS/vulkan/icd.d and mesa puts ${subosdir}/share on that list. +graphics.VULKAN_ICD_DIR = "share/vulkan/icd.d" -- The variables, once. Keys are variable names; values are subos-relative -- paths, with no placeholder syntax -- the two emitters below add their own. @@ -186,6 +189,41 @@ function graphics.declare_egl_vendor(install_dir, rel_json, tag) return true end +-- Place a Vulkan ICD manifest into the subos, where the loader looks. +-- +-- The loader searches `$XDG_DATA_DIRS/vulkan/icd.d`, and mesa's declaration +-- already puts `${subosdir}/share` on that variable -- so the manifest has to be +-- under the SUBOS's share, not only in the payload. Without this the loader +-- installs, starts, finds the HOST's ICDs and reports success: `vulkaninfo` +-- works, zink works, and none of it is ours. That is the same boundary the GL +-- side needed interposers for, one API over, and it looks like a pass from every +-- angle except asking whose ICD answered. +-- +-- Same shared-directory shape as the glvnd vendor JSON, and for the same reason: +-- one directory, filenames decide, several packages may contribute. +function graphics.declare_vulkan_icd(install_dir, rel_dir, tag) + if not xvm.files then return false end + local dir = path.join(install_dir, rel_dir) + if not os.isdir(dir) then return true end -- a build with no Vulkan driver + local f = io.popen(string.format([[ls -1 "%s"/*.json 2>/dev/null]], dir)) + if not f then return false end + local n = 0 + for line in f:lines() do + local p = line:gsub("[\r\n]+$", "") + if p ~= "" then + local base = p:match("([^/]+)$") + xvm.files{ + src = path.join(rel_dir, base), + dst = path.join(graphics.VULKAN_ICD_DIR, base), + binding = tag, + } + n = n + 1 + end + end + f:close() + return n > 0 +end + -- Place the DRI driver modules where LIBGL_DRIVERS_PATH points. -- -- The whole directory as ONE asset, which is safe here and would not be for diff --git a/libs/selfcontain.lua b/libs/selfcontain.lua new file mode 100644 index 00000000..76db0d3b --- /dev/null +++ b/libs/selfcontain.lua @@ -0,0 +1,183 @@ +-- Make a payload resolve its own dependencies, instead of the host's. +-- +-- Loaded by package hooks via: +-- import("xim.pkgindex.selfcontain") +-- +-- THE DEFECT THIS EXISTS TO CLOSE +-- +-- Every library recipe in this index declares what it OFFERS: +-- +-- exports = { runtime = { libdirs = { "lib" } } } +-- +-- and several declare what they need: +-- +-- deps = { "xim:libXau@>=1.0", "xim:libXdmcp@>=1.1" } +-- +-- but until this module, not one of them CONSUMED the first from the second. +-- `exports` is read by a package's dependents; it does nothing for the package +-- that declares it. The step that turns "my dep exports lib/" into "my ELF can +-- find it" is `elfpatch`, and no recipe in this index -- or in mcpp-index -- +-- called it. `elfpatch.closure_lib_paths()` is a public, documented libxpkg API +-- with, before this, zero callers in the entire ecosystem. +-- +-- So `libxcb.so.1` shipped with +-- +-- DT_NEEDED libXau.so.6, libXdmcp.so.6, libc.so.6 +-- DT_RUNPATH $ORIGIN +-- +-- and `libXau.so.6` is in a different payload. It resolved anyway, from the +-- HOST's /etc/ld.so.cache, on every machine that happened to have libxau +-- installed -- which is every desktop Linux. The stack looked self-contained +-- and never was. +-- +-- WHY THE SUBOS LINK DIRECTORY DOES NOT ALREADY COVER THIS +-- +-- `sysroot.declare_libs` symlinks every payload library into `/lib`, and +-- a consumer built in the subos gets `/lib` in its DT_RPATH -- which IS +-- transitive, so one might expect it to serve libxcb's search for libXau. +-- +-- It does not, and the reason is the single most load-bearing sentence in +-- ld.so's search order: **if an object has DT_RUNPATH, its DT_RPATH-inherited +-- search path is not consulted at all.** libxcb has DT_RUNPATH ($ORIGIN). So +-- for libxcb's own dependencies the loader consults $ORIGIN and then goes +-- straight to the cache. No ancestor's RPATH is reachable from there, however +-- many of them name the right directory. +-- +-- Measured, on a sealed bwrap with no /usr at all: +-- +-- as shipped EGL_CLIENT_EXTENSIONS= , "surfaceless refused 0x300c" +-- -- mesa's vendor never loads +-- closure-patched GL_RENDERER=llvmpipe (LLVM 20.1.7), PIXEL=336699 +-- -- every LOADED= line inside our own payload +-- +-- WHY PER-PACKAGE CLOSURE AND NOT ONE BIG DIRECTORY +-- +-- The tempting shortcut is to put `/lib` -- which already has a symlink +-- to every payload library -- on every payload library's RPATH, and stop +-- there. Two reasons that is the wrong primary mechanism: +-- +-- * A payload is shared by every subos in the home. A payload that resolves +-- through one subos's link directory answers for a subos it has no +-- business knowing about, and the answer goes stale when that subos is +-- removed. +-- * `/lib` holds glibc. It is a directory where a second libc can be +-- reached, which is the hazard build-in-subos.sh already documents. +-- +-- What actually gets written, measured rather than assumed: +-- +-- libxcb.so.1 RUNPATH = /lib : /lib : /lib +-- : /lib64 : /lib +-- +-- The per-package closure comes first and decides; `closure_lib_paths` appends +-- the subos link directory itself, last, as a backstop. So the shortcut is +-- present but never load-bearing -- and the `$ORIGIN` this module asks for is +-- dropped by libxpkg in favour of the payload's own absolute libdir, which is +-- equivalent here because xlings never relocates a payload. +-- +-- Design: xlings/.agents/docs/2026-08-07-graphics-experience-industry-survey-and-plan.md §S1 + +import("xim.libxpkg.log") +import("xim.libxpkg.elfpatch") + +local selfcontain = {} + +-- Stamp this payload's own dependency closure onto its shared libraries. +-- +-- selfcontain.seal(pkginfo.install_dir()) +-- selfcontain.seal(pkginfo.install_dir(), { "lib", "lib64" }) +-- +-- `$ORIGIN` stays first: it is what the upstream build shipped, it keeps a +-- payload's intra-package references working if the tree is ever relocated, and +-- it costs one stat per lookup that almost always hits. +-- +-- Returns true when the payload was patched, false when this client is too old +-- -- never nil, so a caller can branch. A false is WARNED rather than silent: +-- the package still installs and still works on any host that has the +-- dependency, which is precisely the failure mode that hid this for so long. +-- Refuse to call an install that produced nothing a success. +-- +-- Every recipe here ends `os.mv(srcdir, install_dir); return true`, and the +-- move is not checked. When the extracted source directory is already gone the +-- move does nothing, `install()` returns true anyway, and xlings prints +-- `✓ pkg@ver done` over an EMPTY payload directory. +-- +-- That is not hypothetical. CI registers each changed recipe under `local:` +-- while its dependents still resolve `xim:`, so one package+version can be +-- installed twice from one extraction. Reproduced verbatim: +-- +-- xim:libffi@3.4.4 installed as a dependency -- consumes the srcdir +-- local:libffi@3.4.4 ✓ done, 1 package installed -- payload is empty +-- +-- and the only thing that complained was the *config* hook, two steps later, +-- with a message about pkgconfig globs. The error named the wrong subsystem +-- because by then nothing remembered that the payload never arrived. +-- +-- Checked here because this is the one hook every sealed recipe already calls, +-- and because it is the last moment inside install() where the truth is cheap. +-- +-- It will NOT fire in CI's install test, and that is not a bug in the check. +-- `xlings config --add-xpkg` registers a recipe under `local:` without the +-- index's `libs/`, so `import("xim.pkgindex.selfcontain")` yields a permissive +-- proxy and every call through it is a truthy no-op. The same is true of +-- `selfcontain.seal` itself: **the linux-install-test job does not exercise the +-- seal**, and a green run there says nothing about whether payloads are sealed. +-- The evidence for that lives in verify-stack.sh cell 6, which runs a real +-- `xim:` install in a bwrap with no /usr. +local function _assert_payload(install_dir, libdirs) + for _, sub in ipairs(libdirs) do + if os.isdir(path.join(install_dir, sub)) then return true end + end + error(string.format( + "install produced no payload: %s has none of {%s}. The extracted source " + .. "directory was most likely already consumed by another install of the " + .. "same package and version (a second namespace, e.g. xim: and local:), " + .. "and this recipe's os.mv silently did nothing.", + install_dir, table.concat(libdirs, ", "))) +end + +function selfcontain.seal(install_dir, libdirs) + local dirs = libdirs or { "lib", "lib64" } + _assert_payload(install_dir, dirs) + + -- type(), not truthiness: import() answers an unknown module with a + -- permissive proxy whose every key is truthy, so `if elfpatch.x then` + -- takes the new branch on clients that then discard the call. + if type(elfpatch.closure_lib_paths) ~= "function" + or type(elfpatch.patch_elf_loader_rpath) ~= "function" then + log.warn("this xlings cannot compute a dependency closure; %s keeps its " + .. "as-shipped RPATH and will resolve its dependencies from " + .. "the HOST. Run `xlings self update`.", install_dir) + return false + end + + local closure = elfpatch.closure_lib_paths() + if not closure or #closure == 0 then + -- A package with no runtime deps and no self libdir: nothing to say. + return true + end + + local rpath = { "$ORIGIN" } + for _, d in ipairs(closure) do table.insert(rpath, d) end + + -- Both, always, unless the caller says otherwise: `lib` is the convention + -- for the X11 and mesa payloads, `lib64` for the toolchain ones + -- (gcc-runtime ships only lib64). A directory that does not exist + -- collects no targets, so naming both costs nothing and forgetting one + -- silently leaves that payload resolving from the host. + local r = elfpatch.patch_elf_loader_rpath(install_dir, { + libs = dirs, + rpath = rpath, + -- No shrink. --shrink-rpath keeps only the entries that satisfy a + -- current DT_NEEDED, which would drop exactly the directories a + -- dlopen needs later -- mesa's driver modules are loaded by path and + -- name nothing at link time. + shrink = false, + }) + if r and r.failed and r.failed > 0 then + log.warn("%d/%d libraries in %s could not be patched; those will " + .. "resolve from the host", r.failed, r.scanned, install_dir) + end + return true +end + +return selfcontain diff --git a/pkgs/e/elfutils.lua b/pkgs/e/elfutils.lua index 4ca12e08..ff1390f0 100644 --- a/pkgs/e/elfutils.lua +++ b/pkgs/e/elfutils.lua @@ -40,11 +40,16 @@ import("xim.libxpkg.pkginfo") import("xim.libxpkg.system") import("xim.libxpkg.xvm") import("xim.pkgindex.sysroot") +import("xim.pkgindex.selfcontain") function install() local dir = pkginfo.install_dir() os.tryrm(dir) os.mv("elfutils-0.191", dir) + + -- Stamp this payload's own dependency closure onto its libraries, so they + -- resolve from our payloads and not from the host's ld.so.cache. + selfcontain.seal(pkginfo.install_dir()) return true end diff --git a/pkgs/e/expat.lua b/pkgs/e/expat.lua index e14f7d9d..858cea27 100644 --- a/pkgs/e/expat.lua +++ b/pkgs/e/expat.lua @@ -14,6 +14,7 @@ package = { xvm_enable = true, xpm = { linux = { + deps = { "xim:glibc" }, -- libexpat.so.1 ships under lib/. Declaring the libdir here -- lets xlings' predicate-driven elfpatch append it to every -- consumer's RPATH so `deps.runtime = { "xim:expat@2.6.2" }` @@ -39,6 +40,7 @@ package = { import("xim.libxpkg.pkginfo") import("xim.libxpkg.system") import("xim.libxpkg.xvm") +import("xim.pkgindex.selfcontain") local libs = { "libexpat.so", "libexpat.so.1" } @@ -46,6 +48,10 @@ function install() local srcdir = pkginfo.name() .. "-" .. pkginfo.version() .. "-linux-x86_64" os.tryrm(pkginfo.install_dir()) os.mv(srcdir, pkginfo.install_dir()) + + -- Stamp this payload's own dependency closure onto its libraries, so + -- they resolve from our payloads and not from the host's ld.so.cache. + selfcontain.seal(pkginfo.install_dir()) return true end diff --git a/pkgs/f/fontconfig.lua b/pkgs/f/fontconfig.lua index 2668503d..7c4383b2 100644 --- a/pkgs/f/fontconfig.lua +++ b/pkgs/f/fontconfig.lua @@ -14,7 +14,14 @@ package = { xvm_enable = true, xpm = { linux = { - deps = { "freetype@2.13.2", "expat@2.6.2" }, + -- `xim:`-qualified, not bare. A bare name resolves fine while only + -- one index provides it -- and CI registers every CHANGED recipe a + -- second time under `local:`, so the moment expat is touched in the + -- same PR the bare name becomes ambiguous and fontconfig's install + -- fails with a candidate list. That is a property of the PR, not of + -- the recipe, so it stays latent until some unrelated change hits + -- both packages at once. + deps = { "xim:freetype@2.13.2", "xim:expat@2.6.2", "xim:glibc" }, ["latest"] = { ref = "2.15.0" }, ["2.15.0"] = { url = { @@ -30,6 +37,7 @@ package = { import("xim.libxpkg.pkginfo") import("xim.libxpkg.system") import("xim.libxpkg.xvm") +import("xim.pkgindex.selfcontain") local libs = { "libfontconfig.so", "libfontconfig.so.1" } @@ -37,6 +45,10 @@ function install() local srcdir = pkginfo.name() .. "-" .. pkginfo.version() .. "-linux-x86_64" os.tryrm(pkginfo.install_dir()) os.mv(srcdir, pkginfo.install_dir()) + + -- Stamp this payload's own dependency closure onto its libraries, so + -- they resolve from our payloads and not from the host's ld.so.cache. + selfcontain.seal(pkginfo.install_dir()) return true end diff --git a/pkgs/g/gcc-runtime.lua b/pkgs/g/gcc-runtime.lua index 47caf7bc..a57f1823 100644 --- a/pkgs/g/gcc-runtime.lua +++ b/pkgs/g/gcc-runtime.lua @@ -62,6 +62,7 @@ package = { import("xim.libxpkg.pkginfo") import("xim.libxpkg.xvm") +import("xim.pkgindex.selfcontain") function install() -- Tarball extracts to gcc-runtime--linux-x86_64/lib64/. Move @@ -72,6 +73,10 @@ function install() local srcdir = pkginfo.install_file():replace(".tar.gz", "") os.tryrm(pkginfo.install_dir()) os.mv(srcdir, pkginfo.install_dir()) + + -- Stamp this payload's own dependency closure onto its libraries, so they + -- resolve from our payloads and not from the host's ld.so.cache. + selfcontain.seal(pkginfo.install_dir()) return true end diff --git a/pkgs/g/graphics.lua b/pkgs/g/graphics.lua index c1ccfb9b..003b0513 100644 --- a/pkgs/g/graphics.lua +++ b/pkgs/g/graphics.lua @@ -128,6 +128,13 @@ package = { "xim:libXrender@>=0.9", "xim:libxkbcommon@>=1.7", "xim:fontconfig@>=2.14", + -- Non-fatal when absent (single-screen fallback), which is + -- exactly why it went unnoticed until a real toolkit ran. + "libXinerama@>=1.1", + -- An ICD is a driver; a driver needs a loader. mesa ships + -- RADV and its manifest, and without libvulkan.so.1 nothing + -- ever reads it -- which also leaves zink dead. + "vulkan-loader@>=1.4", }, }, ["latest"] = { ref = "0.1.0" }, diff --git a/pkgs/l/libX11.lua b/pkgs/l/libX11.lua index a7ed240e..a0a51e64 100644 --- a/pkgs/l/libX11.lua +++ b/pkgs/l/libX11.lua @@ -17,7 +17,7 @@ package = { xpm = { linux = { - deps = { "xim:libxcb@>=1.17", "xim:xorgproto@>=2024" }, + deps = { "xim:libxcb@>=1.17", "xim:xorgproto@>=2024", "xim:glibc" }, -- elfpatch reads this from each dependency and writes the consumer's -- RPATH, which is what makes the stack resolve without anyone -- setting LD_LIBRARY_PATH. Same mechanism `gcc-runtime` uses. @@ -40,11 +40,16 @@ import("xim.libxpkg.pkginfo") import("xim.libxpkg.system") import("xim.libxpkg.xvm") import("xim.pkgindex.sysroot") +import("xim.pkgindex.selfcontain") function install() local dir = pkginfo.install_dir() os.tryrm(dir) os.mv("libX11-1.8.10", dir) + + -- Stamp this payload's own dependency closure onto its libraries, so + -- they resolve from our payloads and not from the host's ld.so.cache. + selfcontain.seal(pkginfo.install_dir()) return true end diff --git a/pkgs/l/libXau.lua b/pkgs/l/libXau.lua index 890f7c6e..3fb2b617 100644 --- a/pkgs/l/libXau.lua +++ b/pkgs/l/libXau.lua @@ -17,7 +17,7 @@ package = { xpm = { linux = { - deps = { "xim:xorgproto@>=2024" }, + deps = { "xim:xorgproto@>=2024", "xim:glibc" }, -- elfpatch reads this from each dependency and writes the consumer's -- RPATH, which is what makes the stack resolve without anyone -- setting LD_LIBRARY_PATH. Same mechanism `gcc-runtime` uses. @@ -40,11 +40,16 @@ import("xim.libxpkg.pkginfo") import("xim.libxpkg.system") import("xim.libxpkg.xvm") import("xim.pkgindex.sysroot") +import("xim.pkgindex.selfcontain") function install() local dir = pkginfo.install_dir() os.tryrm(dir) os.mv("libXau-1.0.11", dir) + + -- Stamp this payload's own dependency closure onto its libraries, so + -- they resolve from our payloads and not from the host's ld.so.cache. + selfcontain.seal(pkginfo.install_dir()) return true end diff --git a/pkgs/l/libXcursor.lua b/pkgs/l/libXcursor.lua index 94038b5d..668f76af 100644 --- a/pkgs/l/libXcursor.lua +++ b/pkgs/l/libXcursor.lua @@ -17,7 +17,7 @@ package = { xpm = { linux = { - deps = { "xim:libXrender@>=0.9", "xim:libXfixes@>=6.0" }, + deps = { "xim:libXrender@>=0.9", "xim:libXfixes@>=6.0", "xim:glibc", "xim:libX11" }, -- elfpatch reads this from each dependency and writes the consumer's -- RPATH, which is what makes the stack resolve without anyone -- setting LD_LIBRARY_PATH. Same mechanism `gcc-runtime` uses. @@ -40,11 +40,16 @@ import("xim.libxpkg.pkginfo") import("xim.libxpkg.system") import("xim.libxpkg.xvm") import("xim.pkgindex.sysroot") +import("xim.pkgindex.selfcontain") function install() local dir = pkginfo.install_dir() os.tryrm(dir) os.mv("libXcursor-1.2.3", dir) + + -- Stamp this payload's own dependency closure onto its libraries, so + -- they resolve from our payloads and not from the host's ld.so.cache. + selfcontain.seal(pkginfo.install_dir()) return true end diff --git a/pkgs/l/libXdmcp.lua b/pkgs/l/libXdmcp.lua index 80ce6ba2..5703bae5 100644 --- a/pkgs/l/libXdmcp.lua +++ b/pkgs/l/libXdmcp.lua @@ -17,7 +17,7 @@ package = { xpm = { linux = { - deps = { "xim:xorgproto@>=2024" }, + deps = { "xim:xorgproto@>=2024", "xim:glibc" }, -- elfpatch reads this from each dependency and writes the consumer's -- RPATH, which is what makes the stack resolve without anyone -- setting LD_LIBRARY_PATH. Same mechanism `gcc-runtime` uses. @@ -40,11 +40,16 @@ import("xim.libxpkg.pkginfo") import("xim.libxpkg.system") import("xim.libxpkg.xvm") import("xim.pkgindex.sysroot") +import("xim.pkgindex.selfcontain") function install() local dir = pkginfo.install_dir() os.tryrm(dir) os.mv("libXdmcp-1.1.5", dir) + + -- Stamp this payload's own dependency closure onto its libraries, so + -- they resolve from our payloads and not from the host's ld.so.cache. + selfcontain.seal(pkginfo.install_dir()) return true end diff --git a/pkgs/l/libXext.lua b/pkgs/l/libXext.lua index 7c5c5718..051efa6f 100644 --- a/pkgs/l/libXext.lua +++ b/pkgs/l/libXext.lua @@ -17,7 +17,7 @@ package = { xpm = { linux = { - deps = { "xim:libX11@>=1.8" }, + deps = { "xim:libX11@>=1.8", "xim:glibc" }, -- elfpatch reads this from each dependency and writes the consumer's -- RPATH, which is what makes the stack resolve without anyone -- setting LD_LIBRARY_PATH. Same mechanism `gcc-runtime` uses. @@ -40,11 +40,16 @@ import("xim.libxpkg.pkginfo") import("xim.libxpkg.system") import("xim.libxpkg.xvm") import("xim.pkgindex.sysroot") +import("xim.pkgindex.selfcontain") function install() local dir = pkginfo.install_dir() os.tryrm(dir) os.mv("libXext-1.3.6", dir) + + -- Stamp this payload's own dependency closure onto its libraries, so + -- they resolve from our payloads and not from the host's ld.so.cache. + selfcontain.seal(pkginfo.install_dir()) return true end diff --git a/pkgs/l/libXfixes.lua b/pkgs/l/libXfixes.lua index 73389145..bbf1be19 100644 --- a/pkgs/l/libXfixes.lua +++ b/pkgs/l/libXfixes.lua @@ -40,11 +40,16 @@ import("xim.libxpkg.pkginfo") import("xim.libxpkg.system") import("xim.libxpkg.xvm") import("xim.pkgindex.sysroot") +import("xim.pkgindex.selfcontain") function install() local dir = pkginfo.install_dir() os.tryrm(dir) os.mv("libXfixes-6.0.1", dir) + + -- Stamp this payload's own dependency closure onto its libraries, so they + -- resolve from our payloads and not from the host's ld.so.cache. + selfcontain.seal(pkginfo.install_dir()) return true end diff --git a/pkgs/l/libXi.lua b/pkgs/l/libXi.lua index 8064a954..9010daac 100644 --- a/pkgs/l/libXi.lua +++ b/pkgs/l/libXi.lua @@ -17,7 +17,7 @@ package = { xpm = { linux = { - deps = { "xim:libXext@>=1.3", "xim:libXfixes@>=6.0" }, + deps = { "xim:libXext@>=1.3", "xim:libXfixes@>=6.0", "xim:glibc", "xim:libX11" }, -- elfpatch reads this from each dependency and writes the consumer's -- RPATH, which is what makes the stack resolve without anyone -- setting LD_LIBRARY_PATH. Same mechanism `gcc-runtime` uses. @@ -40,11 +40,16 @@ import("xim.libxpkg.pkginfo") import("xim.libxpkg.system") import("xim.libxpkg.xvm") import("xim.pkgindex.sysroot") +import("xim.pkgindex.selfcontain") function install() local dir = pkginfo.install_dir() os.tryrm(dir) os.mv("libXi-1.8.2", dir) + + -- Stamp this payload's own dependency closure onto its libraries, so + -- they resolve from our payloads and not from the host's ld.so.cache. + selfcontain.seal(pkginfo.install_dir()) return true end diff --git a/pkgs/l/libXinerama.lua b/pkgs/l/libXinerama.lua new file mode 100644 index 00000000..7d56abc9 --- /dev/null +++ b/pkgs/l/libXinerama.lua @@ -0,0 +1,92 @@ +package = { + spec = "2", + + homepage = "https://www.x.org", + name = "libXinerama", + description = "X11 Xinerama extension — multi-monitor screen geometry", + + authors = {"X.Org Foundation"}, + licenses = {"MIT"}, + repo = "https://gitlab.freedesktop.org/xorg/lib/libXinerama", + + type = "package", + archs = {"x86_64"}, + status = "stable", + categories = {"graphics", "lib"}, + keywords = {"libxinerama", "graphics", "x11", "multi-monitor"}, + + -- Why this is in the stack at all. + -- + -- It is not on any DT_NEEDED path: mesa does not need it, and nothing in the + -- rendering closure does. A toolkit dlopens it to ask how many monitors + -- there are and where they are. So it appears in no dependency graph derived + -- from ELF metadata, and the surfaceless probe that was this stack's + -- acceptance criterion could never miss it. + -- + -- godot found it: with `graphics` installed it stops adding host library + -- directories to its RPATH, and then printed + -- libXinerama.so.1: cannot open shared object file + -- while still starting, because the failure is non-fatal -- it falls back to + -- single-screen geometry. A non-fatal dlopen failure is exactly the kind of + -- gap that survives every test that only asks "did it run". + xpm = { + linux = { + deps = { "xim:libX11@>=1.8", "xim:libXext@>=1.3", "xim:glibc" }, + -- elfpatch reads this from each dependency and writes the consumer's + -- RPATH, which is what makes the stack resolve without anyone + -- setting LD_LIBRARY_PATH. + exports = { + runtime = { libdirs = { "lib" } }, + }, + ["latest"] = { ref = "1.1.5" }, + ["1.1.5"] = { + url = { + GLOBAL = "https://github.com/xlings-res/libXinerama/releases/download/1.1.5/libXinerama-1.1.5-linux-x86_64.tar.gz", + CN = "https://gitcode.com/xlings-res/libXinerama/releases/download/1.1.5/libXinerama-1.1.5-linux-x86_64.tar.gz", + }, + sha256 = "8dfb7eb3459d920f6cc8209ee7db0a1b84cb3b4687f23f7a70442ee5c69802b3", + }, + }, + }, +} + +import("xim.libxpkg.pkginfo") +import("xim.libxpkg.system") +import("xim.libxpkg.xvm") +import("xim.pkgindex.sysroot") +import("xim.pkgindex.selfcontain") + +function install() + local dir = pkginfo.install_dir() + os.tryrm(dir) + os.mv("libXinerama-1.1.5", dir) + + -- Stamp this payload's own dependency closure onto its libraries, so + -- they resolve from our payloads and not from the host's ld.so.cache. + selfcontain.seal(pkginfo.install_dir()) + return true +end + +function config() + local binding = package.name .. "@" .. pkginfo.version() + + xvm.add(package.name) + sysroot.declare_libs(pkginfo.install_dir(), "lib", binding, pkginfo.version()) + + -- _tree, not declare_headers: this contributes `X11/extensions/Xinerama.h` + -- to an `X11/` directory eight other packages also write into. Declaring + -- that directory would place it as one asset -- rename(2) over the sysroot's + -- copy -- so the last install wins and the others vanish. + if not sysroot.declare_headers_tree(pkginfo.install_dir(), "include", + "usr/include", binding) then + sysroot.install_headers_tree( + path.join(pkginfo.install_dir(), "include"), + path.join(system.subos_sysrootdir(), "usr", "include")) + end + return true +end + +function uninstall() + xvm.remove(package.name) + return true +end diff --git a/pkgs/l/libXrandr.lua b/pkgs/l/libXrandr.lua index 229b8b49..bbaab9b6 100644 --- a/pkgs/l/libXrandr.lua +++ b/pkgs/l/libXrandr.lua @@ -17,7 +17,7 @@ package = { xpm = { linux = { - deps = { "xim:libXext@>=1.3", "xim:libXrender@>=0.9" }, + deps = { "xim:libXext@>=1.3", "xim:libXrender@>=0.9", "xim:glibc", "xim:libX11" }, -- elfpatch reads this from each dependency and writes the consumer's -- RPATH, which is what makes the stack resolve without anyone -- setting LD_LIBRARY_PATH. Same mechanism `gcc-runtime` uses. @@ -40,11 +40,16 @@ import("xim.libxpkg.pkginfo") import("xim.libxpkg.system") import("xim.libxpkg.xvm") import("xim.pkgindex.sysroot") +import("xim.pkgindex.selfcontain") function install() local dir = pkginfo.install_dir() os.tryrm(dir) os.mv("libXrandr-1.5.4", dir) + + -- Stamp this payload's own dependency closure onto its libraries, so + -- they resolve from our payloads and not from the host's ld.so.cache. + selfcontain.seal(pkginfo.install_dir()) return true end diff --git a/pkgs/l/libXrender.lua b/pkgs/l/libXrender.lua index 29a15688..d7806c22 100644 --- a/pkgs/l/libXrender.lua +++ b/pkgs/l/libXrender.lua @@ -17,7 +17,7 @@ package = { xpm = { linux = { - deps = { "xim:libX11@>=1.8" }, + deps = { "xim:libX11@>=1.8", "xim:glibc" }, -- elfpatch reads this from each dependency and writes the consumer's -- RPATH, which is what makes the stack resolve without anyone -- setting LD_LIBRARY_PATH. Same mechanism `gcc-runtime` uses. @@ -40,11 +40,16 @@ import("xim.libxpkg.pkginfo") import("xim.libxpkg.system") import("xim.libxpkg.xvm") import("xim.pkgindex.sysroot") +import("xim.pkgindex.selfcontain") function install() local dir = pkginfo.install_dir() os.tryrm(dir) os.mv("libXrender-0.9.11", dir) + + -- Stamp this payload's own dependency closure onto its libraries, so + -- they resolve from our payloads and not from the host's ld.so.cache. + selfcontain.seal(pkginfo.install_dir()) return true end diff --git a/pkgs/l/libXxf86vm.lua b/pkgs/l/libXxf86vm.lua index bdf37942..c927ecb5 100644 --- a/pkgs/l/libXxf86vm.lua +++ b/pkgs/l/libXxf86vm.lua @@ -40,11 +40,16 @@ import("xim.libxpkg.pkginfo") import("xim.libxpkg.system") import("xim.libxpkg.xvm") import("xim.pkgindex.sysroot") +import("xim.pkgindex.selfcontain") function install() local dir = pkginfo.install_dir() os.tryrm(dir) os.mv("libXxf86vm-1.1.6", dir) + + -- Stamp this payload's own dependency closure onto its libraries, so they + -- resolve from our payloads and not from the host's ld.so.cache. + selfcontain.seal(pkginfo.install_dir()) return true end diff --git a/pkgs/l/libdrm.lua b/pkgs/l/libdrm.lua index daa23ffb..4177ef11 100644 --- a/pkgs/l/libdrm.lua +++ b/pkgs/l/libdrm.lua @@ -17,7 +17,7 @@ package = { xpm = { linux = { - deps = { "xim:libpciaccess@>=0.18" }, + deps = { "xim:libpciaccess@>=0.18", "xim:glibc" }, -- elfpatch reads this from each dependency and writes the consumer's -- RPATH, which is what makes the stack resolve without anyone -- setting LD_LIBRARY_PATH. Same mechanism `gcc-runtime` uses. @@ -40,11 +40,16 @@ import("xim.libxpkg.pkginfo") import("xim.libxpkg.system") import("xim.libxpkg.xvm") import("xim.pkgindex.sysroot") +import("xim.pkgindex.selfcontain") function install() local dir = pkginfo.install_dir() os.tryrm(dir) os.mv("libdrm-2.4.123", dir) + + -- Stamp this payload's own dependency closure onto its libraries, so + -- they resolve from our payloads and not from the host's ld.so.cache. + selfcontain.seal(pkginfo.install_dir()) return true end diff --git a/pkgs/l/libffi.lua b/pkgs/l/libffi.lua index c502e61c..1216214f 100644 --- a/pkgs/l/libffi.lua +++ b/pkgs/l/libffi.lua @@ -14,6 +14,7 @@ package = { xvm_enable = true, xpm = { linux = { + deps = { "xim:glibc" }, ["latest"] = { ref = "3.4.4" }, ["3.4.4"] = { url = { @@ -29,6 +30,7 @@ package = { import("xim.libxpkg.pkginfo") import("xim.libxpkg.system") import("xim.libxpkg.xvm") +import("xim.pkgindex.selfcontain") local libs = { "libffi.so", "libffi.so.7" } @@ -36,6 +38,10 @@ function install() local srcdir = pkginfo.name() .. "-" .. pkginfo.version() .. "-linux-x86_64" os.tryrm(pkginfo.install_dir()) os.mv(srcdir, pkginfo.install_dir()) + + -- Stamp this payload's own dependency closure onto its libraries, so + -- they resolve from our payloads and not from the host's ld.so.cache. + selfcontain.seal(pkginfo.install_dir()) return true end diff --git a/pkgs/l/libglvnd.lua b/pkgs/l/libglvnd.lua index 9bb0c434..3a9a2849 100644 --- a/pkgs/l/libglvnd.lua +++ b/pkgs/l/libglvnd.lua @@ -17,7 +17,7 @@ package = { xpm = { linux = { - deps = { "xim:libX11@>=1.8", "xim:libXext@>=1.3" }, + deps = { "xim:libX11@>=1.8", "xim:libXext@>=1.3", "xim:glibc" }, -- elfpatch reads this from each dependency and writes the consumer's -- RPATH, which is what makes the stack resolve without anyone -- setting LD_LIBRARY_PATH. Same mechanism `gcc-runtime` uses. @@ -40,11 +40,16 @@ import("xim.libxpkg.pkginfo") import("xim.libxpkg.system") import("xim.libxpkg.xvm") import("xim.pkgindex.sysroot") +import("xim.pkgindex.selfcontain") function install() local dir = pkginfo.install_dir() os.tryrm(dir) os.mv("libglvnd-1.7.0", dir) + + -- Stamp this payload's own dependency closure onto its libraries, so + -- they resolve from our payloads and not from the host's ld.so.cache. + selfcontain.seal(pkginfo.install_dir()) return true end diff --git a/pkgs/l/libllvm.lua b/pkgs/l/libllvm.lua index ca73a15f..d240f1bd 100644 --- a/pkgs/l/libllvm.lua +++ b/pkgs/l/libllvm.lua @@ -40,11 +40,16 @@ import("xim.libxpkg.pkginfo") import("xim.libxpkg.system") import("xim.libxpkg.xvm") import("xim.pkgindex.sysroot") +import("xim.pkgindex.selfcontain") function install() local dir = pkginfo.install_dir() os.tryrm(dir) os.mv("libllvm-20.1.7", dir) + + -- Stamp this payload's own dependency closure onto its libraries, so they + -- resolve from our payloads and not from the host's ld.so.cache. + selfcontain.seal(pkginfo.install_dir()) return true end diff --git a/pkgs/l/libpciaccess.lua b/pkgs/l/libpciaccess.lua index 584a1a95..ed4cc8a2 100644 --- a/pkgs/l/libpciaccess.lua +++ b/pkgs/l/libpciaccess.lua @@ -17,7 +17,7 @@ package = { xpm = { linux = { - deps = { "xim:zlib@>=1.2" }, + deps = { "xim:zlib@>=1.2", "xim:glibc" }, -- elfpatch reads this from each dependency and writes the consumer's -- RPATH, which is what makes the stack resolve without anyone -- setting LD_LIBRARY_PATH. Same mechanism `gcc-runtime` uses. @@ -40,11 +40,16 @@ import("xim.libxpkg.pkginfo") import("xim.libxpkg.system") import("xim.libxpkg.xvm") import("xim.pkgindex.sysroot") +import("xim.pkgindex.selfcontain") function install() local dir = pkginfo.install_dir() os.tryrm(dir) os.mv("libpciaccess-0.18.1", dir) + + -- Stamp this payload's own dependency closure onto its libraries, so + -- they resolve from our payloads and not from the host's ld.so.cache. + selfcontain.seal(pkginfo.install_dir()) return true end diff --git a/pkgs/l/libxcb.lua b/pkgs/l/libxcb.lua index fb11071f..443a1a51 100644 --- a/pkgs/l/libxcb.lua +++ b/pkgs/l/libxcb.lua @@ -17,7 +17,7 @@ package = { xpm = { linux = { - deps = { "xim:libXau@>=1.0", "xim:libXdmcp@>=1.1" }, + deps = { "xim:libXau@>=1.0", "xim:libXdmcp@>=1.1", "xim:glibc" }, -- elfpatch reads this from each dependency and writes the consumer's -- RPATH, which is what makes the stack resolve without anyone -- setting LD_LIBRARY_PATH. Same mechanism `gcc-runtime` uses. @@ -40,11 +40,16 @@ import("xim.libxpkg.pkginfo") import("xim.libxpkg.system") import("xim.libxpkg.xvm") import("xim.pkgindex.sysroot") +import("xim.pkgindex.selfcontain") function install() local dir = pkginfo.install_dir() os.tryrm(dir) os.mv("libxcb-1.17.0", dir) + + -- Stamp this payload's own dependency closure onto its libraries, so + -- they resolve from our payloads and not from the host's ld.so.cache. + selfcontain.seal(pkginfo.install_dir()) return true end diff --git a/pkgs/l/libxkbcommon.lua b/pkgs/l/libxkbcommon.lua index 10167b00..88071fc8 100644 --- a/pkgs/l/libxkbcommon.lua +++ b/pkgs/l/libxkbcommon.lua @@ -17,7 +17,7 @@ package = { xpm = { linux = { - deps = {}, + deps = { "xim:glibc", "xim:libxcb" }, -- elfpatch reads this from each dependency and writes the consumer's -- RPATH, which is what makes the stack resolve without anyone -- setting LD_LIBRARY_PATH. Same mechanism `gcc-runtime` uses. @@ -40,11 +40,16 @@ import("xim.libxpkg.pkginfo") import("xim.libxpkg.system") import("xim.libxpkg.xvm") import("xim.pkgindex.sysroot") +import("xim.pkgindex.selfcontain") function install() local dir = pkginfo.install_dir() os.tryrm(dir) os.mv("libxkbcommon-1.7.0", dir) + + -- Stamp this payload's own dependency closure onto its libraries, so + -- they resolve from our payloads and not from the host's ld.so.cache. + selfcontain.seal(pkginfo.install_dir()) return true end diff --git a/pkgs/l/libxml2.lua b/pkgs/l/libxml2.lua index 43216d44..b98b8610 100644 --- a/pkgs/l/libxml2.lua +++ b/pkgs/l/libxml2.lua @@ -18,6 +18,7 @@ package = { xpm = { linux = { + deps = { "xim:glibc" }, ["latest"] = { ref = "2.13.5" }, ["2.13.5"] = { url = { @@ -33,6 +34,7 @@ package = { import("xim.libxpkg.pkginfo") import("xim.libxpkg.system") import("xim.libxpkg.xvm") +import("xim.pkgindex.selfcontain") local libs = { "libxml2.so", "libxml2.so.2", @@ -42,6 +44,10 @@ function install() local srcdir = "libxml2-" .. pkginfo.version() .. "-linux-x86_64" os.tryrm(pkginfo.install_dir()) os.mv(srcdir, pkginfo.install_dir()) + + -- Stamp this payload's own dependency closure onto its libraries, so + -- they resolve from our payloads and not from the host's ld.so.cache. + selfcontain.seal(pkginfo.install_dir()) return true end diff --git a/pkgs/l/libxshmfence.lua b/pkgs/l/libxshmfence.lua index 75a867f8..d51f1f65 100644 --- a/pkgs/l/libxshmfence.lua +++ b/pkgs/l/libxshmfence.lua @@ -40,11 +40,16 @@ import("xim.libxpkg.pkginfo") import("xim.libxpkg.system") import("xim.libxpkg.xvm") import("xim.pkgindex.sysroot") +import("xim.pkgindex.selfcontain") function install() local dir = pkginfo.install_dir() os.tryrm(dir) os.mv("libxshmfence-1.3.2", dir) + + -- Stamp this payload's own dependency closure onto its libraries, so they + -- resolve from our payloads and not from the host's ld.so.cache. + selfcontain.seal(pkginfo.install_dir()) return true end diff --git a/pkgs/m/mesa.lua b/pkgs/m/mesa.lua index 551bde03..994fe04e 100644 --- a/pkgs/m/mesa.lua +++ b/pkgs/m/mesa.lua @@ -106,6 +106,7 @@ import("xim.libxpkg.system") import("xim.libxpkg.xvm") import("xim.libxpkg.subos") import("xim.pkgindex.sysroot") +import("xim.pkgindex.selfcontain") import("xim.pkgindex.graphics") function install() @@ -163,6 +164,10 @@ function install() end))) end end + + -- Stamp this payload's own dependency closure onto its libraries, so they + -- resolve from our payloads and not from the host's ld.so.cache. + selfcontain.seal(pkginfo.install_dir()) return true end @@ -218,6 +223,12 @@ function config() graphics.declare_dri(dir, "lib/dri", tag) graphics.declare_egl_vendor(dir, "share/glvnd/egl_vendor.d/50_mesa.json", tag) + -- The Vulkan ICD manifests, into the subos for the same reason the vendor + -- JSON goes there: the loader reads $XDG_DATA_DIRS/vulkan/icd.d, and a + -- manifest that stays in the payload is never found -- the loader silently + -- serves the HOST's ICDs instead. + graphics.declare_vulkan_icd(dir, "share/vulkan/icd.d", tag) + -- And the shell scope as well, from the same table, so entering the subos -- and running a program through its shim cannot disagree. graphics.declare_subos_env(tag) diff --git a/pkgs/v/vulkan-headers.lua b/pkgs/v/vulkan-headers.lua new file mode 100644 index 00000000..3ce3f504 --- /dev/null +++ b/pkgs/v/vulkan-headers.lua @@ -0,0 +1,64 @@ +package = { + spec = "2", + + homepage = "https://www.khronos.org/vulkan/", + name = "vulkan-headers", + description = "Vulkan API headers and registry", + + authors = {"The Khronos Group"}, + licenses = {"Apache-2.0"}, + repo = "https://github.com/KhronosGroup/Vulkan-Headers", + + type = "package", + archs = {"x86_64"}, + status = "stable", + categories = {"graphics", "vulkan", "lib"}, + keywords = {"vulkan", "graphics", "vulkan-headers"}, + + xpm = { + linux = { + deps = { "xim:glibc@>=2.38" }, + exports = { + runtime = { libdirs = { "lib" } }, + }, + ["latest"] = { ref = "1.4.313" }, + ["1.4.313"] = { + url = { + GLOBAL = "https://github.com/xlings-res/vulkan-headers/releases/download/1.4.313/vulkan-headers-1.4.313-linux-x86_64.tar.gz", + CN = "https://gitcode.com/xlings-res/vulkan-headers/releases/download/1.4.313/vulkan-headers-1.4.313-linux-x86_64.tar.gz", + }, + sha256 = "bb305ab10c4d5c5ce5935099b4b8f364376e360bea53fee85a5e86370cef860a", + }, + }, + }, +} + +import("xim.libxpkg.pkginfo") +import("xim.libxpkg.system") +import("xim.libxpkg.xvm") +import("xim.pkgindex.sysroot") + +function install() + local dir = pkginfo.install_dir() + os.tryrm(dir) + os.mv("vulkan-headers-1.4.313", dir) + return true +end + +function config() + local binding = package.name .. "@" .. pkginfo.version() + xvm.add(package.name) + sysroot.declare_libs(pkginfo.install_dir(), "lib", binding, pkginfo.version()) + if not sysroot.declare_headers_tree(pkginfo.install_dir(), "include", + "usr/include", binding) then + sysroot.install_headers_tree( + path.join(pkginfo.install_dir(), "include"), + path.join(system.subos_sysrootdir(), "usr", "include")) + end + return true +end + +function uninstall() + xvm.remove(package.name) + return true +end diff --git a/pkgs/v/vulkan-loader.lua b/pkgs/v/vulkan-loader.lua new file mode 100644 index 00000000..dfd5a421 --- /dev/null +++ b/pkgs/v/vulkan-loader.lua @@ -0,0 +1,84 @@ +package = { + spec = "2", + + homepage = "https://www.khronos.org/vulkan/", + name = "vulkan-loader", + description = "Vulkan ICD loader - libvulkan.so.1, without which an ICD manifest is never read", + + authors = {"The Khronos Group"}, + licenses = {"Apache-2.0"}, + repo = "https://github.com/KhronosGroup/Vulkan-Loader", + + type = "package", + archs = {"x86_64"}, + status = "stable", + categories = {"graphics", "vulkan", "lib"}, + keywords = {"vulkan", "graphics", "vulkan-loader"}, + + -- Why the stack needs this at all. + -- + -- mesa already ships a Vulkan driver (RADV) and rewrites its ICD manifest to + -- an absolute path inside our payload -- but an ICD is a DRIVER, and a driver + -- is loaded BY a loader. Without libvulkan.so.1 the manifest sits there + -- unread: `vulkaninfo` cannot run, and zink (GL over Vulkan) is dead in a + -- payload that ships it. + -- + -- Discovery needs NO new declaration. The Vulkan loader searches + -- $XDG_DATA_DIRS/vulkan/icd.d, and mesa's config() already prepends its + -- share directory to XDG_DATA_DIRS. VK_DRIVER_FILES would be wrong here -- + -- it is an OVERRIDE that suppresses system discovery, so it would hide every + -- other ICD on the machine. + + xpm = { + linux = { + deps = { "xim:libX11@>=1.8", "xim:libxcb@>=1.17", "xim:libXrandr@>=1.5", + "xim:wayland@>=1.23", "xim:glibc@>=2.38" }, + exports = { + runtime = { libdirs = { "lib" } }, + }, + ["latest"] = { ref = "1.4.313" }, + ["1.4.313"] = { + url = { + GLOBAL = "https://github.com/xlings-res/vulkan-loader/releases/download/1.4.313/vulkan-loader-1.4.313-linux-x86_64.tar.gz", + CN = "https://gitcode.com/xlings-res/vulkan-loader/releases/download/1.4.313/vulkan-loader-1.4.313-linux-x86_64.tar.gz", + }, + sha256 = "4870e17d573117378132db72d338723c849bef5aa4ae3f01eb0aabbdfabd3c2b", + }, + }, + }, +} + +import("xim.libxpkg.pkginfo") +import("xim.libxpkg.system") +import("xim.libxpkg.xvm") +import("xim.pkgindex.sysroot") +import("xim.pkgindex.selfcontain") + +function install() + local dir = pkginfo.install_dir() + os.tryrm(dir) + os.mv("vulkan-loader-1.4.313", dir) + + -- Stamp this payload's own dependency closure onto its libraries, so + -- they resolve from our payloads and not from the host's ld.so.cache. + selfcontain.seal(pkginfo.install_dir()) + return true +end + +function config() + local binding = package.name .. "@" .. pkginfo.version() + xvm.add(package.name) + sysroot.declare_libs(pkginfo.install_dir(), "lib", binding, pkginfo.version()) + if not sysroot.declare_headers_tree(pkginfo.install_dir(), "include", + "usr/include", binding) then + sysroot.install_headers_tree( + path.join(pkginfo.install_dir(), "include"), + path.join(system.subos_sysrootdir(), "usr", "include")) + end + return true +end + +function uninstall() + xvm.remove(package.name) + return true +end diff --git a/pkgs/w/wayland.lua b/pkgs/w/wayland.lua index c3d2a844..ba8b7ce3 100644 --- a/pkgs/w/wayland.lua +++ b/pkgs/w/wayland.lua @@ -40,11 +40,16 @@ import("xim.libxpkg.pkginfo") import("xim.libxpkg.system") import("xim.libxpkg.xvm") import("xim.pkgindex.sysroot") +import("xim.pkgindex.selfcontain") function install() local dir = pkginfo.install_dir() os.tryrm(dir) os.mv("wayland-1.23.1", dir) + + -- Stamp this payload's own dependency closure onto its libraries, so they + -- resolve from our payloads and not from the host's ld.so.cache. + selfcontain.seal(pkginfo.install_dir()) return true end diff --git a/pkgs/z/zlib.lua b/pkgs/z/zlib.lua index de84be7c..72663253 100644 --- a/pkgs/z/zlib.lua +++ b/pkgs/z/zlib.lua @@ -18,6 +18,7 @@ package = { xpm = { linux = { + deps = { "xim:glibc" }, ["latest"] = { ref = "1.3.1" }, ["1.3.1"] = { url = { @@ -33,6 +34,7 @@ package = { import("xim.libxpkg.pkginfo") import("xim.libxpkg.system") import("xim.libxpkg.xvm") +import("xim.pkgindex.selfcontain") import("xim.libxpkg.log") local libs = { @@ -43,6 +45,10 @@ function install() local srcdir = "zlib-" .. pkginfo.version() .. "-linux-x86_64" os.tryrm(pkginfo.install_dir()) os.mv(srcdir, pkginfo.install_dir()) + + -- Stamp this payload's own dependency closure onto its libraries, so + -- they resolve from our payloads and not from the host's ld.so.cache. + selfcontain.seal(pkginfo.install_dir()) return true end