From aca521b143560a0d6ddf1ca975e83511d5ec0247 Mon Sep 17 00:00:00 2001 From: sunrisepeak Date: Fri, 7 Aug 2026 02:53:20 +0800 Subject: [PATCH 1/7] feat(site): xim plugin for the rebuilt package index site MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The generator used to model xvm / programs / archs in its core, which meant every other ecosystem's pages carried them too. They are xlings concepts, so they live in `.xpkgindex/plugins/xim.py` now. - identity stays the short name: in xlings a descriptor's `namespace` (`config`, `xim`) is a classification label, and package references resolve as `[index:]name[@version]` against the index repo — so joining it into the install command, as the mcpp side must, would produce commands the client rejects. Spelled out rather than left to the core default so a change there cannot silently rewrite 155 install commands - a descriptor without a `namespace` is not un-namespaced: it resolves in the index's default namespace, so those 146 packages group under `xim` instead of a "—" bucket that does not exist - facets from the fields this index actually populates: kind, category, status - `card` listing layout, where the row leads with the copyable install command - theme retoned (teal) so the two consumer sites are visually distinct - stale links fixed: d2learn/* moved to openxlings/* --- .gitignore | 3 + .xpkgindex.json | 114 ++- .xpkgindex/cache/github.json | 1770 ++++++++++++++++++++++++++++++++++ .xpkgindex/plugins/xim.py | 143 +++ 4 files changed, 2016 insertions(+), 14 deletions(-) create mode 100644 .xpkgindex/cache/github.json create mode 100644 .xpkgindex/plugins/xim.py diff --git a/.gitignore b/.gitignore index df048bec..00133f50 100644 --- a/.gitignore +++ b/.gitignore @@ -45,3 +45,6 @@ luac.out # Python bytecode from running the test suite locally. __pycache__/ *.pyc + +# plugin bytecode +.xpkgindex/plugins/__pycache__/ diff --git a/.xpkgindex.json b/.xpkgindex.json index 69ebb8eb..c5cb7957 100644 --- a/.xpkgindex.json +++ b/.xpkgindex.json @@ -1,33 +1,119 @@ { "site": { "title": "XIM Package Index", - "description": "Official package index for xlings package manager", - "logo": "XIM Package Index" + "description": "Official package index for the xlings package manager", + "logo": "xim index" }, "links": { - "github": "https://github.com/d2learn/xim-pkgindex", + "github": "https://github.com/openxlings/xim-pkgindex", "forum": "https://forum.d2learn.org", - "docs": "https://d2learn.org", + "docs": "https://xlings.d2learn.org", "custom": [ - {"label": "xpkgindex Tool", "url": "https://github.com/d2learn/xpkgindex"}, - {"label": "xlings", "url": "https://github.com/d2learn/xlings"} + { + "label": "libxpkg", + "url": "https://github.com/mcpplibs/libxpkg" + }, + { + "label": "xpkgindex", + "url": "https://github.com/openxlings/xpkgindex" + } ] }, "about": { "project_name": "xlings", "project_url": "https://xlings.d2learn.org", - "description": "Highly abstract package manager — multi-version management, everything is a package", - "maintainers": ["d2learn", "Sunrisepeak"], + "description": "Universal package infrastructure with OS-like SubOS isolation — multi-version, rootless, decentralized index", + "maintainers": [ + "openxlings", + "Sunrisepeak" + ], "license": "Apache-2.0" }, "theme": { - "primary_color": "#00d4ff", - "style": "dark" + "accent": "#0e7490", + "style": "auto", + "tones": { + "module": "#0e7490", + "header": "#4b5563", + "tool": "#a16207", + "neutral": "#64748b" + }, + "dark": { + "accent": "#22d3ee", + "tones": { + "module": "#22d3ee", + "header": "#a3b1c2", + "tool": "#e3b341", + "neutral": "#8b9bad" + } + } }, - "install_command_template": "xlings install {name}@{version}", "pkgs_dir": "pkgs", - "install_commands": { - "unix": "curl -fsSL https://d2learn.org/xlings-install.sh | bash", - "windows": "irm https://d2learn.org/xlings-install.ps1.txt | iex" + "list": { + "variant": "card" + }, + "base_url": "https://openxlings.github.io/xim-pkgindex", + "languages": [ + "zh", + "en", + "zh-Hant" + ], + "install_command_template": "xlings install {ref}@{version}", + "install": { + "label": "Install xlings", + "os": [ + { + "id": "unix", + "os": "Linux / macOS", + "command": "curl -fsSL https://d2learn.org/xlings-install.sh | bash" + }, + { + "id": "windows", + "os": "Windows · PowerShell", + "command": "irm https://d2learn.org/xlings-install.ps1.txt | iex" + } + ] + }, + "plugins": [ + ".xpkgindex/plugins/xim.py" + ], + "guides": { + "nav_label": "Contribute", + "entries": [ + { + "slug": "contributing", + "title": "贡献指南", + "path": "docs/contributing.md" + }, + { + "slug": "xpackage-spec", + "title": "XPackage V2 规范", + "path": "docs/V2/xpackage-spec.md" + }, + { + "slug": "add-xpackage", + "title": "新增一个包", + "path": "docs/V1/add-xpackage.md" + }, + { + "slug": "docs-index", + "title": "文档索引", + "path": "docs/README.md" + } + ] + }, + "ecosystem": { + "owners": [ + "openxlings", + "d2learn", + "Sunrisepeak", + "mcpplibs", + "mcpp-community" + ], + "repos": [ + "openxlings/xlings", + "openxlings/xim-pkgindex", + "mcpp-community/mcpp" + ] } } diff --git a/.xpkgindex/cache/github.json b/.xpkgindex/cache/github.json new file mode 100644 index 00000000..b8580a76 --- /dev/null +++ b/.xpkgindex/cache/github.json @@ -0,0 +1,1770 @@ +{ + "entries": { + "https://api.github.com/repos/2412322029/seeme": { + "at": 1786030672, + "body": { + "description": "让别人知道你在干什么", + "homepage": "http://i.not404.cc/", + "language": "Python", + "license": "", + "owner": "2412322029", + "owner_avatar": "https://avatars.githubusercontent.com/u/74493337?v=4", + "owner_url": "https://github.com/2412322029", + "slug": "2412322029/seeme", + "stars": 4, + "topics": [] + } + }, + "https://api.github.com/repos/AnInsomniacy/aria2-next": { + "at": 1786030613, + "body": { + "description": "Maintained aria2 fork with extensive bug fixes and modernized architecture", + "homepage": "", + "language": "C++", + "license": "GPL-2.0", + "owner": "AnInsomniacy", + "owner_avatar": "https://avatars.githubusercontent.com/u/62804262?v=4", + "owner_url": "https://github.com/AnInsomniacy", + "slug": "AnInsomniacy/aria2-next", + "stars": 224, + "topics": [] + } + }, + "https://api.github.com/repos/BurntSushi/ripgrep": { + "at": 1786030669, + "body": { + "description": "ripgrep recursively searches directories for a regex pattern while respecting your gitignore", + "homepage": "", + "language": "Rust", + "license": "Unlicense", + "owner": "BurntSushi", + "owner_avatar": "https://avatars.githubusercontent.com/u/456674?v=4", + "owner_url": "https://github.com/BurntSushi", + "slug": "BurntSushi/ripgrep", + "stars": 67051, + "topics": [ + "cli", + "command-line", + "command-line-tool", + "gitignore", + "grep", + "recursively-search", + "regex", + "ripgrep", + "rust", + "search" + ] + } + }, + "https://api.github.com/repos/CoatiSoftware/Sourcetrail": { + "at": 1786030673, + "body": { + "description": "Sourcetrail - free and open-source interactive source explorer", + "homepage": "https://www.sourcetrail.com/", + "language": "C++", + "license": "GPL-3.0", + "owner": "CoatiSoftware", + "owner_avatar": "https://avatars.githubusercontent.com/u/16224233?v=4", + "owner_url": "https://github.com/CoatiSoftware", + "slug": "CoatiSoftware/Sourcetrail", + "stars": 16491, + "topics": [ + "c", + "cpp", + "java", + "python" + ] + } + }, + "https://api.github.com/repos/Homebrew/brew": { + "at": 1786030614, + "body": { + "description": "🍺 The Package Manager for Everywhere", + "homepage": "https://brew.sh", + "language": "Ruby", + "license": "BSD-2-Clause", + "owner": "Homebrew", + "owner_avatar": "https://avatars.githubusercontent.com/u/1503512?v=4", + "owner_url": "https://github.com/Homebrew", + "slug": "Homebrew/brew", + "stars": 49096, + "topics": [ + "brew", + "homebrew", + "macos", + "package-manager", + "ruby" + ] + } + }, + "https://api.github.com/repos/KhronosGroup/glslang": { + "at": 1786030631, + "body": { + "description": "Khronos-reference front end for GLSL/ESSL, partial front end for HLSL, and a SPIR-V generator.", + "homepage": "", + "language": "C++", + "license": "NOASSERTION", + "owner": "KhronosGroup", + "owner_avatar": "https://avatars.githubusercontent.com/u/1608701?v=4", + "owner_url": "https://github.com/KhronosGroup", + "slug": "KhronosGroup/glslang", + "stars": 3563, + "topics": [ + "compiler", + "essl", + "glsl", + "glslang", + "glslangvalidator", + "hlsl", + "shader", + "spir-v", + "validator" + ] + } + }, + "https://api.github.com/repos/Kitware/CMake": { + "at": 1786030619, + "body": { + "description": "Mirror of CMake upstream repository", + "homepage": "https://gitlab.kitware.com/cmake/cmake", + "language": "C", + "license": "BSD-3-Clause", + "owner": "Kitware", + "owner_avatar": "https://avatars.githubusercontent.com/u/87549?v=4", + "owner_url": "https://github.com/Kitware", + "slug": "Kitware/CMake", + "stars": 8018, + "topics": [] + } + }, + "https://api.github.com/repos/LiRenTech/project-graph": { + "at": 1786030667, + "body": { + "description": "A node-based visual tool for organizing thoughts and notes in a non-linear way.", + "homepage": "https://graphif.dev", + "language": "TypeScript", + "license": "", + "owner": "graphif", + "owner_avatar": "https://avatars.githubusercontent.com/u/220486351?v=4", + "owner_url": "https://github.com/graphif", + "slug": "graphif/project-graph", + "stars": 4269, + "topics": [ + "canvas", + "canvas2d", + "canvasjs", + "cross-platform", + "graph-algorithms", + "project-graph", + "reactjs", + "reactjs-project", + "tailwind", + "tailwind-css", + "tauri-app", + "vite", + "vitejs" + ] + } + }, + "https://api.github.com/repos/NanmiCoder/MediaCrawler": { + "at": 1786030653, + "body": { + "description": "小红书笔记 | 评论爬虫、抖音视频 | 评论爬虫、快手视频 | 评论爬虫、B 站视频 | 评论爬虫、微博帖子 | 评论爬虫、百度贴吧帖子 | 百度贴吧评论回复爬虫 | 知乎问答文章|评论爬虫", + "homepage": "https://nanmicoder.github.io/MediaCrawler/", + "language": "Python", + "license": "NOASSERTION", + "owner": "NanmiCoder", + "owner_avatar": "https://avatars.githubusercontent.com/u/47178017?v=4", + "owner_url": "https://github.com/NanmiCoder", + "slug": "NanmiCoder/MediaCrawler", + "stars": 60164, + "topics": [] + } + }, + "https://api.github.com/repos/NixOS/patchelf": { + "at": 1786030663, + "body": { + "description": "A small utility to modify the dynamic linker and RPATH of ELF executables", + "homepage": "", + "language": "C", + "license": "GPL-3.0", + "owner": "NixOS", + "owner_avatar": "https://avatars.githubusercontent.com/u/487568?v=4", + "owner_url": "https://github.com/NixOS", + "slug": "NixOS/patchelf", + "stars": 4234, + "topics": [] + } + }, + "https://api.github.com/repos/NousResearch/hermes-agent": { + "at": 1786030639, + "body": { + "description": "The agent that grows with you", + "homepage": "https://hermes-agent.nousresearch.com", + "language": "Python", + "license": "MIT", + "owner": "NousResearch", + "owner_avatar": "https://avatars.githubusercontent.com/u/134168893?v=4", + "owner_url": "https://github.com/NousResearch", + "slug": "NousResearch/hermes-agent", + "stars": 226471, + "topics": [ + "ai", + "ai-agent", + "ai-agents", + "anthropic", + "chatgpt", + "claude", + "claude-code", + "clawdbot", + "codex", + "hermes", + "hermes-agent", + "llm", + "moltbot", + "nous-research", + "openai", + "openclaw" + ] + } + }, + "https://api.github.com/repos/PCRE2Project/pcre2": { + "at": 1786030664, + "body": { + "description": "PCRE2 development is based here.", + "homepage": "https://pcre2project.github.io/pcre2/", + "language": "C", + "license": "NOASSERTION", + "owner": "PCRE2Project", + "owner_avatar": "https://avatars.githubusercontent.com/u/104020533?v=4", + "owner_url": "https://github.com/PCRE2Project", + "slug": "PCRE2Project/pcre2", + "stars": 1331, + "topics": [] + } + }, + "https://api.github.com/repos/Perl/perl5": { + "at": 1786030665, + "body": { + "description": "🐪 The Perl programming language", + "homepage": "https://dev.perl.org/perl5/", + "language": "Perl", + "license": "NOASSERTION", + "owner": "Perl", + "owner_avatar": "https://avatars.githubusercontent.com/u/3585411?v=4", + "owner_url": "https://github.com/Perl", + "slug": "Perl/perl5", + "stars": 2310, + "topics": [ + "cpan", + "hacktoberfest", + "perl", + "perl5" + ] + } + }, + "https://api.github.com/repos/SagerNet/sing-box": { + "at": 1786030672, + "body": { + "description": "The universal proxy platform", + "homepage": "https://sing-box.sagernet.org/", + "language": "Go", + "license": "NOASSERTION", + "owner": "SagerNet", + "owner_avatar": "https://avatars.githubusercontent.com/u/83217677?v=4", + "owner_url": "https://github.com/SagerNet", + "slug": "SagerNet/sing-box", + "stars": 36767, + "topics": [] + } + }, + "https://api.github.com/repos/Sunrisepeak/KHistory": { + "at": 1786030646, + "body": { + "description": "An elegant keyboard/gamepad key detection and visualization tool | 🔥一个优雅&跨平台的 键盘/🎮手柄按键 检测及历史记录显示工具, 无需安装单可执行文件(约900kb大小)即点即用", + "homepage": "https://github.com/Sunrisepeak/KHistory", + "language": "C++", + "license": "GPL-3.0", + "owner": "Sunrisepeak", + "owner_avatar": "https://avatars.githubusercontent.com/u/38786181?v=4", + "owner_url": "https://github.com/Sunrisepeak", + "slug": "Sunrisepeak/KHistory", + "stars": 84, + "topics": [ + "cross-platform", + "dstruct", + "dsvisual", + "gamepad", + "imgui", + "keyboard", + "keylogger" + ] + } + }, + "https://api.github.com/repos/adoptium/temurin25-binaries": { + "at": 1786030643, + "body": { + "description": "Temurin 25 binaries", + "homepage": "https://adoptium.net", + "language": "", + "license": "", + "owner": "adoptium", + "owner_avatar": "https://avatars.githubusercontent.com/u/67165372?v=4", + "owner_url": "https://github.com/adoptium", + "slug": "adoptium/temurin25-binaries", + "stars": 51, + "topics": [] + } + }, + "https://api.github.com/repos/ajeetdsouza/zoxide": { + "at": 1786030679, + "body": { + "description": "A smarter cd command. Supports all major shells.", + "homepage": "https://crates.io/crates/zoxide", + "language": "Rust", + "license": "MIT", + "owner": "ajeetdsouza", + "owner_avatar": "https://avatars.githubusercontent.com/u/1777663?v=4", + "owner_url": "https://github.com/ajeetdsouza", + "slug": "ajeetdsouza/zoxide", + "stars": 38520, + "topics": [ + "autojump", + "bash", + "cli", + "command-line", + "command-line-tool", + "elvish", + "fasd", + "fish", + "fish-shell", + "fzf", + "hacktoberfest", + "jump", + "nushell", + "powershell", + "rust", + "shell", + "xonsh", + "xontrib", + "z", + "zsh" + ] + } + }, + "https://api.github.com/repos/anthropics/claude-code": { + "at": 1786030618, + "body": { + "description": "Claude Code is an agentic coding tool that lives in your terminal, understands your codebase, and helps you code faster by executing routine tasks, explaining complex code, and handling git workflows - all through natural language commands.", + "homepage": "https://code.claude.com/docs/en/overview", + "language": "Python", + "license": "", + "owner": "anthropics", + "owner_avatar": "https://avatars.githubusercontent.com/u/76263028?v=4", + "owner_url": "https://github.com/anthropics", + "slug": "anthropics/claude-code", + "stars": 140472, + "topics": [] + } + }, + "https://api.github.com/repos/astral-sh/uv": { + "at": 1786030675, + "body": { + "description": "An extremely fast Python package and project manager, written in Rust.", + "homepage": "https://docs.astral.sh/uv", + "language": "Rust", + "license": "Apache-2.0", + "owner": "astral-sh", + "owner_avatar": "https://avatars.githubusercontent.com/u/115962839?v=4", + "owner_url": "https://github.com/astral-sh", + "slug": "astral-sh/uv", + "stars": 88430, + "topics": [ + "packaging", + "python", + "resolver", + "uv" + ] + } + }, + "https://api.github.com/repos/brechtsanders/winlibs_mingw": { + "at": 1786030654, + "body": { + "description": "winlibs standalone build of GCC compiler and MinGW-w64", + "homepage": "", + "language": "", + "license": "", + "owner": "brechtsanders", + "owner_avatar": "https://avatars.githubusercontent.com/u/17645177?v=4", + "owner_url": "https://github.com/brechtsanders", + "slug": "brechtsanders/winlibs_mingw", + "stars": 1319, + "topics": [] + } + }, + "https://api.github.com/repos/chenhg5/cc-connect": { + "at": 1786030617, + "body": { + "description": "Bridge local AI coding agents (Claude Code, Cursor, Gemini CLI, Codex) to messaging platforms (Feishu/Lark, DingTalk, Slack, Telegram, Discord, LINE, WeChat Work). Chat with your AI dev assistant from anywhere — no public IP required for most platforms.", + "homepage": "", + "language": "Go", + "license": "", + "owner": "chenhg5", + "owner_avatar": "https://avatars.githubusercontent.com/u/4344486?v=4", + "owner_url": "https://github.com/chenhg5", + "slug": "chenhg5/cc-connect", + "stars": 14739, + "topics": [] + } + }, + "https://api.github.com/repos/cli/cli": { + "at": 1786030629, + "body": { + "description": "GitHub’s official command line tool", + "homepage": "https://cli.github.com", + "language": "Go", + "license": "MIT", + "owner": "cli", + "owner_avatar": "https://avatars.githubusercontent.com/u/59704711?v=4", + "owner_url": "https://github.com/cli", + "slug": "cli/cli", + "stars": 45698, + "topics": [ + "cli", + "git", + "github-api-v4", + "golang" + ] + } + }, + "https://api.github.com/repos/containers/bubblewrap": { + "at": 1786030616, + "body": { + "description": "Low-level unprivileged sandboxing tool used by Flatpak and similar projects", + "homepage": "", + "language": "C", + "license": "NOASSERTION", + "owner": "containers", + "owner_avatar": "https://avatars.githubusercontent.com/u/5874934?v=4", + "owner_url": "https://github.com/containers", + "slug": "containers/bubblewrap", + "stars": 8266, + "topics": [ + "linux-containers", + "user-namespaces" + ] + } + }, + "https://api.github.com/repos/corretto/corretto-25": { + "at": 1786030641, + "body": { + "description": "", + "homepage": "", + "language": "Java", + "license": "GPL-2.0", + "owner": "corretto", + "owner_avatar": "https://avatars.githubusercontent.com/u/44104058?v=4", + "owner_url": "https://github.com/corretto", + "slug": "corretto/corretto-25", + "stars": 38, + "topics": [] + } + }, + "https://api.github.com/repos/d2learn/d2x": { + "at": 1786030623, + "body": { + "description": "一个交互式教程项目搭建工具", + "homepage": "", + "language": "C++", + "license": "Apache-2.0", + "owner": "d2learn", + "owner_avatar": "https://avatars.githubusercontent.com/u/178715260?v=4", + "owner_url": "https://github.com/d2learn", + "slug": "d2learn/d2x", + "stars": 2, + "topics": [] + } + }, + "https://api.github.com/repos/dirk-thomas/vcstool": { + "at": 1786030675, + "body": { + "description": "Vcstool is a command line tool designed to make working with multiple repositories easier", + "homepage": "", + "language": "Python", + "license": "Apache-2.0", + "owner": "dirk-thomas", + "owner_avatar": "https://avatars.githubusercontent.com/u/1335366?v=4", + "owner_url": "https://github.com/dirk-thomas", + "slug": "dirk-thomas/vcstool", + "stars": 501, + "topics": [] + } + }, + "https://api.github.com/repos/dotnet/sdk": { + "at": 1786030623, + "body": { + "description": "Core functionality needed to create .NET Core projects, that is shared between Visual Studio and CLI", + "homepage": "https://dot.net/core", + "language": "C#", + "license": "MIT", + "owner": "dotnet", + "owner_avatar": "https://avatars.githubusercontent.com/u/9141961?v=4", + "owner_url": "https://github.com/dotnet", + "slug": "dotnet/sdk", + "stars": 3181, + "topics": [ + "cli", + "dotnet", + "sdk", + "visual-studio" + ] + } + }, + "https://api.github.com/repos/face-hh/griddycode": { + "at": 1786030637, + "body": { + "description": "A code editor made with Godot. Code has never been more lit!", + "homepage": "", + "language": "Lua", + "license": "Apache-2.0", + "owner": "face-hh", + "owner_avatar": "https://avatars.githubusercontent.com/u/69168154?v=4", + "owner_url": "https://github.com/face-hh", + "slug": "face-hh/griddycode", + "stars": 2200, + "topics": [] + } + }, + "https://api.github.com/repos/farion1231/cc-switch": { + "at": 1786030617, + "body": { + "description": "A cross-platform desktop All-in-One assistant for Claude Code, Codex, OpenCode, OpenClaw, Grok Build & Hermes Agent. Only official website: ccswitch.io", + "homepage": "https://ccswitch.io", + "language": "Rust", + "license": "MIT", + "owner": "farion1231", + "owner_avatar": "https://avatars.githubusercontent.com/u/44939412?v=4", + "owner_url": "https://github.com/farion1231", + "slug": "farion1231/cc-switch", + "stars": 125089, + "topics": [ + "ai-tools", + "claude-code", + "codex", + "desktop-app", + "grok", + "grokbuild", + "hermes", + "hermes-agent", + "mcp", + "open-source", + "openclaw", + "openclaw-ui", + "opencode", + "provider-management", + "rust", + "skills", + "skills-management", + "tauri", + "typescript", + "wsl-support" + ] + } + }, + "https://api.github.com/repos/fish-shell/fish-shell": { + "at": 1786030625, + "body": { + "description": "The user-friendly command line shell.", + "homepage": "https://fishshell.com", + "language": "Rust", + "license": "NOASSERTION", + "owner": "fish-shell", + "owner_avatar": "https://avatars.githubusercontent.com/u/1828073?v=4", + "owner_url": "https://github.com/fish-shell", + "slug": "fish-shell/fish-shell", + "stars": 33986, + "topics": [ + "fish", + "rust", + "shell", + "terminal" + ] + } + }, + "https://api.github.com/repos/fribidi/fribidi": { + "at": 1786030626, + "body": { + "description": "GNU FriBidi", + "homepage": "", + "language": "C", + "license": "LGPL-2.1", + "owner": "fribidi", + "owner_avatar": "https://avatars.githubusercontent.com/u/24780864?v=4", + "owner_url": "https://github.com/fribidi", + "slug": "fribidi/fribidi", + "stars": 430, + "topics": [] + } + }, + "https://api.github.com/repos/gcc-mirror/gcc": { + "at": 1786030612, + "body": { + "description": "", + "homepage": "", + "language": "C++", + "license": "GPL-2.0", + "owner": "gcc-mirror", + "owner_avatar": "https://avatars.githubusercontent.com/u/8382043?v=4", + "owner_url": "https://github.com/gcc-mirror", + "slug": "gcc-mirror/gcc", + "stars": 11119, + "topics": [] + } + }, + "https://api.github.com/repos/git/git": { + "at": 1786030627, + "body": { + "description": "Git Source Code Mirror - This is a publish-only repository but pull requests can be turned into patches to the mailing list via GitGitGadget (https://gitgitgadget.github.io/). Please follow Documentation/SubmittingPatches procedure for any of your improvements.", + "homepage": "", + "language": "C", + "license": "NOASSERTION", + "owner": "git", + "owner_avatar": "https://avatars.githubusercontent.com/u/18133?v=4", + "owner_url": "https://github.com/git", + "slug": "git/git", + "stars": 62432, + "topics": [ + "c", + "hacktoberfest", + "shell" + ] + } + }, + "https://api.github.com/repos/glennrp/libpng": { + "at": 1786030649, + "body": { + "description": "LIBPNG: Portable Network Graphics support, official libpng repository", + "homepage": "http://libpng.sf.net", + "language": "C", + "license": "NOASSERTION", + "owner": "pnggroup", + "owner_avatar": "https://avatars.githubusercontent.com/u/48779779?v=4", + "owner_url": "https://github.com/pnggroup", + "slug": "pnggroup/libpng", + "stars": 1637, + "topics": [] + } + }, + "https://api.github.com/repos/godotengine/godot": { + "at": 1786030636, + "body": { + "description": "Godot Engine – Multi-platform 2D and 3D game engine", + "homepage": "https://godotengine.org", + "language": "C++", + "license": "MIT", + "owner": "godotengine", + "owner_avatar": "https://avatars.githubusercontent.com/u/6318500?v=4", + "owner_url": "https://github.com/godotengine", + "slug": "godotengine/godot", + "stars": 115252, + "topics": [ + "game-development", + "game-engine", + "gamedev", + "godot", + "godotengine", + "multi-platform", + "open-source" + ] + } + }, + "https://api.github.com/repos/golang/go": { + "at": 1786030634, + "body": { + "description": "The Go programming language", + "homepage": "https://go.dev", + "language": "Go", + "license": "BSD-3-Clause", + "owner": "golang", + "owner_avatar": "https://avatars.githubusercontent.com/u/4314092?v=4", + "owner_url": "https://github.com/golang", + "slug": "golang/go", + "stars": 135651, + "topics": [ + "go", + "golang", + "language", + "programming-language" + ] + } + }, + "https://api.github.com/repos/harfbuzz/harfbuzz": { + "at": 1786030637, + "body": { + "description": "HarfBuzz text shaping engine", + "homepage": "http://harfbuzz.github.io/", + "language": "C++", + "license": "NOASSERTION", + "owner": "harfbuzz", + "owner_avatar": "https://avatars.githubusercontent.com/u/33817416?v=4", + "owner_url": "https://github.com/harfbuzz", + "slug": "harfbuzz/harfbuzz", + "stars": 5979, + "topics": [ + "aat", + "c", + "c-plus-plus", + "fonts", + "gpu", + "opentype", + "text-rendering", + "text-shaping", + "typography", + "unicode", + "variable-fonts" + ] + } + }, + "https://api.github.com/repos/ip7z/7zip": { + "at": 1786030611, + "body": { + "description": "7-Zip", + "homepage": "", + "language": "C++", + "license": "", + "owner": "ip7z", + "owner_avatar": "https://avatars.githubusercontent.com/u/87184205?v=4", + "owner_url": "https://github.com/ip7z", + "slug": "ip7z/7zip", + "stars": 3658, + "topics": [] + } + }, + "https://api.github.com/repos/jqlang/jq": { + "at": 1786030646, + "body": { + "description": "Command-line JSON processor", + "homepage": "https://jqlang.org", + "language": "C", + "license": "NOASSERTION", + "owner": "jqlang", + "owner_avatar": "https://avatars.githubusercontent.com/u/104800540?v=4", + "owner_url": "https://github.com/jqlang", + "slug": "jqlang/jq", + "stars": 35404, + "topics": [ + "jq" + ] + } + }, + "https://api.github.com/repos/junegunn/fzf": { + "at": 1786030626, + "body": { + "description": ":cherry_blossom: A command-line fuzzy finder", + "homepage": "https://junegunn.github.io/fzf/", + "language": "Go", + "license": "MIT", + "owner": "junegunn", + "owner_avatar": "https://avatars.githubusercontent.com/u/700826?v=4", + "owner_url": "https://github.com/junegunn", + "slug": "junegunn/fzf", + "stars": 82397, + "topics": [ + "bash", + "cli", + "fish", + "fzf", + "go", + "neovim", + "tmux", + "unix", + "vim", + "zsh" + ] + } + }, + "https://api.github.com/repos/libexpat/libexpat": { + "at": 1786030624, + "body": { + "description": ":herb: Fast streaming XML parser written in C99 with >90% test coverage; moved from SourceForge to GitHub", + "homepage": "https://libexpat.github.io/", + "language": "C", + "license": "MIT", + "owner": "libexpat", + "owner_avatar": "https://avatars.githubusercontent.com/u/20887397?v=4", + "owner_url": "https://github.com/libexpat", + "slug": "libexpat/libexpat", + "stars": 1362, + "topics": [ + "c", + "c99", + "expat", + "expat-xml-parser", + "library", + "siphash", + "streaming-parser", + "xml", + "xml-parser", + "xml-parser-library", + "xml-parsing" + ] + } + }, + "https://api.github.com/repos/libffi/libffi": { + "at": 1786030647, + "body": { + "description": "A portable foreign-function interface library.", + "homepage": "http://sourceware.org/libffi", + "language": "C", + "license": "NOASSERTION", + "owner": "libffi", + "owner_avatar": "https://avatars.githubusercontent.com/u/7063475?v=4", + "owner_url": "https://github.com/libffi", + "slug": "libffi/libffi", + "stars": 4339, + "topics": [] + } + }, + "https://api.github.com/repos/llvm/llvm-project": { + "at": 1786030648, + "body": { + "description": "The LLVM Project is a collection of modular and reusable compiler and toolchain technologies.", + "homepage": "http://llvm.org", + "language": "LLVM", + "license": "NOASSERTION", + "owner": "llvm", + "owner_avatar": "https://avatars.githubusercontent.com/u/17149993?v=4", + "owner_url": "https://github.com/llvm", + "slug": "llvm/llvm-project", + "stars": 39656, + "topics": [] + } + }, + "https://api.github.com/repos/madler/zlib": { + "at": 1786030678, + "body": { + "description": "A massively spiffy yet delicately unobtrusive compression library.", + "homepage": "http://zlib.net/", + "language": "C", + "license": "NOASSERTION", + "owner": "madler", + "owner_avatar": "https://avatars.githubusercontent.com/u/240717?v=4", + "owner_url": "https://github.com/madler", + "slug": "madler/zlib", + "stars": 7001, + "topics": [] + } + }, + "https://api.github.com/repos/mcpp-community/mcpp": { + "at": 1786030652, + "body": { + "description": "A modern C++ module-first build tool — written in pure C++23 modules, fully self-hosted / 一个 现代C++ 模块化构建工具 — 纯 C++23 模块编写(已实现自举) ", + "homepage": "", + "language": "C++", + "license": "Apache-2.0", + "owner": "mcpp-community", + "owner_avatar": "https://avatars.githubusercontent.com/u/247994312?v=4", + "owner_url": "https://github.com/mcpp-community", + "slug": "mcpp-community/mcpp", + "stars": 91, + "topics": [ + "build-tool", + "cpp", + "cpp23", + "mcpp", + "toolchain" + ] + } + }, + "https://api.github.com/repos/mcpp-community/mcpp/contributors?per_page=30": { + "at": 1786030690, + "body": [ + { + "avatar": "https://avatars.githubusercontent.com/u/38786181?v=4", + "contributions": 434, + "login": "Sunrisepeak", + "url": "https://github.com/Sunrisepeak" + }, + { + "avatar": "https://avatars.githubusercontent.com/u/248744407?v=4", + "contributions": 30, + "login": "speak-agent", + "url": "https://github.com/speak-agent" + }, + { + "avatar": "https://avatars.githubusercontent.com/u/194236111?v=4", + "contributions": 4, + "login": "ZheFeng7110", + "url": "https://github.com/ZheFeng7110" + }, + { + "avatar": "https://avatars.githubusercontent.com/u/96378453?v=4", + "contributions": 2, + "login": "wellwei", + "url": "https://github.com/wellwei" + }, + { + "avatar": "https://avatars.githubusercontent.com/u/86313530?v=4", + "contributions": 1, + "login": "xv1rcn", + "url": "https://github.com/xv1rcn" + }, + { + "avatar": "https://avatars.githubusercontent.com/u/67222274?v=4", + "contributions": 1, + "login": "HalfAnElephant", + "url": "https://github.com/HalfAnElephant" + }, + { + "avatar": "https://avatars.githubusercontent.com/u/119092375?v=4", + "contributions": 1, + "login": "yizhinailong", + "url": "https://github.com/yizhinailong" + } + ] + }, + "https://api.github.com/repos/microsoft/vscode": { + "at": 1786030620, + "body": { + "description": "Visual Studio Code", + "homepage": "https://code.visualstudio.com", + "language": "TypeScript", + "license": "MIT", + "owner": "microsoft", + "owner_avatar": "https://avatars.githubusercontent.com/u/6154722?v=4", + "owner_url": "https://github.com/microsoft", + "slug": "microsoft/vscode", + "stars": 188438, + "topics": [ + "editor", + "electron", + "microsoft", + "typescript", + "visual-studio-code" + ] + } + }, + "https://api.github.com/repos/mingw-w64/mingw-w64": { + "at": 1786030654, + "body": { + "description": "(Unofficial) Mirror of mingw-w64-code", + "homepage": "https://mingw-w64.org/", + "language": "C", + "license": "NOASSERTION", + "owner": "mingw-w64", + "owner_avatar": "https://avatars.githubusercontent.com/u/12658362?v=4", + "owner_url": "https://github.com/mingw-w64", + "slug": "mingw-w64/mingw-w64", + "stars": 580, + "topics": [] + } + }, + "https://api.github.com/repos/neovim/neovim": { + "at": 1786030659, + "body": { + "description": "Vim-fork focused on extensibility and usability", + "homepage": "https://neovim.io", + "language": "Vim Script", + "license": "NOASSERTION", + "owner": "neovim", + "owner_avatar": "https://avatars.githubusercontent.com/u/6471485?v=4", + "owner_url": "https://github.com/neovim", + "slug": "neovim/neovim", + "stars": 101652, + "topics": [ + "api", + "c", + "lua", + "neovim", + "nvim", + "text-editor", + "vim" + ] + } + }, + "https://api.github.com/repos/netwide-assembler/nasm": { + "at": 1786030656, + "body": { + "description": "A cross-platform x86 assembler with an Intel-like syntax", + "homepage": "https://www.nasm.us/", + "language": "Assembly", + "license": "NOASSERTION", + "owner": "netwide-assembler", + "owner_avatar": "https://avatars.githubusercontent.com/u/38181986?v=4", + "owner_url": "https://github.com/netwide-assembler", + "slug": "netwide-assembler/nasm", + "stars": 3278, + "topics": [ + "assembler", + "assembler-x86", + "assemblers", + "nasm", + "nasm-assembler", + "nasm-language", + "x86" + ] + } + }, + "https://api.github.com/repos/ninja-build/ninja": { + "at": 1786030657, + "body": { + "description": "a small build system with a focus on speed", + "homepage": "https://ninja-build.org/", + "language": "C++", + "license": "Apache-2.0", + "owner": "ninja-build", + "owner_avatar": "https://avatars.githubusercontent.com/u/11653218?v=4", + "owner_url": "https://github.com/ninja-build", + "slug": "ninja-build/ninja", + "stars": 13120, + "topics": [] + } + }, + "https://api.github.com/repos/nodejs/node": { + "at": 1786030658, + "body": { + "description": "Node.js JavaScript runtime ✨🐢🚀✨", + "homepage": "https://nodejs.org", + "language": "JavaScript", + "license": "NOASSERTION", + "owner": "nodejs", + "owner_avatar": "https://avatars.githubusercontent.com/u/9950313?v=4", + "owner_url": "https://github.com/nodejs", + "slug": "nodejs/node", + "stars": 118803, + "topics": [ + "javascript", + "js", + "linux", + "macos", + "mit", + "node", + "nodejs", + "runtime", + "windows" + ] + } + }, + "https://api.github.com/repos/npm/cli": { + "at": 1786030659, + "body": { + "description": "the package manager for JavaScript", + "homepage": "https://docs.npmjs.com/cli/", + "language": "JavaScript", + "license": "NOASSERTION", + "owner": "npm", + "owner_avatar": "https://avatars.githubusercontent.com/u/6078720?v=4", + "owner_url": "https://github.com/npm", + "slug": "npm/cli", + "stars": 10004, + "topics": [ + "javascript", + "nodejs", + "npm", + "npm-cli", + "package-manager", + "tools" + ] + } + }, + "https://api.github.com/repos/nvm-sh/nvm": { + "at": 1786030660, + "body": { + "description": "Node Version Manager - POSIX-compliant bash script to manage multiple active node.js versions", + "homepage": "", + "language": "Shell", + "license": "MIT", + "owner": "nvm-sh", + "owner_avatar": "https://avatars.githubusercontent.com/u/49963700?v=4", + "owner_url": "https://github.com/nvm-sh", + "slug": "nvm-sh/nvm", + "stars": 94353, + "topics": [ + "bash", + "install", + "lts", + "node", + "node-js", + "nodejs", + "nvm", + "nvmrc", + "posix", + "posix-compliant", + "shell", + "version-manager", + "zsh" + ] + } + }, + "https://api.github.com/repos/ollama/ollama": { + "at": 1786030661, + "body": { + "description": "Get up and running with Kimi-K2.6, GLM-5.2, MiniMax, DeepSeek, gpt-oss, Qwen, Gemma and other models.", + "homepage": "https://ollama.com", + "language": "Go", + "license": "MIT", + "owner": "ollama", + "owner_avatar": "https://avatars.githubusercontent.com/u/151674099?v=4", + "owner_url": "https://github.com/ollama", + "slug": "ollama/ollama", + "stars": 177930, + "topics": [ + "deepseek", + "gemma", + "gemma3", + "glm", + "go", + "golang", + "gpt-oss", + "llama", + "llama3", + "llm", + "llms", + "minimax", + "mistral", + "ollama", + "qwen" + ] + } + }, + "https://api.github.com/repos/openai/codex": { + "at": 1786030621, + "body": { + "description": "Lightweight coding agent that runs in your terminal", + "homepage": "", + "language": "Rust", + "license": "Apache-2.0", + "owner": "openai", + "owner_avatar": "https://avatars.githubusercontent.com/u/14957082?v=4", + "owner_url": "https://github.com/openai", + "slug": "openai/codex", + "stars": 104388, + "topics": [] + } + }, + "https://api.github.com/repos/openclaw/openclaw": { + "at": 1786030662, + "body": { + "description": "Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 ", + "homepage": "https://openclaw.ai", + "language": "TypeScript", + "license": "NOASSERTION", + "owner": "openclaw", + "owner_avatar": "https://avatars.githubusercontent.com/u/252820863?v=4", + "owner_url": "https://github.com/openclaw", + "slug": "openclaw/openclaw", + "stars": 385362, + "topics": [ + "ai", + "assistant", + "crustacean", + "molty", + "openclaw", + "own-your-data", + "personal" + ] + } + }, + "https://api.github.com/repos/openssl/openssl": { + "at": 1786030663, + "body": { + "description": "General purpose TLS and crypto library", + "homepage": "https://openssl-library.org/", + "language": "C", + "license": "Apache-2.0", + "owner": "openssl", + "owner_avatar": "https://avatars.githubusercontent.com/u/3279138?v=4", + "owner_url": "https://github.com/openssl", + "slug": "openssl/openssl", + "stars": 30566, + "topics": [ + "cryptography", + "decryption", + "encryption", + "openssl", + "ssl", + "tls" + ] + } + }, + "https://api.github.com/repos/openxlings/xim-pkgindex": { + "at": 1786030622, + "body": { + "description": "xim package index", + "homepage": "https://xlings.d2learn.org", + "language": "Lua", + "license": "Apache-2.0", + "owner": "openxlings", + "owner_avatar": "https://avatars.githubusercontent.com/u/266796665?v=4", + "owner_url": "https://github.com/openxlings", + "slug": "openxlings/xim-pkgindex", + "stars": 7, + "topics": [ + "configuration", + "installer", + "package-index", + "package-manager", + "xim", + "xlings" + ] + } + }, + "https://api.github.com/repos/openxlings/xim-pkgindex/commits?per_page=100&page=1": { + "at": 1786030681, + "body": { + "FarnaHerry|108510510+FarnaHerry@users.noreply.github.com": "FarnaHerry", + "SPeak|speakshen@163.com": "Sunrisepeak", + "Sunrisepeak|x.d2learn.org@gmail.com": "speak-agent" + } + }, + "https://api.github.com/repos/openxlings/xim-pkgindex/commits?per_page=100&page=2": { + "at": 1786030683, + "body": { + "Heptazero|109618330+Heptazero@users.noreply.github.com": "Heptazero", + "SPeak|speakshen@163.com": "Sunrisepeak", + "sunrisepeak|x.d2learn.org@gmail.com": "speak-agent" + } + }, + "https://api.github.com/repos/openxlings/xim-pkgindex/commits?per_page=100&page=3": { + "at": 1786030685, + "body": { + "SPeak|speakshen@163.com": "Sunrisepeak", + "Sunrisepeak|x.d2learn.org@gmail.com": "speak-agent", + "sunrisepeak|speakshen@163.com": "Sunrisepeak", + "sunrisepeak|x.d2learn.org@gmail.com": "speak-agent" + } + }, + "https://api.github.com/repos/openxlings/xim-pkgindex/commits?per_page=100&page=4": { + "at": 1786030686, + "body": { + "SPeak|speakshen@163.com": "Sunrisepeak", + "sunrisepeak|speakshen@163.com": "Sunrisepeak" + } + }, + "https://api.github.com/repos/openxlings/xim-pkgindex/commits?per_page=100&page=5": { + "at": 1786030687, + "body": { + "SPeak|speakshen@163.com": "Sunrisepeak", + "github-actions[bot]|41898282+github-actions[bot]@users.noreply.github.com": "github-actions[bot]", + "sunrisepeak|speakshen@163.com": "Sunrisepeak" + } + }, + "https://api.github.com/repos/openxlings/xim-pkgindex/contributors?per_page=30": { + "at": 1786030689, + "body": [ + { + "avatar": "https://avatars.githubusercontent.com/u/38786181?v=4", + "contributions": 699, + "login": "Sunrisepeak", + "url": "https://github.com/Sunrisepeak" + }, + { + "avatar": "https://avatars.githubusercontent.com/u/248744407?v=4", + "contributions": 22, + "login": "speak-agent", + "url": "https://github.com/speak-agent" + }, + { + "avatar": "https://avatars.githubusercontent.com/in/15368?v=4", + "contributions": 7, + "login": "github-actions[bot]", + "url": "https://github.com/apps/github-actions" + }, + { + "avatar": "https://avatars.githubusercontent.com/u/64307394?v=4", + "contributions": 6, + "login": "MoYingJi", + "url": "https://github.com/MoYingJi" + }, + { + "avatar": "https://avatars.githubusercontent.com/u/108510510?v=4", + "contributions": 4, + "login": "FarnaHerry", + "url": "https://github.com/FarnaHerry" + }, + { + "avatar": "https://avatars.githubusercontent.com/u/74493337?v=4", + "contributions": 2, + "login": "2412322029", + "url": "https://github.com/2412322029" + }, + { + "avatar": "https://avatars.githubusercontent.com/u/109618330?v=4", + "contributions": 1, + "login": "Heptazero", + "url": "https://github.com/Heptazero" + } + ] + }, + "https://api.github.com/repos/openxlings/xlings": { + "at": 1786030688, + "body": { + "description": "Universal package infrastructure with OS-like SubOS isolation - Multi-version · Rootless · Decentralized Index · Agent-ready.", + "homepage": "https://openxlings.github.io", + "language": "C++", + "license": "Apache-2.0", + "owner": "openxlings", + "owner_avatar": "https://avatars.githubusercontent.com/u/266796665?v=4", + "owner_url": "https://github.com/openxlings", + "slug": "openxlings/xlings", + "stars": 599, + "topics": [ + "ai", + "auto-configuration", + "auto-detect", + "d2x", + "demos", + "installer", + "llm-application", + "package-manager", + "project-management", + "tools", + "version-manager", + "xlings" + ] + } + }, + "https://api.github.com/repos/openxlings/xlings/contributors?per_page=30": { + "at": 1786030689, + "body": [ + { + "avatar": "https://avatars.githubusercontent.com/u/38786181?v=4", + "contributions": 619, + "login": "Sunrisepeak", + "url": "https://github.com/Sunrisepeak" + }, + { + "avatar": "https://avatars.githubusercontent.com/u/248744407?v=4", + "contributions": 25, + "login": "speak-agent", + "url": "https://github.com/speak-agent" + }, + { + "avatar": "https://avatars.githubusercontent.com/u/64307394?v=4", + "contributions": 6, + "login": "MoYingJi", + "url": "https://github.com/MoYingJi" + }, + { + "avatar": "https://avatars.githubusercontent.com/in/1143301?v=4", + "contributions": 1, + "login": "Copilot", + "url": "https://github.com/apps/copilot-swe-agent" + }, + { + "avatar": "https://avatars.githubusercontent.com/u/33739170?v=4", + "contributions": 1, + "login": "zzxzzk115", + "url": "https://github.com/zzxzzk115" + }, + { + "avatar": "https://avatars.githubusercontent.com/u/194236111?v=4", + "contributions": 1, + "login": "ZheFeng7110", + "url": "https://github.com/ZheFeng7110" + } + ] + }, + "https://api.github.com/repos/oven-sh/bun": { + "at": 1786030615, + "body": { + "description": "Incredibly fast JavaScript runtime, bundler, test runner, and package manager – all in one", + "homepage": "https://bun.com", + "language": "Rust", + "license": "NOASSERTION", + "owner": "oven-sh", + "owner_avatar": "https://avatars.githubusercontent.com/u/108928776?v=4", + "owner_url": "https://github.com/oven-sh", + "slug": "oven-sh/bun", + "stars": 95300, + "topics": [ + "bun", + "bundler", + "javascript", + "javascriptcore", + "jsx", + "nodejs", + "npm", + "react", + "rust", + "rust-lang", + "transpiler", + "typescript" + ] + } + }, + "https://api.github.com/repos/pnpm/pnpm": { + "at": 1786030666, + "body": { + "description": "Fast, disk space efficient package manager", + "homepage": "https://pnpm.io", + "language": "Rust", + "license": "MIT", + "owner": "pnpm", + "owner_avatar": "https://avatars.githubusercontent.com/u/21320719?v=4", + "owner_url": "https://github.com/pnpm", + "slug": "pnpm/pnpm", + "stars": 35988, + "topics": [ + "dependency-manager", + "install", + "javascript", + "modules", + "node", + "nodejs", + "npm", + "package-manager" + ] + } + }, + "https://api.github.com/repos/proot-me/proot": { + "at": 1786030668, + "body": { + "description": "chroot, mount --bind, and binfmt_misc without privilege/setup for Linux", + "homepage": "https://proot-me.github.io", + "language": "C", + "license": "GPL-2.0", + "owner": "proot-me", + "owner_avatar": "https://avatars.githubusercontent.com/u/12125707?v=4", + "owner_url": "https://github.com/proot-me", + "slug": "proot-me/proot", + "stars": 2570, + "topics": [ + "c", + "chroot", + "chroot-environment", + "hacktoberfest", + "linux", + "ptrace", + "rootfs", + "syscalls", + "userland-exec" + ] + } + }, + "https://api.github.com/repos/python/cpython": { + "at": 1786030669, + "body": { + "description": "The Python programming language", + "homepage": "https://www.python.org", + "language": "Python", + "license": "NOASSERTION", + "owner": "python", + "owner_avatar": "https://avatars.githubusercontent.com/u/1525981?v=4", + "owner_url": "https://github.com/python", + "slug": "python/cpython", + "stars": 74213, + "topics": [] + } + }, + "https://api.github.com/repos/richfelker/musl-cross-make": { + "at": 1786030655, + "body": { + "description": "Simple makefile-based build for musl cross compiler", + "homepage": "", + "language": "Makefile", + "license": "MIT", + "owner": "richfelker", + "owner_avatar": "https://avatars.githubusercontent.com/u/10458007?v=4", + "owner_url": "https://github.com/richfelker", + "slug": "richfelker/musl-cross-make", + "stars": 1574, + "topics": [ + "binutils", + "cross-compiler", + "gcc", + "musl", + "musl-cross", + "target-musl", + "toolchain" + ] + } + }, + "https://api.github.com/repos/ros-infrastructure/rosdep": { + "at": 1786030671, + "body": { + "description": "rosdep multi-package manager system dependency tool", + "homepage": "http://ros.org/wiki/rosdep", + "language": "Python", + "license": "BSD-3-Clause", + "owner": "ros-infrastructure", + "owner_avatar": "https://avatars.githubusercontent.com/u/2328632?v=4", + "owner_url": "https://github.com/ros-infrastructure", + "slug": "ros-infrastructure/rosdep", + "stars": 93, + "topics": [] + } + }, + "https://api.github.com/repos/ros2/ros2": { + "at": 1786030670, + "body": { + "description": "The Robot Operating System, is a meta operating system for robots.", + "homepage": "https://docs.ros.org", + "language": "", + "license": "", + "owner": "ros2", + "owner_avatar": "https://avatars.githubusercontent.com/u/3979232?v=4", + "owner_url": "https://github.com/ros2", + "slug": "ros2/ros2", + "stars": 5864, + "topics": [] + } + }, + "https://api.github.com/repos/rust-lang/mdBook": { + "at": 1786030652, + "body": { + "description": "Create book from markdown files. Like Gitbook but implemented in Rust", + "homepage": "https://rust-lang.github.io/mdBook/", + "language": "Rust", + "license": "MPL-2.0", + "owner": "rust-lang", + "owner_avatar": "https://avatars.githubusercontent.com/u/5430905?v=4", + "owner_url": "https://github.com/rust-lang", + "slug": "rust-lang/mdBook", + "stars": 22049, + "topics": [] + } + }, + "https://api.github.com/repos/ryanoasis/nerd-fonts": { + "at": 1786030645, + "body": { + "description": "Iconic font aggregator, collection, & patcher. 3,600+ icons, 50+ patched fonts: Hack, Source Code Pro, more. Glyph collections: Font Awesome, Material Design Icons, Octicons, & more", + "homepage": "https://NerdFonts.com", + "language": "CSS", + "license": "NOASSERTION", + "owner": "ryanoasis", + "owner_avatar": "https://avatars.githubusercontent.com/u/8083459?v=4", + "owner_url": "https://github.com/ryanoasis", + "slug": "ryanoasis/nerd-fonts", + "stars": 64017, + "topics": [ + "font", + "font-awesome", + "fonts", + "hacktoberfest", + "icon-font", + "iconic-fonts", + "octicons", + "patched-fonts", + "patcher", + "powerline", + "python", + "shell", + "statusline" + ] + } + }, + "https://api.github.com/repos/sansan0/TrendRadar": { + "at": 1786030674, + "body": { + "description": "⭐AI-driven public opinion & trend monitor with multi-platform aggregation, RSS, and smart alerts.🎯 告别信息过载,你的 AI 舆情监控助手与热点筛选工具!聚合多平台热点 + RSS 订阅,支持关键词精准筛选。AI 智能筛选新闻 + AI 翻译 + AI 分析简报直推手机,也支持接入 MCP 架构,赋能 AI 自然语言对话分析、情感洞察与趋势预测等。支持 Docker ,数据本地/云端自持。集成微信/飞书/钉钉/Telegram/邮件/ntfy/bark/slack 等渠道智能推送。", + "homepage": "https://trendradar.sandev.cc", + "language": "Python", + "license": "GPL-3.0", + "owner": "sansan0", + "owner_avatar": "https://avatars.githubusercontent.com/u/77180927?v=4", + "owner_url": "https://github.com/sansan0", + "slug": "sansan0/TrendRadar", + "stars": 61222, + "topics": [ + "ai", + "bark", + "data-analysis", + "docker", + "hot-news", + "llm", + "mail", + "mcp", + "mcp-server", + "news", + "ntfy", + "python", + "rss", + "trending-topics", + "wechat", + "wework" + ] + } + }, + "https://api.github.com/repos/sharkdp/bat": { + "at": 1786030614, + "body": { + "description": "A cat(1) clone with wings.", + "homepage": "", + "language": "Rust", + "license": "Apache-2.0", + "owner": "sharkdp", + "owner_avatar": "https://avatars.githubusercontent.com/u/4209276?v=4", + "owner_url": "https://github.com/sharkdp", + "slug": "sharkdp/bat", + "stars": 60125, + "topics": [ + "cli", + "command-line", + "git", + "hacktoberfest", + "rust", + "syntax-highlighting", + "terminal", + "tool" + ] + } + }, + "https://api.github.com/repos/sxyazi/yazi": { + "at": 1786030678, + "body": { + "description": "💥 Blazing fast terminal file manager written in Rust, based on async I/O.", + "homepage": "https://yazi-rs.github.io", + "language": "Rust", + "license": "MIT", + "owner": "sxyazi", + "owner_avatar": "https://avatars.githubusercontent.com/u/17523360?v=4", + "owner_url": "https://github.com/sxyazi", + "slug": "sxyazi/yazi", + "stars": 41103, + "topics": [ + "android", + "asyncio", + "cli", + "command-line", + "concurrency", + "cross-platform", + "developer-tools", + "file-explorer", + "file-manager", + "filesystem", + "linux", + "macos", + "neovim", + "productivity", + "rust", + "terminal", + "tui", + "vim", + "windows" + ] + } + }, + "https://api.github.com/repos/torvalds/linux": { + "at": 1786030651, + "body": { + "description": "Linux kernel source tree", + "homepage": "", + "language": "C", + "license": "NOASSERTION", + "owner": "torvalds", + "owner_avatar": "https://avatars.githubusercontent.com/u/1024025?v=4", + "owner_url": "https://github.com/torvalds", + "slug": "torvalds/linux", + "stars": 241970, + "topics": [] + } + }, + "https://api.github.com/repos/vim/vim": { + "at": 1786030676, + "body": { + "description": "The official Vim repository", + "homepage": "https://www.vim.org", + "language": "Vim Script", + "license": "Vim", + "owner": "vim", + "owner_avatar": "https://avatars.githubusercontent.com/u/11618545?v=4", + "owner_url": "https://github.com/vim", + "slug": "vim/vim", + "stars": 40730, + "topics": [ + "c", + "cross-platform", + "text-editor", + "vim" + ] + } + }, + "https://api.github.com/repos/xkbcommon/libxkbcommon": { + "at": 1786030650, + "body": { + "description": "keymap handling library for toolkits and window systems", + "homepage": "https://xkbcommon.org", + "language": "C", + "license": "NOASSERTION", + "owner": "xkbcommon", + "owner_avatar": "https://avatars.githubusercontent.com/u/4028784?v=4", + "owner_url": "https://github.com/xkbcommon", + "slug": "xkbcommon/libxkbcommon", + "stars": 366, + "topics": [ + "keyboard", + "keyboard-layout", + "keymap", + "wayland", + "x11", + "xkb", + "xkbcommon" + ] + } + }, + "https://api.github.com/repos/xlings-res/interposer-stub": { + "at": 1786030640, + "body": { + "description": "Prebuilt empty ELF stubs for elfpatch.host_link_interposer (AD-12). One per arch; libc-agnostic (-nostdlib, no DT_NEEDED).", + "homepage": "", + "language": "", + "license": "", + "owner": "xlings-res", + "owner_avatar": "https://avatars.githubusercontent.com/u/209817236?v=4", + "owner_url": "https://github.com/xlings-res", + "slug": "xlings-res/interposer-stub", + "stars": 0, + "topics": [] + } + }, + "https://api.github.com/repos/xmake-io/xmake": { + "at": 1786030677, + "body": { + "description": "🔥 A cross-platform build utility based on Lua", + "homepage": "https://xmake.io", + "language": "Lua", + "license": "Apache-2.0", + "owner": "xmake-io", + "owner_avatar": "https://avatars.githubusercontent.com/u/47437979?v=4", + "owner_url": "https://github.com/xmake-io", + "slug": "xmake-io/xmake", + "stars": 12132, + "topics": [ + "build", + "build-tool", + "c", + "c-plus-plus", + "cmake", + "cross-toolchains", + "linux", + "lua", + "makefile", + "objective-c", + "package-manager", + "tbox", + "visual-studio", + "wdk", + "xmake" + ] + } + }, + "https://api.github.com/repos/zulu-openjdk/zulu-openjdk": { + "at": 1786030644, + "body": { + "description": "Dockerfiles for Zulu OpenJDK", + "homepage": "https://registry.hub.docker.com/u/azul/", + "language": "Dockerfile", + "license": "BSD-3-Clause-Clear", + "owner": "zulu-openjdk", + "owner_avatar": "https://avatars.githubusercontent.com/u/8518023?v=4", + "owner_url": "https://github.com/zulu-openjdk", + "slug": "zulu-openjdk/zulu-openjdk", + "stars": 286, + "topics": [] + } + } + }, + "fetched_at": 1786030690, + "schema": 1 +} \ No newline at end of file diff --git a/.xpkgindex/plugins/xim.py b/.xpkgindex/plugins/xim.py new file mode 100644 index 00000000..6c61c941 --- /dev/null +++ b/.xpkgindex/plugins/xim.py @@ -0,0 +1,143 @@ +"""xim / xlings ecosystem plugin for xpkgindex. + +The framework core deliberately knows nothing about xvm, programs or archs — +those are xlings concepts, and they used to sit in the core model where they +leaked onto every other ecosystem's pages (an mcpp package page rendered +"XVM Managed: No", which means nothing there). They live here now. + +Note the namespace difference from mcpp: in xlings a descriptor's `namespace` +is a classification label, while package references resolve as +`[index:]name[@version]` against the *index repo* name. So the namespace must +NOT be joined into the install command — `xlings install config.claude-llm` +is not a thing. +""" + +from __future__ import annotations + +import os +from typing import Any, Dict, List, Optional + +from xpkgindex.models import Block, Facet, FacetValue, Identity, RowSpec +from xpkgindex.plugins import Plugin + +TYPE_TONES = { + "package": "neutral", + "config": "module", + "script": "tool", + "template": "header", + "bugfix": "tool", +} + + +class XimPlugin(Plugin): + api_version = 1 + name = "xim" + + def on_index(self, ctx) -> None: + # Omitting the namespace means "this index's default namespace", which + # xlings takes from the index name — `xim` for the official index + # (docs/design/index-distribution.md §1.1). So a descriptor without a + # `namespace` field is not un-namespaced; it is in `xim`. + ctx.meta.set("default_namespace", + os.path.basename(ctx.root).replace("-pkgindex", "") or "xim") + + def identity(self, raw: Dict[str, Any], path: str) -> Optional[Identity]: + """Short name, explicitly. + + This mirrors what `xlings install` accepts. It is spelled out rather + than left to the core default so that a future change to that default + cannot silently rewrite 154 install commands. + """ + name = str(raw.get("name") or "") + if not name: + name = os.path.basename(path)[: -len(".lua")] + return Identity.plain(str(raw.get("namespace") or ""), name) + + def on_package(self, pkg, raw: Dict[str, Any]) -> None: + ext = { + "programs": raw.get("programs") or [], + "archs": raw.get("archs") or [], + "xvm_enable": bool(raw.get("xvm_enable")), + "categories": raw.get("categories") or [], + "keywords": raw.get("keywords") or [], + "authors": raw.get("authors") or [], + "maintainers": raw.get("maintainers") or [], + "contributors": raw.get("contributors") or "", + "aliases": raw.get("aliases") or [], + } + pkg.extensions["xim"] = ext + + pkg.facets["type"] = pkg.type or "package" + if pkg.status: + pkg.facets["status"] = pkg.status + if ext["categories"]: + pkg.facets["category"] = str(ext["categories"][0]) + if ext["xvm_enable"]: + pkg.extensions.setdefault("_badges", []).append("xvm") + + def facets(self) -> List[Facet]: + return [ + Facet(key="type", label="kind", weight=10, values=[ + FacetValue(key=k, label=k, tone=t) for k, t in TYPE_TONES.items() + ]), + Facet(key="category", label="category", weight=30), + Facet(key="status", label="status", weight=40), + ] + + def row(self, pkg) -> RowSpec: + """Card layout: for a tool index the whole question is "what do I type + to get this", so the row's one strip is the copyable install command + and the binary you end up with sits beside it.""" + ext = pkg.extensions.get("xim", {}) + programs = [str(p) for p in ext.get("programs") or []] + return RowSpec( + variant="card", + tone=TYPE_TONES.get(pkg.type, "neutral"), + lead=pkg.type or "package", + code=(f"$ {programs[0]}" if programs else ""), + badges=list(pkg.extensions.get("_badges", [])), + ) + + def detail_blocks(self, pkg) -> List[Block]: + ext = pkg.extensions.get("xim", {}) + blocks: List[Block] = [] + + programs = [str(p) for p in ext.get("programs") or []] + if programs: + blocks.append(Block( + kind="code", weight=10, + data={"role": "interface", "code": f"$ {programs[0]}", + "tone": TYPE_TONES.get(pkg.type, "tool"), + "label": pkg.type or "package"})) + + items = [] + if programs: + items.append({"key": "programs", "value": ", ".join(programs), "mono": True}) + if ext.get("archs"): + items.append({"key": "architectures", + "value": ", ".join(str(a) for a in ext["archs"]), "mono": True}) + items.append({"key": "xvm managed", "value": "yes" if ext.get("xvm_enable") else "no"}) + if pkg.status: + items.append({"key": "status", "value": pkg.status}) + if ext.get("aliases"): + items.append({"key": "aliases", + "value": ", ".join(str(a) for a in ext["aliases"]), "mono": True}) + if items: + blocks.append(Block(kind="kv", title="Package", data={"items": items}, weight=30)) + + people = [] + if ext.get("authors"): + people.append({"key": "authors", "value": ", ".join(str(a) for a in ext["authors"])}) + if ext.get("maintainers"): + people.append({"key": "maintainers", + "value": ", ".join(str(a) for a in ext["maintainers"])}) + if ext.get("contributors"): + people.append({"key": "contributors", "value": str(ext["contributors"])}) + if people: + blocks.append(Block(kind="kv", title="Credits", data={"items": people}, weight=40)) + + tags = [str(k) for k in ext.get("keywords") or []] + if tags: + blocks.append(Block(kind="list", title="Keywords", collapsed=True, weight=60, + data={"items": tags})) + return blocks From 9208f50985427b8e0b7b6ffd16899d7abf2b159d Mon Sep 17 00:00:00 2001 From: sunrisepeak Date: Fri, 7 Aug 2026 03:07:40 +0800 Subject: [PATCH 2/7] docs(site): rename the guides section to Docs Same documents, one section name shared with the other consumer index. The older `guides` config key still works, so this is a rename rather than a migration. --- .xpkgindex.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.xpkgindex.json b/.xpkgindex.json index c5cb7957..19347dcc 100644 --- a/.xpkgindex.json +++ b/.xpkgindex.json @@ -77,8 +77,8 @@ "plugins": [ ".xpkgindex/plugins/xim.py" ], - "guides": { - "nav_label": "Contribute", + "docs": { + "nav_label": "Docs", "entries": [ { "slug": "contributing", From 24869e3560a84d95932b02f177133bb1660a0c4d Mon Sep 17 00:00:00 2001 From: sunrisepeak Date: Fri, 7 Aug 2026 03:23:54 +0800 Subject: [PATCH 3/7] docs: add a quick start, and point "project" at the repository MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Install xlings, install a package from this index, verify it runs — then searching, listing and updating. Every command is taken from this repo's own README rather than written from memory: notably each install is a single package, which is the only form the repo documents. Also: the About page's project link went to the website; the website stays under the docs link and "project" now points at the repository, matching how mcpp-index reads. --- .xpkgindex.json | 25 ++++++++++++-- docs/quick-start.en.md | 76 ++++++++++++++++++++++++++++++++++++++++++ docs/quick-start.md | 70 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 168 insertions(+), 3 deletions(-) create mode 100644 docs/quick-start.en.md create mode 100644 docs/quick-start.md diff --git a/.xpkgindex.json b/.xpkgindex.json index 19347dcc..25c70fe2 100644 --- a/.xpkgindex.json +++ b/.xpkgindex.json @@ -21,7 +21,7 @@ }, "about": { "project_name": "xlings", - "project_url": "https://xlings.d2learn.org", + "project_url": "https://github.com/openxlings/xlings", "description": "Universal package infrastructure with OS-like SubOS isolation — multi-version, rootless, decentralized index", "maintainers": [ "openxlings", @@ -78,8 +78,15 @@ ".xpkgindex/plugins/xim.py" ], "docs": { - "nav_label": "Docs", "entries": [ + { + "slug": "quick-start", + "title": "快速开始", + "path": "docs/quick-start.md", + "translations": { + "en": "docs/quick-start.en.md" + } + }, { "slug": "contributing", "title": "贡献指南", @@ -100,7 +107,19 @@ "title": "文档索引", "path": "docs/README.md" } - ] + ], + "landing": "quick-start", + "cta": { + "eyebrow": "第一次来?", + "title": "快速开始", + "description": "装好 xlings,从这个索引里装第一个包。", + "lines": [ + "xlings install gcc -y", + "xlings install mcpp -y", + "mcpp --version" + ], + "action": "查看指南" + } }, "ecosystem": { "owners": [ diff --git a/docs/quick-start.en.md b/docs/quick-start.en.md new file mode 100644 index 00000000..7fef4c38 --- /dev/null +++ b/docs/quick-start.en.md @@ -0,0 +1,76 @@ +# Quick start + +**English** | [简体中文](quick-start.md) + +Install xlings, then install your first package from this index. + +## 1. Install xlings + +```bash +# Linux / macOS +curl -fsSL https://d2learn.org/xlings-install.sh | bash +``` + +```powershell +# Windows · PowerShell +irm https://d2learn.org/xlings-install.ps1.txt | iex +``` + +## 2. Install a package + +The name is the one shown on every package page in this index: + +```bash +xlings install gcc -y +gcc --version +``` + +Another one: + +```bash +xlings install mcpp -y +mcpp --version +``` + +Everything lands in xlings' own directory rather than in the system; `-y` +skips the confirmation prompt. + +## 3. Find things, see what you have + +```bash +xlings search gcc # search +xlings list # what is installed +xlings remove gcc # uninstall +``` + +You can browse from this site too: each package page lists the commands it +provides (`programs`), the architectures it supports, and whether xvm manages +its versions. + +## 4. When the index moves + +```bash +xlings update +``` + +Pulls the latest package index. This site's [stats page](../stats/) shows how +many packages the index holds and what was added recently. + +## Where to go next + +**Using xlings** + +- [Documentation](https://xlings.d2learn.org/documents/xim/intro.html) — the + full command set, multi-version management, SubOS isolation +- [Forum](https://forum.d2learn.org/category/9/xlings) — questions and feedback + +**Contributing a package** + +- [Contributing guide](contributing.md) — the end-to-end procedure +- [XPackage V2 spec](V2/xpackage-spec.md) — descriptor fields and constraints +- [Adding a package](V1/add-xpackage.md) — writing a recipe from scratch + +**Running your own index** + +- [xim-pkgindex-template](https://github.com/openxlings/xim-pkgindex-template) — + template repository for a self-hosted, mirrored or private package index diff --git a/docs/quick-start.md b/docs/quick-start.md new file mode 100644 index 00000000..ad47dd96 --- /dev/null +++ b/docs/quick-start.md @@ -0,0 +1,70 @@ +# 快速开始 + +[English](quick-start.en.md) | **简体中文** + +装好 xlings,然后从这个索引里装第一个包。 + +## 1. 安装 xlings + +```bash +# Linux / macOS +curl -fsSL https://d2learn.org/xlings-install.sh | bash +``` + +```powershell +# Windows · PowerShell +irm https://d2learn.org/xlings-install.ps1.txt | iex +``` + +## 2. 装一个包 + +包名就是本索引每个包页面上显示的那个: + +```bash +xlings install gcc -y +gcc --version +``` + +再来一个: + +```bash +xlings install mcpp -y +mcpp --version +``` + +装好的东西放在 xlings 自己的目录里,不动系统环境;`-y` 跳过确认。 + +## 3. 找包、看装了什么 + +```bash +xlings search gcc # 搜索包 +xlings list # 列出已安装的包 +xlings remove gcc # 卸载 +``` + +浏览也可以直接用这个站:每个包页面写着它提供哪些命令(`programs`)、支持哪些架构、是否受 xvm 多版本管理。 + +## 4. 索引更新了 + +```bash +xlings update +``` + +拉取最新的包索引。本站的[统计页](../stats/)能看到索引里有多少包、最近加了什么。 + +## 接下来 + +**用** + +- [xlings 文档](https://xlings.d2learn.org/documents/xim/intro.html) —— 完整命令、多版本管理、SubOS 隔离 +- [论坛](https://forum.d2learn.org/category/9/xlings) —— 提问和反馈 + +**贡献一个包** + +- [贡献指南](contributing.md) —— 端到端流程 +- [XPackage V2 规范](V2/xpackage-spec.md) —— 描述符字段与约束 +- [新增一个包](V1/add-xpackage.md) —— 从零写一个配方 + +**自建索引** + +- [xim-pkgindex-template](https://github.com/openxlings/xim-pkgindex-template) —— 自建 / 镜像 / 私有包索引的模板仓库 From 799975ecbdf647978962f8581309d2dec7b35c8d Mon Sep 17 00:00:00 2001 From: sunrisepeak Date: Fri, 7 Aug 2026 03:46:39 +0800 Subject: [PATCH 4/7] chore(site): say it in the reader's language MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The index defaults to Chinese, so an English or Traditional visitor got a Chinese title, a Chinese quick-start card and Chinese doc names. Site title and lede, the install label, the card, the doc nav titles, the kind/category/ status axes and the Package/Credits/Keywords headings now carry zh / en / zh-Hant. Descriptor field names — programs, aliases, authors — stay as written, so a package page and its .lua still read as the same document. Also splits the two links that shared one entry: 'website' is xlings.d2learn.org (globe icon), 'docs' now points at the documentation itself. --- .xpkgindex.json | 83 ++++++++++++++++++++++++++++++++------- .xpkgindex/plugins/xim.py | 31 +++++++++++---- 2 files changed, 91 insertions(+), 23 deletions(-) diff --git a/.xpkgindex.json b/.xpkgindex.json index 25c70fe2..27435905 100644 --- a/.xpkgindex.json +++ b/.xpkgindex.json @@ -1,13 +1,21 @@ { "site": { - "title": "XIM Package Index", - "description": "Official package index for the xlings package manager", + "title": { + "zh": "XIM 包索引", + "en": "XIM Package Index", + "zh-Hant": "XIM 套件索引" + }, + "description": { + "zh": "xlings 包管理器的官方包索引", + "en": "Official package index for the xlings package manager", + "zh-Hant": "xlings 套件管理器的官方套件索引" + }, "logo": "xim index" }, "links": { "github": "https://github.com/openxlings/xim-pkgindex", + "website": "https://xlings.d2learn.org", "forum": "https://forum.d2learn.org", - "docs": "https://xlings.d2learn.org", "custom": [ { "label": "libxpkg", @@ -17,12 +25,17 @@ "label": "xpkgindex", "url": "https://github.com/openxlings/xpkgindex" } - ] + ], + "docs": "https://xlings.d2learn.org/documents/xim/intro.html" }, "about": { "project_name": "xlings", "project_url": "https://github.com/openxlings/xlings", - "description": "Universal package infrastructure with OS-like SubOS isolation — multi-version, rootless, decentralized index", + "description": { + "zh": "通用包基础设施,带类操作系统的 SubOS 隔离 —— 多版本、免 root、去中心化索引", + "en": "Universal package infrastructure with OS-like SubOS isolation — multi-version, rootless, decentralized index", + "zh-Hant": "通用套件基礎設施,具備類作業系統的 SubOS 隔離 —— 多版本、免 root、去中心化索引" + }, "maintainers": [ "openxlings", "Sunrisepeak" @@ -60,7 +73,11 @@ ], "install_command_template": "xlings install {ref}@{version}", "install": { - "label": "Install xlings", + "label": { + "zh": "安装 xlings", + "en": "Install xlings", + "zh-Hant": "安裝 xlings" + }, "os": [ { "id": "unix", @@ -81,7 +98,11 @@ "entries": [ { "slug": "quick-start", - "title": "快速开始", + "title": { + "zh": "快速开始", + "en": "Quick start", + "zh-Hant": "快速開始" + }, "path": "docs/quick-start.md", "translations": { "en": "docs/quick-start.en.md" @@ -89,36 +110,68 @@ }, { "slug": "contributing", - "title": "贡献指南", + "title": { + "zh": "贡献指南", + "en": "Contributing guide", + "zh-Hant": "貢獻指南" + }, "path": "docs/contributing.md" }, { "slug": "xpackage-spec", - "title": "XPackage V2 规范", + "title": { + "zh": "XPackage V2 规范", + "en": "XPackage V2 spec", + "zh-Hant": "XPackage V2 規範" + }, "path": "docs/V2/xpackage-spec.md" }, { "slug": "add-xpackage", - "title": "新增一个包", + "title": { + "zh": "新增一个包", + "en": "Adding a package", + "zh-Hant": "新增一個套件" + }, "path": "docs/V1/add-xpackage.md" }, { "slug": "docs-index", - "title": "文档索引", + "title": { + "zh": "文档索引", + "en": "Docs index", + "zh-Hant": "文件索引" + }, "path": "docs/README.md" } ], "landing": "quick-start", "cta": { - "eyebrow": "第一次来?", - "title": "快速开始", - "description": "装好 xlings,从这个索引里装第一个包。", + "eyebrow": { + "zh": "第一次来?", + "en": "New here?", + "zh-Hant": "第一次來?" + }, + "title": { + "zh": "快速开始", + "en": "Quick start", + "zh-Hant": "快速開始" + }, + "description": { + "zh": "装好 xlings,从这个索引里装第一个包。", + "en": "Install xlings, then install your first package from this index.", + "zh-Hant": "裝好 xlings,從這個索引裡裝第一個套件。" + }, "lines": [ "xlings install gcc -y", "xlings install mcpp -y", "mcpp --version" ], - "action": "查看指南" + "action": { + "zh": "查看指南", + "en": "Read the guide", + "zh-Hant": "查看指南" + } } }, "ecosystem": { diff --git a/.xpkgindex/plugins/xim.py b/.xpkgindex/plugins/xim.py index 6c61c941..6a956597 100644 --- a/.xpkgindex/plugins/xim.py +++ b/.xpkgindex/plugins/xim.py @@ -20,6 +20,16 @@ from xpkgindex.models import Block, Facet, FacetValue, Identity, RowSpec from xpkgindex.plugins import Plugin +def _t(zh: str, en: str, hant: str) -> Dict[str, str]: + """A string the site renders in the reader's language. + + Field names stay untranslated — `programs`, `aliases`, `authors` are what + the descriptor actually calls them, and a reader comparing the page with + a `.lua` file needs to see the same word. + """ + return {"zh": zh, "en": en, "zh-Hant": hant} + + TYPE_TONES = { "package": "neutral", "config": "module", @@ -77,11 +87,11 @@ def on_package(self, pkg, raw: Dict[str, Any]) -> None: def facets(self) -> List[Facet]: return [ - Facet(key="type", label="kind", weight=10, values=[ + Facet(key="type", label=_t("类型", "kind", "類型"), weight=10, values=[ FacetValue(key=k, label=k, tone=t) for k, t in TYPE_TONES.items() ]), - Facet(key="category", label="category", weight=30), - Facet(key="status", label="status", weight=40), + Facet(key="category", label=_t("分类", "category", "分類"), weight=30), + Facet(key="status", label=_t("状态", "status", "狀態"), weight=40), ] def row(self, pkg) -> RowSpec: @@ -114,16 +124,19 @@ def detail_blocks(self, pkg) -> List[Block]: if programs: items.append({"key": "programs", "value": ", ".join(programs), "mono": True}) if ext.get("archs"): - items.append({"key": "architectures", + items.append({"key": _t("架构", "architectures", "架構"), "value": ", ".join(str(a) for a in ext["archs"]), "mono": True}) - items.append({"key": "xvm managed", "value": "yes" if ext.get("xvm_enable") else "no"}) + items.append({"key": _t("xvm 管理", "xvm managed", "xvm 管理"), + "value": _t("是", "yes", "是") if ext.get("xvm_enable") + else _t("否", "no", "否")}) if pkg.status: items.append({"key": "status", "value": pkg.status}) if ext.get("aliases"): items.append({"key": "aliases", "value": ", ".join(str(a) for a in ext["aliases"]), "mono": True}) if items: - blocks.append(Block(kind="kv", title="Package", data={"items": items}, weight=30)) + blocks.append(Block(kind="kv", title=_t("包信息", "Package", "套件資訊"), + data={"items": items}, weight=30)) people = [] if ext.get("authors"): @@ -134,10 +147,12 @@ def detail_blocks(self, pkg) -> List[Block]: if ext.get("contributors"): people.append({"key": "contributors", "value": str(ext["contributors"])}) if people: - blocks.append(Block(kind="kv", title="Credits", data={"items": people}, weight=40)) + blocks.append(Block(kind="kv", title=_t("致谢", "Credits", "致謝"), + data={"items": people}, weight=40)) tags = [str(k) for k in ext.get("keywords") or []] if tags: - blocks.append(Block(kind="list", title="Keywords", collapsed=True, weight=60, + blocks.append(Block(kind="list", title=_t("关键词", "Keywords", "關鍵字"), + collapsed=True, weight=60, data={"items": tags})) return blocks From 18cf26c52e01444b54ae5bbc18e7c611a8750c6c Mon Sep 17 00:00:00 2001 From: sunrisepeak Date: Fri, 7 Aug 2026 04:47:13 +0800 Subject: [PATCH 5/7] feat(graphics): the discovery layer moves to the program, and WSL2 gets a GPU The 22-package graphics stack renders in a container with no /usr at all, and until this commit nothing could reach it: no package in the index depended on `mesa`, and the environment mesa needs -- which driver module to load, which GL vendors exist -- existed only inside a `subos use` sub-shell. `xlings install godot && godot` in an ordinary terminal got the stack on RPATH and no way to find a driver. Surveyed six ecosystems first (Steam pressure-vessel, NixOS, nixGL, nix-system-graphics, Snap gpu-2404, Flatpak, conda). Not one binds graphics discovery to a shell. Nix wraps the program, Snap uses a command-chain wrapper, Flatpak and pressure-vessel set it for the sandbox. And nixGL's README independently documents the failure we already hit with LD_LIBRARY_PATH: env vars propagate to every child, and system programs crash. So the rule this commit applies: configuration binds to the NARROWEST scope that works. Object (RPATH) < program (`xvm.add{envs}`) < shell (`subos.env`). The stack used only the widest one; `xvm.add{envs}` has existed all along and ten recipes use it. ## libs/graphics.lua -- one table, two renderings `consumer_envs()` for a program's shim (`${XLINGS_DYNAMIC_SUBOS_DIR}`-relative, resolved at DISPATCH against the active subos) and `declare_subos_env()` for the shell (`${subosdir}`), generated from one table so the two cannot disagree. Values are subos-relative rather than `${pkgdir}`: a payload path pins a version directory, and the subos view is the stable indirection -- the role /run/opengl-driver plays on NixOS. `mesa` now places `lib/dri` into `/usr/lib/dri`, so it is complete by construction. `usr/lib/dri`, not `lib/dri`, and that is not cosmetic: xlings only permits a file asset whose destination starts with usr/etc/share, and a REJECTED DESTINATION IS NOT AN ERROR -- the placement silently does not happen. A `lib/dri` would have installed cleanly, pointed LIBGL_DRIVERS_PATH at nothing and rendered on llvmpipe. ## A1: one shared glvnd vendor directory libglvnd scans `__EGL_VENDOR_LIBRARY_DIRS` in list order and sorts files WITHIN each directory by name. So with mesa and nvidia-gl-host-link each contributing their own payload directory, the `10_nvidia` < `50_mesa` convention meant nothing, and NVIDIA-before-mesa held only because xlings sorts providers by binding string and `mesa@` sorts before `nvidia-gl-host-link@`. Correct by alphabet. Both now place into one directory and declare that one, so the filename decides -- as it does on the host. Distributions went through this: before libglvnd they swapped the whole libGL.so.1 with update-alternatives / eselect opengl, one vendor at a time. Two directories is the halfway state. ## A3 + A9: one command, five host shapes, no conditionals `graphics` (0 payload) depends on mesa plus two sentinels. Each probes for a userspace half it does not own and succeeds having linked nothing when it is absent -- so depending on both is correct everywhere and the dependency graph adapts by itself. That is what conda gets from `__cuda`/`__glibc` virtual packages, without a solver feature. `wsl-gl-host-link` is new, and WSL2 was a platform this stack silently did not support: there is no DRM node for the GPU, it is reached only through mesa's `d3d12` gallium driver and /usr/lib/wsl/lib, so a subos on WSL2 rendered on llvmpipe with no diagnostic. It needs NO interposer, unlike the NVIDIA sentinel, and the reason is structural: glvnd dlopens a vendor BY NAME, so libGLX_nvidia is its own load-chain root with no RPATH of ours above it. `libd3d12core.so` is dlopened by `d3d12_dri.so`, which is OUR file with OUR DT_RPATH -- verified on the shipped payload, whose dri modules carry a full RPATH ending in the subos lib directory. A symlink in the farm is enough. It links the WHOLE set (R7: libd3d12core dlopens libdxcore, a Microsoft file with no RPATH of ours), measures and records the borrowed set's glibc floor -- the line between "borrowing" and "chasing versions", and mcpp#352 is what the wrong side of it looks like -- and declares GALLIUM_DRIVER=d3d12 only on WSL, because mesa does not always select d3d12 by itself (microsoft/wslg#1332). ## A8: four answers to "where is the host's ", three wrong libs/hostlib.lua: ask `ldconfig -p` (the loader's own index, and the only thing that knows /usr/lib/wsl/lib), filter by ELF class, first hit wins. There is no layout to assume -- FHS biarch makes /usr/lib 32-bit, Debian declined that clause so its /usr/lib is 64-bit, Arch is a third answer -- so a candidate list is a decision to be wrong somewhere. That is mcpp#352. nvidia-gl-host-link had it right; godot was right by ordering accident with no ABI check; verify-host-link.sh pinned the Debian path and SKIPPED ITS OWN CHECK 4 IN SILENCE on every other distribution while still printing PASS. All now go through hostlib. The new CI invariant found a fifth: libcuda-host-link, the package the whole sentinel pattern came from. The verifier now counts skips and reports them in the verdict, because "PASS: 12 checks" was compatible with two of them never having run. ## A6: the driver pair, checked at run time A distribution makes "kernel module and driver userspace are one version" an install-time invariant and DKMS rebuilds on kernel upgrade. We do not own the kernel module, so the same invariant can only be a run-time check: the sentinel stamps /sys/module/nvidia/version and ships `xlings-gl-doctor`, which compares it to the live one, lists dangling links and reports the interposer fraction. The install log now carries the driver version, because `4/4` is only true for the driver it was measured against. Not a doctor rule: this repo already has three report/repair pairs that drifted because the check and the fix live in different files. ## A7: godot uses the stack deps `graphics`, `envs = graphics.consumer_envs()`, and the host-directory probe demoted to a fallback for a home without the stack -- kept, because removing it breaks every existing install. The `xpm.linux` comment claiming a full X11/mesa/wayland stack via xim is "infeasible" is corrected: it has been falsified, and borrowing the host's Mesa is not merely unnecessary but the failure mode, since it tracks the host's glibc forever (mcpp#352). Tested: 779 static tests pass; libs/hostlib.lua has a plain-Lua behaviour harness run against a FORGED BIARCH HOST (32-bit libGLX in /usr/lib, the real one in /usr/lib64) -- the #352 shape -- 10/10, skipped rather than failed where no lua interpreter exists. Design: openxlings/xlings .agents/docs/2026-08-07-graphics-experience-industry-survey-and-plan.md Refs: mcpp-community/mcpp#352 --- .agents/tools/graphics/verify-host-link.sh | 89 +++++-- .xlings-index-cache.json | 2 +- libs/graphics.lua | 212 +++++++++++++++++ libs/hostlib.lua | 260 +++++++++++++++++++++ pkgs/g/godot.lua | 148 +++++++++--- pkgs/g/graphics.lua | 137 +++++++++++ pkgs/l/libcuda-host-link.lua | 69 ++---- pkgs/m/mesa.lua | 58 ++--- pkgs/n/nvidia-gl-host-link.lua | 243 +++++++++++++------ pkgs/w/wsl-gl-host-link.lua | 251 ++++++++++++++++++++ tests/lua/hostlib_harness.lua | 136 +++++++++++ tests/test_hostlib.py | 152 ++++++++++++ 12 files changed, 1562 insertions(+), 195 deletions(-) create mode 100644 libs/graphics.lua create mode 100644 libs/hostlib.lua create mode 100644 pkgs/g/graphics.lua create mode 100644 pkgs/w/wsl-gl-host-link.lua create mode 100644 tests/lua/hostlib_harness.lua create mode 100644 tests/test_hostlib.py diff --git a/.agents/tools/graphics/verify-host-link.sh b/.agents/tools/graphics/verify-host-link.sh index 6b698720..0864decf 100755 --- a/.agents/tools/graphics/verify-host-link.sh +++ b/.agents/tools/graphics/verify-host-link.sh @@ -26,9 +26,14 @@ SYS="$HOME_DIR/subos/$SUBOS" HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" WORK="$(mktemp -d)"; trap 'rm -rf "$WORK"' EXIT -pass=0; fail=0 +pass=0; fail=0; skipped=0 ok() { echo " ✓ $*"; pass=$((pass+1)); } bad() { echo " ✗ $*"; fail=$((fail+1)); } +# A check that did not run is its own outcome, counted and reported in the +# verdict. Before this, three places in this script skipped in a `·` line that +# the summary never mentioned -- so "PASS: 12 checks" was compatible with two of +# them never having executed. +skip() { echo " ! $*"; skipped=$((skipped+1)); } sect() { echo; echo "── $* ─────────────────────────────"; } XB="${XLINGS_BIN:-}" @@ -63,7 +68,7 @@ if [[ -z "$NVLIB" ]]; then else for f in libEGL_nvidia.so.0 libGLX_nvidia.so.0 libGLESv1_CM_nvidia.so.1 libGLESv2_nvidia.so.2; do if [[ ! -e "$NVLIB/$f" ]]; then - echo " · $f absent on this host, skipped" + skip "$f absent on this host — that entry point is unproven" elif [[ -L "$NVLIB/$f" ]]; then bad "$f is a symlink into $(readlink "$NVLIB/$f") — its deps resolve from the host" else @@ -106,7 +111,7 @@ fi sect "2. GLX renders, through our payload" if [[ -z "${DISPLAY:-}" ]]; then - echo " · DISPLAY unset, GLX skipped (this leaves entry point 2 of 4 unproven)" + skip "DISPLAY unset, GLX skipped — this leaves entry point 2 of 4 unproven" else if "$CC" -O0 -o "$WORK/glxprobe" "$HERE/glxprobe.c" -ldl \ -Wl,--dynamic-linker="$SYS/lib/ld-linux-x86-64.so.2" \ @@ -132,20 +137,68 @@ envout="$("$XB" subos use "$SUBOS" --cmd 'echo "LLP=[${LD_LIBRARY_PATH}]"' 2>/de || bad "the subos sets $envout — the results above do not isolate DT_RPATH" sect "4. the host's driver files were not modified" -hostbad=0 -for f in libEGL_nvidia.so.0 libGLX_nvidia.so.0; do - p="/usr/lib/x86_64-linux-gnu/$f" - [[ -e "$p" ]] || continue - # An interposer written over a followed symlink would land HERE. The shape - # is the check: the host's vendor names its own private libs, never an - # absolute path into a store. - if patchelf --print-needed "$p" 2>/dev/null | grep -q '^/'; then - bad "$p has an absolute DT_NEEDED — it was overwritten" - hostbad=1 - fi -done -[[ $hostbad -eq 0 ]] && ok "host vendor libraries are untouched" +# The vendor directory is PROBED, not written down. +# +# This used to say `/usr/lib/x86_64-linux-gnu/$f` with `[[ -e "$p" ]] || continue` +# -- the Debian multiarch path, skipped in silence everywhere else. On Fedora, +# RHEL or SUSE (64-bit in /usr/lib64) and on Arch (64-bit in /usr/lib) the check +# therefore examined NOTHING and still printed a ✓ and counted toward PASS. +# That is the same layout assumption as mcpp#352, one layer worse: this file +# exists to prove something. +# +# Same three rules as libs/hostlib.lua, in shell: `ldconfig -p` with the ABI +# token first, then the three layouts, ELF class checked, first hit wins. +host_vendor_dir() { + local soname="$1" p d + while read -r p; do + [[ -f "$p" ]] || continue + [[ "$(od -An -tu1 -j4 -N1 "$p" 2>/dev/null | tr -d ' ')" == 2 ]] || continue + dirname "$p"; return 0 + done < <(ldconfig -p 2>/dev/null \ + | awk -v s="$soname" 'index($0, s) && /x86-64/ {print $NF}') + for d in /usr/lib/x86_64-linux-gnu /lib/x86_64-linux-gnu \ + /usr/lib64 /lib64 /usr/lib /lib; do + p="$d/$soname" + [[ -f "$p" ]] || continue + [[ "$(od -An -tu1 -j4 -N1 "$p" 2>/dev/null | tr -d ' ')" == 2 ]] || continue + echo "$d"; return 0 + done + return 1 +} + +NVHOST="$(host_vendor_dir libGLX_nvidia.so.0 || true)" +if [[ -z "$NVHOST" ]]; then + # NOT a silent skip. A run that could not find the host's vendor cannot make + # any claim about it, and saying nothing reads identically to "checked, fine". + skip "no 64-bit host NVIDIA vendor found — check 4 NOT PERFORMED" +else + echo " · host vendor dir: $NVHOST" + hostbad=0 + for f in libEGL_nvidia.so.0 libGLX_nvidia.so.0; do + p="$NVHOST/$f" + [[ -e "$p" ]] || continue + # An interposer written over a followed symlink would land HERE. The shape + # is the check: the host's vendor names its own private libs, never an + # absolute path into a store. + if patchelf --print-needed "$p" 2>/dev/null | grep -q '^/'; then + bad "$p has an absolute DT_NEEDED — it was overwritten" + hostbad=1 + fi + done + [[ $hostbad -eq 0 ]] && ok "host vendor libraries are untouched" +fi echo -if [[ $fail -eq 0 ]]; then echo "PASS: $pass checks"; exit 0 -else echo "FAIL: $fail failed, $pass passed"; exit 1; fi +# Skips are reported in the verdict, not only next to the check they replaced. +# A reader who sees "PASS: 12 checks" and does not scroll up must still learn +# that one of them did not happen. +if [[ $skipped -gt 0 ]]; then + echo "NOT PERFORMED: $skipped check(s) — see the ! lines above" +fi +if [[ $fail -eq 0 ]]; then + echo "PASS: $pass checks$([[ $skipped -gt 0 ]] && echo ", $skipped not performed")" + exit 0 +else + echo "FAIL: $fail failed, $pass passed$([[ $skipped -gt 0 ]] && echo ", $skipped not performed")" + exit 1 +fi diff --git a/.xlings-index-cache.json b/.xlings-index-cache.json index 1a3c5b90..156c630e 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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/data/xim-pkgindex/pkgs/g/godot.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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/data/xim-pkgindex/pkgs/w/windows-acp.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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/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/0497622e-d435-47ae-87ed-ff9f1b2a9f49/scratchpad/gfxhome2/data/xim-pkgindex/pkgs/z/zoxide.lua","ref":"","type":0,"version":""}},"mutex_groups":{},"repo_head_hash":"2a71c141e7a99880ff675927af55a2258d9ae90b","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: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-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":"799975ecbdf647978962f8581309d2dec7b35c8d","version":2} \ No newline at end of file diff --git a/libs/graphics.lua b/libs/graphics.lua new file mode 100644 index 00000000..1157c9cc --- /dev/null +++ b/libs/graphics.lua @@ -0,0 +1,212 @@ +-- The graphics stack's discovery layer, declared in one place. +-- +-- Loaded by package hooks via: +-- import("xim.pkgindex.graphics") +-- +-- WHAT "DISCOVERY" MEANS HERE +-- +-- A GL program needs three things: a loader and a libc (bootstrap), a way to +-- find its libraries (RPATH), and the paths its subsystems read at runtime -- +-- which driver modules to load, which GL vendors exist, where the Vulkan ICD +-- manifests are. The third one is this module. It cannot be an RPATH: the +-- process that has to see it is the user's own binary, and mesa reads it from +-- the environment. +-- +-- THE SCOPE RULE +-- +-- Configuration that reaches a process should be bound to the narrowest thing +-- that works. Three scopes exist, and the graphics stack now uses the two +-- narrow ones: +-- +-- S1 object DT_RPATH / interposer -- one load chain +-- S2 program xvm.add{ envs = ... } -- one program and its children +-- S3 shell subos.env{} -- every process in the subos +-- +-- S3 alone was what this stack had, and it is wrong in both directions. It +-- LEAKS: a host binary run inside the subos inherits LIBGL_DRIVERS_PATH and +-- dlopens OUR driver module under the HOST loader, which fails on +-- libgallium. And it does not REACH: `subos.env` is applied by `subos use`, +-- so `xlings install godot && godot` in an ordinary login shell gets a subos +-- on PATH and none of the paths below. +-- +-- No other ecosystem binds graphics discovery to a shell. Nix wraps the +-- program (`makeWrapper`), Snap uses a `command-chain` wrapper, Flatpak and +-- pressure-vessel set it for the sandbox/container. S2 is that mechanism, and +-- xlings has had it all along -- ten recipes use `xvm.add{envs}`; the graphics +-- stack used none. +-- +-- ONE SOURCE, TWO RENDERINGS +-- +-- The values are subos-relative, and the two consumers spell "this subos" +-- differently: `subos.env` resolves `${subosdir}`, and an xvm shim resolves +-- `${XLINGS_DYNAMIC_SUBOS_DIR}` -- the latter at DISPATCH time, so a program +-- installed while subos A was active still gets subos B's paths when run +-- there. Both spellings are generated from one table below, so S2 and S3 +-- cannot say different things. +-- +-- WHY SUBOS-RELATIVE AND NOT `${pkgdir}` +-- +-- `${pkgdir}` is the declaring package's payload, which pins a version +-- directory: upgrading mesa leaves a consumer's recorded env naming the old +-- one. The subos view is the stable indirection -- the same role +-- `/run/opengl-driver` plays on NixOS, `/overrides` in pressure-vessel and +-- `$SNAP/gpu-2404` in a snap. It is assembled by the declarations below, so +-- it is complete by construction rather than by hope. +-- +-- Design: xlings/.agents/docs/2026-08-07-graphics-experience-industry-survey-and-plan.md §A1, §A2 + +import("xim.libxpkg.log") +import("xim.libxpkg.xvm") +import("xim.libxpkg.subos") + +local graphics = {} + +-- The subos-relative locations that make up the discovery layer. +-- +-- `dri` is under `usr/`, not `lib/`, and that is not cosmetic: xlings only +-- permits a file asset whose destination starts with `usr`, `etc` or `share` +-- (xvm/bindings.cppm is_permitted_file_destination), and a rejected +-- destination is NOT an error -- the placement simply does not happen. A +-- `dst = "lib/dri"` would have produced a recipe that installs cleanly, sets +-- LIBGL_DRIVERS_PATH to a directory that does not exist, and renders on +-- llvmpipe. `usr/lib/dri` is also consistent with `usr/include`, where the +-- stack's headers already live. +graphics.DRI_DIR = "usr/lib/dri" +graphics.EGL_VENDOR_DIR = "share/glvnd/egl_vendor.d" +graphics.SHARE_DIR = "share" + +-- The variables, once. Keys are variable names; values are subos-relative +-- paths, with no placeholder syntax -- the two emitters below add their own. +-- +-- XDG_DATA_DIRS carries the Vulkan ICD search path as a side effect, and that +-- is deliberate rather than incidental: the Vulkan loader searches +-- `$XDG_DATA_DIRS/vulkan/icd.d`, so once a `vulkan-loader` package exists, +-- mesa's ICD manifests are found with no new variable. `VK_DRIVER_FILES` would +-- be wrong here -- it is an OVERRIDE that suppresses system discovery, so it +-- would hide any other ICD on the machine. +local DISCOVERY = { + { var = "LIBGL_DRIVERS_PATH", rel = graphics.DRI_DIR }, + { var = "__EGL_VENDOR_LIBRARY_DIRS", rel = graphics.EGL_VENDOR_DIR }, + { var = "XDG_DATA_DIRS", rel = graphics.SHARE_DIR }, +} + +-- S2 -- the table a CONSUMER's shim carries. +-- +-- xvm.add("godot", { envs = graphics.consumer_envs(), ... }) +-- +-- Every value is identical for every consumer, which is the point: a consumer +-- does not need to locate mesa's payload, and nothing has to be re-recorded +-- when mesa is upgraded. +-- +-- The shim merges each value into whatever the process already has, front-most +-- and de-duplicated, so a user who exported their own LIBGL_DRIVERS_PATH keeps +-- it and a doubled entry cannot accumulate across nested invocations. +function graphics.consumer_envs() + local envs = {} + for _, d in ipairs(DISCOVERY) do + envs[d.var] = "${XLINGS_DYNAMIC_SUBOS_DIR}/" .. d.rel + end + return envs +end + +-- S3 -- the same values for a subos shell. +-- +-- `prepend`, never `set`, for all three: they are colon-separated LISTS and +-- more than one package is entitled to be on them. A `set` by one provider +-- beats a `prepend` by another in xlings's resolution, so a `set` here would +-- silently erase the NVIDIA vendor directory and the machine with the GPU +-- would render on llvmpipe. +-- +-- Returns false on a client with no `subos.env`, so a caller can say so. The +-- probe is `type(...) == "function"`, never truthiness: `import()` answers an +-- unknown module with a permissive proxy whose every key is truthy, so +-- `if subos.env then` takes the new branch on clients that then discard the +-- call. +-- `only` restricts the declaration to a set of variable names. A vendor +-- sentinel contributes an EGL vendor directory and nothing else: it has no +-- driver modules and no `share/` tree, so declaring LIBGL_DRIVERS_PATH from +-- there would name a path it does not fill. Both packages declaring the SAME +-- shared vendor directory is fine and intended -- `prepend` de-duplicates, and +-- either package being absent must not remove it for the other. +function graphics.declare_subos_env(tag, only) + if type(subos.env) ~= "function" then return false end + for _, d in ipairs(DISCOVERY) do + if not only or only[d.var] then + subos.env{ var = d.var, op = "prepend", + value = "${subosdir}/" .. d.rel, binding = tag } + end + end + return true +end + +-- The set a vendor-only provider passes to declare_subos_env. +graphics.EGL_VENDOR_ONLY = { ["__EGL_VENDOR_LIBRARY_DIRS"] = true } + +-- Place one glvnd EGL vendor JSON into the subos's SHARED vendor directory. +-- +-- WHY SHARED, AND WHY THIS IS THE POINT OF THE CHANGE +-- +-- libglvnd scans the directories in `__EGL_VENDOR_LIBRARY_DIRS` IN LIST ORDER +-- and sorts the `*.json` files WITHIN each directory by filename (scandir + +-- strcmp). So the `10_nvidia.json` < `50_mesa.json` convention -- which is how +-- every distribution expresses vendor priority -- only has meaning inside one +-- directory. +-- +-- When mesa and nvidia-gl-host-link each contributed their OWN payload +-- directory, cross-vendor priority was decided by the order xlings happened to +-- resolve two `prepend` declarations: sorted by binding string, later provider +-- front-most. `mesa@...` < `nvidia-gl-host-link@...`, so NVIDIA landed first +-- and the result was correct -- by alphabetical accident, with a third vendor +-- or a renamed package enough to change it. +-- +-- Both packages now place into ONE directory and declare that one directory, +-- so the filename convention decides, exactly as it does on the host. This is +-- what "behaves the same inside the subos as outside" means for this variable. +-- +-- Distributions went through this: before libglvnd they swapped the whole +-- libGL.so.1 with `update-alternatives` / `eselect opengl`, one vendor at a +-- time; glvnd plus one shared vendor directory is what made Mesa and a +-- proprietary driver coexist. Two directories is the halfway state. +function graphics.declare_egl_vendor(install_dir, rel_json, tag) + if not xvm.files then + log.warn("this xlings has no `xvm.files`; the EGL vendor JSON stays in " + .. "the payload and cross-vendor priority falls back to " + .. "declaration order. Run `xlings self update`.") + return false + end + if not os.isfile(path.join(install_dir, rel_json)) then + -- Not an error: a sentinel with no host driver writes no vendor JSON. + return true + end + xvm.files{ + src = rel_json, + dst = path.join(graphics.EGL_VENDOR_DIR, path.filename(rel_json)), + binding = tag, + } + return true +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 +-- headers: mesa is the only package that ships `lib/dri`, so there is nothing +-- to merge. A file asset is placed as a symlink (`fs::create_symlink` after a +-- staging rename), so the payload is untouched and re-placement is idempotent. +-- +-- The alternative -- `sysroot.declare_libs(dir, "lib/dri", ...)` -- would work +-- and was rejected: it flattens twelve driver modules into `/lib`, +-- which is the LINK directory. Those modules are loaded by path and are not +-- link targets; mesa's own recipe already says so. +function graphics.declare_dri(install_dir, rel_dir, tag) + if not xvm.files then return false end + if not os.isdir(path.join(install_dir, rel_dir)) then + log.warn("no %s in this payload -- LIBGL_DRIVERS_PATH would point at " + .. "an empty directory and GL would fall back to software " + .. "rendering with no diagnostic", rel_dir) + return false + end + xvm.files{ src = rel_dir, dst = graphics.DRI_DIR, binding = tag } + return true +end + +return graphics diff --git a/libs/hostlib.lua b/libs/hostlib.lua new file mode 100644 index 00000000..f5ab196b --- /dev/null +++ b/libs/hostlib.lua @@ -0,0 +1,260 @@ +-- Resolve a library that belongs to the HOST, the way the loader would. +-- +-- Loaded by package hooks via: +-- import("xim.pkgindex.hostlib") +-- +-- WHY THIS EXISTS AS ONE MODULE +-- +-- Four places in this ecosystem ask "where is the host's ", and before +-- this module they gave four different answers -- three of them wrong: +-- +-- * nvidia-gl-host-link ldconfig -p + ABI filter + first-wins correct +-- * compat.glx-runtime hardcoded list, `ln -sf` LAST-wins, no ABI wrong +-- * godot hardcoded list, no ABI check lucky +-- * verify-host-link.sh one hardcoded Debian path, silent skip wrong +-- +-- The wrong ones are not sloppiness. They are all the same reasonable-looking +-- mistake: assume a directory layout. And there is no layout to assume -- +-- +-- * The FHS biarch clause says /usr/lib is 32-bit and /usr/lib64 is 64-bit. +-- Red Hat and SUSE follow it. +-- * Debian and Ubuntu explicitly DECLINED that clause and use multiarch: +-- /usr/lib/. So on Debian /usr/lib holds 64-bit libraries. +-- * Arch and Gentoo are a third answer again: /usr/lib64 is a symlink to +-- /usr/lib, and 64-bit lives in /usr/lib. +-- +-- None of the three is wrong, so a candidate list is not a conservative +-- choice -- it is a choice to be wrong on some distribution. mcpp#352 is that +-- bug: on Fedora the 32-bit /usr/lib/libGLX.so.0 overwrote the correct +-- /usr/lib64 one, and dlopen reported `wrong ELF class: ELFCLASS32`. +-- +-- THE THREE RULES +-- +-- 1. Ask `ldconfig -p` first. That is the loader's own index, built from +-- /etc/ld.so.conf.d/*.conf, and it is the only authority on this host -- +-- including paths no list would contain (/usr/lib/wsl/lib on WSL2, +-- /opt/... on hand-rolled installs). +-- 2. Filter by ELF class / ABI. `ldconfig -p` tags every entry +-- (`libc6,x86-64`); for the fallback paths we read e_ident[EI_CLASS] out +-- of the file itself. This is what turns "wrong directory" from a +-- silently wrong answer into no answer. +-- 3. First hit wins. The one place that got this right returned on first +-- hit; the one that got it wrong overwrote with `ln -sf` in loop order. +-- +-- Design: xlings/.agents/docs/2026-08-07-graphics-experience-industry-survey-and-plan.md §9.2 + +import("xim.libxpkg.log") + +local hostlib = {} + +-- ELF class of FILE, read from the file itself: 32, 64, or nil (not an ELF). +-- +-- Five bytes, no external tool. `readelf`/`file`/`patchelf` would all work and +-- all three are things that may not be installed at the moment a hook runs -- +-- and a probe that answers "cannot tell" by falling through to "looks fine" is +-- the failure this module exists to remove. +function hostlib.elf_class(file) + local f = io.open(file, "rb") + if not f then return nil end + local head = f:read(5) + f:close() + if not head or #head < 5 then return nil end + if head:sub(1, 4) ~= "\127ELF" then return nil end + local class = head:byte(5) + if class == 1 then return 32 end + if class == 2 then return 64 end + return nil +end + +-- The ABI token `ldconfig -p` prints for this architecture. +-- +-- Keyed by what the recipe is being built for, not by what the host is: these +-- packages are x86_64 today, and when an arm64 one appears its probe must ask +-- for AArch64 rather than silently accept an x86-64 entry. +local ABI_TOKENS = { + x86_64 = "x86-64", + aarch64 = "AArch64", +} + +-- The fallback directories, covering all three layouts. +-- +-- Order is multiarch, then biarch, then the plain one -- but the order is NOT +-- what makes this correct. Rule 2 is: every candidate is ELF-class checked, so +-- Fedora's 32-bit /usr/lib is REJECTED rather than merely sorted last. The +-- order only decides between two equally valid answers. +local function default_dirs(arch) + local triplet = (arch == "aarch64") and "aarch64-linux-gnu" + or "x86_64-linux-gnu" + return { + "/usr/lib/" .. triplet, -- Debian / Ubuntu multiarch + "/lib/" .. triplet, -- ditto, pre-usrmerge spelling + "/usr/lib64", -- FHS biarch: Fedora / RHEL / SUSE + "/lib64", + "/usr/lib", -- Arch / Gentoo (64-bit); Fedora (32-bit!) + "/lib", + } +end + +-- Every host directory that holds a 64-bit SONAME, in resolution order. +-- +-- Returns a list rather than one answer, because two callers want different +-- things from the same probe: `dir_of` wants the first, and a caller building +-- a search path may want all of them. Both get rule 2 applied. +-- +-- opt.arch target architecture (default: x86_64) +-- opt.extra_dirs searched BEFORE the defaults, for a layout only the caller +-- knows about (`/usr/lib/wsl/lib`). Still ELF-class checked -- +-- a caller-supplied path is not a trusted path. +function hostlib.dirs_of(soname, opt) + opt = opt or {} + local arch = opt.arch or "x86_64" + local want = ABI_TOKENS[arch] + local class = 64 + local out, seen = {}, {} + + local function push(dir) + if dir and dir ~= "" and not seen[dir] then + seen[dir] = true + table.insert(out, dir) + end + end + + -- RULE 1 -- the loader's own index. + -- + -- Parsed for the ABI token as well as the name: on a biarch host both the + -- 32- and 64-bit entries are present under one soname, and taking the + -- first line is how you get a 32-bit answer from an authoritative source. + local listing = try { + function() return os.iorun("ldconfig -p 2>/dev/null") end + } + if listing and listing ~= "" then + for line in listing:gmatch("[^\n]+") do + if line:find(soname, 1, true) + and (not want or line:find(want, 1, true)) then + local p = line:match("=>%s*(/%S+)") + -- Verified on disk, not merely listed: the cache outlives the + -- files it names, and a stale entry is exactly the shape that + -- makes a probe succeed and the dlopen fail. + if p and os.isfile(p) and hostlib.elf_class(p) == class then + push(path.directory(p)) + end + end + end + end + + -- RULE 2 + the fallback. Reached on a host with no populated ld.so.cache + -- (minimal containers) and for a caller-supplied layout. + local dirs = {} + for _, d in ipairs(opt.extra_dirs or {}) do table.insert(dirs, d) end + for _, d in ipairs(default_dirs(arch)) do table.insert(dirs, d) end + for _, d in ipairs(dirs) do + local p = path.join(d, soname) + if os.isfile(p) and hostlib.elf_class(p) == class then push(d) end + end + + return out +end + +-- The directory holding the host's SONAME, or nil. +-- +-- RULE 3 -- first hit. `nil` means "this host does not have it", which for +-- every caller in this index is a normal state to be reported, not an error to +-- be worked around by guessing. +function hostlib.dir_of(soname, opt) + local dirs = hostlib.dirs_of(soname, opt) + return dirs[1] +end + +function hostlib.path_of(soname, opt) + local d = hostlib.dir_of(soname, opt) + return d and path.join(d, soname) or nil +end + +-- Every file in DIR whose name starts with one of PREFIXES, 64-bit only. +-- +-- Enumerated rather than listed by the caller for the reason +-- nvidia-gl-host-link enumerates: the private halves of a driver carry the +-- driver version in the SONAME, so a fixed list is a list of one release. And +-- ELF-class filtered for the reason above -- a 32-bit sibling in the same +-- directory (Fedora ships both) must not be linked into a 64-bit payload. +function hostlib.entries_with_prefix(dir, prefixes) + local names = {} + if not dir or not os.isdir(dir) then return names end + local f = io.popen(string.format([[ls -1 "%s" 2>/dev/null]], dir)) + if not f then return names end + for line in f:lines() do + local name = line:gsub("[\r\n]+$", "") + if name ~= "" then + for _, p in ipairs(prefixes) do + if name:find(p) then + local full = path.join(dir, name) + -- A symlink is followed by elf_class, which is what we + -- want: the link's target decides, and a dangling link + -- answers nil and is dropped. + if hostlib.elf_class(full) == 64 then + table.insert(names, name) + end + break + end + end + end + end + f:close() + return names +end + +-- Where this distribution WILL put a 64-bit library that is not installed yet. +-- +-- The one question in this module that cannot be probed, and therefore the one +-- place a layout table is legitimate: a sentinel that links to a driver the +-- user has not installed yet needs a path that will become correct later +-- (`libcuda-host-link`'s self-heal case). There is no file to read the ELF +-- class of, so `/etc/os-release` is the only evidence available. +-- +-- Kept HERE rather than in that recipe so the layout knowledge still lives in +-- exactly one file -- which is what lets the CI invariant ("no recipe +-- enumerates distro library directories") have no exceptions. +-- +-- Answers a DIRECTORY. The caller joins the soname, so this cannot drift from +-- dir_of's contract. +function hostlib.canonical_libdir(arch) + arch = arch or "x86_64" + local triplet = (arch == "aarch64") and "aarch64-linux-gnu" + or "x86_64-linux-gnu" + if os.isfile("/etc/os-release") then + local content = io.readfile("/etc/os-release") or "" + local idl = ((content:match("ID=([^\n]*)") or "") .. " " .. + (content:match("ID_LIKE=([^\n]*)") or "")):lower() + idl = idl:gsub('"', '') + if idl:find("debian") or idl:find("ubuntu") or idl:find("mint") then + return "/usr/lib/" .. triplet + elseif idl:find("fedora") or idl:find("rhel") or idl:find("centos") + or idl:find("opensuse") or idl:find("suse") then + return "/usr/lib64" + elseif idl:find("arch") or idl:find("manjaro") then + return "/usr/lib" + end + end + -- The multiarch default, and it is a default rather than a guess for one + -- reason: on a biarch host it is simply absent, so a link pointing there + -- stays dangling and visibly does nothing -- whereas defaulting to + -- /usr/lib would, on that same host, resolve to the 32-BIT directory and + -- produce `wrong ELF class` from a link that looks correct. + return "/usr/lib/" .. triplet +end + +-- Say what was found, once, in the form a reader can act on. +-- +-- Separate from the probe so a caller that legitimately expects nothing (a +-- sentinel on a host without that driver) does not print a scary line, and one +-- that expected something can say so in its own words. +function hostlib.report(soname, dir) + if dir then + log.info("host %s -> %s", soname, dir) + else + log.warn("host %s not found (ldconfig -p and the three standard " + .. "layouts were checked, 64-bit only)", soname) + end +end + +return hostlib diff --git a/pkgs/g/godot.lua b/pkgs/g/godot.lua index f010c2e6..4c10ce41 100644 --- a/pkgs/g/godot.lua +++ b/pkgs/g/godot.lua @@ -109,19 +109,41 @@ package = { -- libXi, libXcursor, libXrandr, libxkbcommon, ...) are -- also dlopen'd but only after a real display server is -- required; `godot --headless` works without them. - -- Shipping a full X11/mesa/wayland stack via xim is - -- infeasible (libGL drags in mesa+GPU drivers, and hardware - -- acceleration must go through the host driver anyway), so - -- config() below probes standard distro lib dirs at install - -- time and appends whichever one holds libX11.so.6 onto - -- godot's RPATH. This makes the editor start on any host - -- that has the GUI stack installed; a hermetic container - -- without X11/wayland can only run --headless. + -- + -- WHAT THIS COMMENT USED TO SAY, AND WHY IT WAS WRONG + -- + -- "Shipping a full X11/mesa/wayland stack via xim is infeasible + -- (libGL drags in mesa+GPU drivers, and hardware acceleration must + -- go through the host driver anyway)." Both halves have been + -- falsified since: + -- + -- * The stack exists -- twenty-two packages, mesa 25.0.7 with + -- radeonsi/nouveau/zink/llvmpipe -- and it renders in a bwrap + -- container with no /usr and no /lib at all. + -- * Hardware acceleration does NOT have to go through a host + -- libGL. The only half that must come from the host is the + -- VENDOR (NVIDIA's `libGLX_nvidia`, WSL2's `libd3d12core`), + -- which `graphics` brings in through a sentinel. The dispatch + -- layer, the drivers and the X11 client libraries are ours. + -- + -- Borrowing the host's Mesa is not merely unnecessary, it is the + -- failure mode: the host's Mesa is built against the host's glibc + -- and tracks it forever, so a bundled runtime eventually cannot + -- load it. That is mcpp#352 (`GLIBC_2.43 not found`). + -- + -- So: depend on `graphics`. The host-directory probe stays as a + -- FALLBACK for a home that does not have the stack -- removing it + -- would break every existing install of this package -- and + -- config() prefers the stack when it is present. deps = { runtime = { "xim:glibc@>=2.39", "xim:freetype@2.13.2", "xim:expat@2.6.2", + -- The GL/X11/wayland stack, and the driver bridge for + -- whatever GPU this host has. A lower bound, so this does + -- not pin the stack's version. + "xim:graphics@>=0.1", }, -- config() invokes `patchelf --force-rpath` to flip the -- tag elfpatch stamps in (DT_RUNPATH -> DT_RPATH) so @@ -173,9 +195,12 @@ package = { }, } +import("xim.libxpkg.log") import("xim.libxpkg.pkginfo") import("xim.libxpkg.xvm") import("xim.libxpkg.system") +import("xim.pkgindex.hostlib") +import("xim.pkgindex.graphics") -- Every asset is a .zip that expands into the hook cwd (the download -- dir) with no wrapper directory: @@ -249,24 +274,33 @@ function install() return os.isfile(exe) end --- Standard multi-arch / lib64 / usr-lib layouts across mainstream --- distros. Probing for libX11.so.6 -- the smallest indispensable GUI --- lib -- is enough to pin the right dir; whichever dir ships libX11 --- also ships libwayland-client / libXi / libGL and friends. -local _HOST_GUI_CANDIDATES = { - "/lib/x86_64-linux-gnu", -- Debian / Ubuntu multi-arch - "/usr/lib/x86_64-linux-gnu", -- Debian / Ubuntu (some layouts) - "/lib64", -- Fedora / RHEL / CentOS - "/usr/lib64", -- SUSE, some others - "/usr/lib", -- Arch, void, generic -} - +-- Where the host keeps its GUI stack. +-- +-- Probing for libX11.so.6 -- the smallest indispensable GUI lib -- is enough to +-- pin the right dirs; whichever dir ships libX11 also ships +-- libwayland-client / libXi / libGL and friends. +-- +-- The candidate list that used to be here is gone, and the reason is not +-- tidiness. It had no ELF-class check, so on a biarch host (Fedora/RHEL/SUSE, +-- where /usr/lib is the 32-BIT directory) a 32-bit libX11 would put a 32-bit +-- directory on a 64-bit binary's RPATH. This recipe happened to survive that +-- because /usr/lib64 was listed earlier and RPATH search order made the +-- 64-bit hit come first -- correct by accident, with nothing asserting it. +-- The same assumption in mcpp's compat.glx-runtime, where the loop overwrote +-- instead of ordering, is mcpp#352. +-- +-- hostlib answers it the way the loader does: `ldconfig -p` first, ELF class +-- checked, first-wins. All 64-bit dirs are returned because RPATH is a list and +-- godot dlopens several libraries -- but every entry is now known to be 64-bit +-- rather than merely early. local function _host_gui_libdirs() - local dirs = {} - for _, d in ipairs(_HOST_GUI_CANDIDATES) do - if os.isfile(path.join(d, "libX11.so.6")) then - table.insert(dirs, d) - end + local dirs = hostlib.dirs_of("libX11.so.6") + if #dirs == 0 then + -- Said out loud, because the alternative is a godot that installs + -- cleanly and dies at startup on libX11. A headless host is a legitimate + -- state for the INSTALL, so this is not fatal. + log.warn("no 64-bit libX11.so.6 on this host -- godot will not start " + .. "until a GUI stack is present (or `xlings install graphics`)") end return dirs end @@ -285,16 +319,34 @@ function config() -- DT_RUNPATH to DT_RPATH. `patchelf` is provided by the -- `xim:patchelf@0.18.0` build dep declared above. -- - -- The X11/wayland/GL stack lives on the host (see rationale in the - -- xpm.linux comment). xim's ld.so.cache is hermetic and does NOT - -- see /lib/x86_64-linux-gnu et al., so we probe standard distro - -- lib dirs at install time and append whichever ones exist onto - -- the RPATH. This is a one-shot install-time snapshot -- if the - -- host layout changes later, `xlings remove godot && install godot` - -- refreshes the probe. + -- Where the GL/X11 stack comes from, in preference order. + -- + -- 1. OURS. `graphics` is a runtime dep, so elfpatch has already stamped + -- mesa/libglvnd/libX11's payload libdirs onto godot's RUNPATH from their + -- exports -- nothing to probe. The FALLBACK below is then not merely + -- unnecessary, it is harmful: putting a host lib dir on the RPATH of a + -- binary that runs on OUR loader is how the host's Mesa gets back in, + -- and the host's Mesa is built against the host's glibc (mcpp#352). + -- + -- 2. THE HOST, for a home that does not have the stack. xim's ld.so.cache + -- is hermetic and does NOT see /lib/x86_64-linux-gnu et al., so the host + -- directories are probed and appended. Kept because removing it would + -- break every existing install of this package; a one-shot install-time + -- snapshot, refreshed by `xlings remove godot && install godot`. + -- + -- Which one applies is decided by asking whether mesa's payload is in this + -- home -- the dependency resolver's own answer, not a second probe. if os.host() == "linux" then local exe = _installed_exe() - local host_dirs = _host_gui_libdirs() + local mesa_dir = pkginfo.dep_install_dir + and pkginfo.dep_install_dir("mesa") or nil + local have_stack = mesa_dir and mesa_dir ~= "" + and os.isdir(path.join(mesa_dir, "lib")) + local host_dirs = have_stack and {} or _host_gui_libdirs() + if have_stack then + log.info("godot: GL comes from the xlings graphics stack; " + .. "not adding host library directories") + end -- The `add` helper in the shell snippet dedupes: on a repeat -- install the host dirs from the previous run are still in @@ -334,7 +386,35 @@ function config() exe, table.concat(add_lines) )) end - xvm.add("godot", { bindir = pkginfo.install_dir() }) + -- The discovery layer, carried by godot's OWN shim. + -- + -- RPATH gets godot's libraries loaded; it cannot tell mesa which driver + -- module to load or glvnd which vendors exist. Those are environment + -- variables read by the user's process, and until now they existed only + -- inside a `subos use` sub-shell -- so `xlings install godot && godot` in an + -- ordinary terminal had the stack on RPATH and no way to find a driver. + -- + -- Program scope, not shell scope: only godot and its children see these. + -- The same choice Nix makes with `makeWrapper` and Snap with its + -- `command-chain` wrapper, and the opposite of what nixGL does with + -- LD_LIBRARY_PATH -- which the Nix ecosystem documents as breaking every + -- other program the wrapped one launches. + -- + -- Values are `${XLINGS_DYNAMIC_SUBOS_DIR}`-relative, so the shim resolves + -- them against the ACTIVE subos at dispatch rather than the one that + -- happened to be active at install. + -- + -- Only when the stack is actually here: pointing LIBGL_DRIVERS_PATH at a + -- subos directory that no package fills would make mesa fall back to + -- software rendering with no diagnostic, which is worse than leaving the + -- variable unset. + local node = { bindir = pkginfo.install_dir() } + local mesa_dir = pkginfo.dep_install_dir + and pkginfo.dep_install_dir("mesa") or nil + if mesa_dir and mesa_dir ~= "" and os.isdir(path.join(mesa_dir, "lib")) then + node.envs = graphics.consumer_envs() + end + xvm.add("godot", node) return true end diff --git a/pkgs/g/graphics.lua b/pkgs/g/graphics.lua new file mode 100644 index 00000000..fcf0cec3 --- /dev/null +++ b/pkgs/g/graphics.lua @@ -0,0 +1,137 @@ +package = { + spec = "2", + + homepage = "https://github.com/openxlings/xim-pkgindex", + name = "graphics", + description = "The xlings graphics stack: OpenGL that adapts to whatever GPU this host has", + + authors = {"xlings contributors"}, + licenses = {"Apache-2.0"}, + repo = "https://github.com/openxlings/xim-pkgindex", + + type = "package", + archs = {"x86_64"}, + status = "stable", + categories = {"graphics", "opengl", "meta"}, + keywords = {"graphics", "opengl", "gl", "egl", "mesa", "nvidia", "wsl", "meta"}, + + -- ───────────────────────────────────────────────────────────────────── + -- One command, five host shapes, no conditional syntax anywhere. + -- + -- xlings install graphics + -- + -- | host | what renders | via | + -- |----------------------------|-----------------------|----------------------| + -- | NVIDIA proprietary driver | the GPU | nvidia-gl-host-link | + -- | AMD | the GPU (radeonsi) | mesa | + -- | Intel | the GPU (iris) | mesa | + -- | WSL2 | the GPU (d3d12) | wsl-gl-host-link | + -- | no GPU / container | the CPU (llvmpipe) | mesa | + -- + -- HOW, WITHOUT AN `if` + -- + -- The two host-facing packages are SENTINELS: each probes for a userspace + -- half it does not own, links it if present, and succeeds having linked + -- nothing if not. "This machine does not have that" is a normal return + -- value, not a branch -- so depending on both is correct on every host, and + -- the dependency graph adapts by itself. + -- + -- That is the same effect conda gets from `__cuda` / `__glibc` virtual + -- packages -- the solver trimming a graph by host capability -- reached + -- without a solver feature, because a sentinel can answer at install time + -- what a solver would have to be told. + -- + -- WHAT IT IS NOT + -- + -- Not a version-pinning umbrella. Every dependency is a lower bound, so + -- installing this does not freeze the stack; and it carries no payload, so + -- removing it leaves the stack in place. It exists so a user does not have + -- to know that "GL" means twenty-two packages plus a driver bridge whose + -- name depends on their hardware. + -- + -- Design: xlings/.agents/docs/2026-08-07-graphics-experience-industry-survey-and-plan.md §A3 + xpm = { + linux = { + -- The split form. A `deps` table with an array part makes every + -- client before libxpkg 0.0.52 drop the `build` sub-table and copy + -- the runtime entries into build_deps instead, silently. + deps = { + runtime = { + -- The stack itself. mesa's own deps pull in the twenty-one + -- packages below it (libglvnd, libllvm, the X11 client + -- libraries, wayland, libdrm, …) -- listing them here would + -- be a second, drifting copy of that graph. + "xim:mesa@>=25.0.7", + -- Sentinel: the host's proprietary NVIDIA GL userspace. + -- A no-op on a machine without that driver. + "xim:nvidia-gl-host-link@>=0.1", + -- Sentinel: WSL2's Windows-side D3D12 userspace. + -- A no-op anywhere that is not WSL2. + "xim:wsl-gl-host-link@>=0.1", + }, + }, + ["latest"] = { ref = "0.1.0" }, + -- No payload. This package is its dependency list and the report + -- below; there is nothing to download. + ["0.1.0"] = { }, + }, + }, +} + +import("xim.libxpkg.log") +import("xim.libxpkg.pkginfo") +import("xim.libxpkg.xvm") + +function install() + local dir = pkginfo.install_dir() + os.tryrm(dir) + os.mkdir(dir) + return true +end + +function config() + xvm.add(package.name) + + -- Say which path this host actually took. + -- + -- This is the whole reason a meta-package has a hook at all. Every + -- component reports its own result, but they scroll past in a + -- twenty-two-package install, and the one thing a user needs to know is + -- whether they got the GPU or the CPU -- which is precisely the pair this + -- ecosystem keeps rendering indistinguishable. A GL program on llvmpipe + -- draws the same pixels as one on an RTX 4080. + -- + -- Read from the sentinels' own state files rather than re-probed here: a + -- second probe is a second answer, and the point of a sentinel is to be the + -- only one. Absent state means an older payload, and "unknown" is the honest + -- word for that. + local function __sentinel_state(name, marker) + local d = pkginfo.dep_install_dir and pkginfo.dep_install_dir(name) + if not d or d == "" then return nil end + local f = path.join(d, marker) + if not os.isfile(f) then return nil end + return (io.readfile(f) or ""):gsub("%s+$", "") + end + + local nv = __sentinel_state("nvidia-gl-host-link", ".host-driver-version") + local wsl = __sentinel_state("wsl-gl-host-link", ".wsl-host") + + log.info("graphics stack installed. On this host:") + if nv and nv ~= "" then + log.info(" NVIDIA proprietary driver %s — GL renders on the GPU", nv) + elseif wsl and wsl:find("^yes") then + log.info(" WSL2 D3D12 — GL renders on the Windows GPU") + else + log.info(" no borrowed driver userspace — GL renders through mesa") + log.info(" (radeonsi/iris/nouveau if a supported GPU is present, else") + log.info(" llvmpipe on the CPU). `xlings-gl-doctor` reports which.") + end + log.info(" a GL program installed through xlings needs no environment") + log.info(" variables; run it through its xlings shim.") + return true +end + +function uninstall() + xvm.remove(package.name) + return true +end diff --git a/pkgs/l/libcuda-host-link.lua b/pkgs/l/libcuda-host-link.lua index 316d54b5..a101e39f 100644 --- a/pkgs/l/libcuda-host-link.lua +++ b/pkgs/l/libcuda-host-link.lua @@ -60,65 +60,36 @@ import("xim.libxpkg.pkginfo") import("xim.libxpkg.xvm") import("xim.libxpkg.log") import("xim.libxpkg.system") +import("xim.pkgindex.hostlib") -- Probe the host for libcuda.so.1. --- Strategy: --- 1) ldconfig -p | grep libcuda.so.1 → covers properly registered drivers --- across distros (Debian/Ubuntu, Fedora/RHEL, Arch, openSUSE). --- 2) If ldconfig misses (containers without /etc/ld.so.cache populated, --- or NixOS-style non-FHS), check the canonical FHS paths directly. --- 3) Return nil if none found → caller decides what to do. +-- +-- The probe lives in `hostlib` now. It was written here first -- this package +-- is the original sentinel -- and it was then copied into +-- `nvidia-gl-host-link`, adapted (wrongly) into mcpp's `compat.glx-runtime`, +-- and adapted again into `godot`. Four answers to one question, which is the +-- shape hostlib exists to collapse. +-- +-- What is NEW relative to what was here: the fallback paths are ELF-class +-- checked. `/usr/lib` is the 32-BIT directory on Fedora/RHEL/SUSE, and the +-- list below reached it third -- so on a biarch host with a 32-bit CUDA stub +-- installed, this returned a 32-bit libcuda and the failure appeared at +-- dlopen as `wrong ELF class: ELFCLASS32`, three layers from here. That is +-- mcpp#352, in the package the whole pattern came from. local function __probe_host_libcuda() - -- Strategy 1: ldconfig cache (works on properly-registered drivers). - -- Use try{} to swallow non-zero exits (ldconfig itself, or grep with - -- no match). On x86_64-linux-gnu hosts the line shape is: - -- "\tlibcuda.so.1 (libc6,x86-64) => /lib/x86_64-linux-gnu/libcuda.so.1" - -- (filter for "x86-64" to skip the 32-bit i386 line.) - local out = try { - function() return os.iorun("ldconfig -p 2>/dev/null") end - } - if out and out ~= "" then - for line in out:gmatch("[^\n]+") do - if line:find("libcuda.so.1", 1, true) - and line:find("x86-64", 1, true) then - local p = line:match("=>%s*(/%S+)") - if p and os.isfile(p) then return p end - end - end - end - -- Strategy 2: well-known FHS paths (containers without populated - -- ld.so.cache, or NixOS-style non-FHS hosts where ldconfig is empty). - for _, p in ipairs({ - "/usr/lib/x86_64-linux-gnu/libcuda.so.1", -- Debian / Ubuntu / Mint - "/usr/lib64/libcuda.so.1", -- RHEL / Fedora / openSUSE / Arch - "/usr/lib/libcuda.so.1", -- Arch (older) / minimal distros - }) do - if os.isfile(p) then return p end - end - return nil + return hostlib.path_of("libcuda.so.1") end -- Choose the symlink target for the "no driver yet" case. -- The link target is a path the user's distro WILL provide once the -- nvidia-driver package is installed, so the symlink self-heals later -- without re-running this package's install hook. +-- +-- This is the one question that cannot be probed -- there is no file yet, so +-- there is no ELF class to read -- and the distro-ID table that answers it now +-- lives in hostlib.canonical_libdir(), so layout knowledge stays in one file. local function __canonical_path_for_distro() - if os.isfile("/etc/os-release") then - local content = io.readfile("/etc/os-release") or "" - local idl = ((content:match("ID=([^\n]*)") or "") .. " " .. - (content:match("ID_LIKE=([^\n]*)") or "")):lower() - idl = idl:gsub('"', '') - if idl:find("debian") or idl:find("ubuntu") or idl:find("mint") then - return "/usr/lib/x86_64-linux-gnu/libcuda.so.1" - elseif idl:find("fedora") or idl:find("rhel") or idl:find("centos") - or idl:find("opensuse") or idl:find("suse") then - return "/usr/lib64/libcuda.so.1" - elseif idl:find("arch") or idl:find("manjaro") then - return "/usr/lib/libcuda.so.1" - end - end - -- Default to Debian/Ubuntu layout (most common xim Linux user) - return "/usr/lib/x86_64-linux-gnu/libcuda.so.1" + return path.join(hostlib.canonical_libdir(), "libcuda.so.1") end function install() diff --git a/pkgs/m/mesa.lua b/pkgs/m/mesa.lua index f4f9801b..551bde03 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.graphics") function install() local dir = pkginfo.install_dir() @@ -189,34 +190,37 @@ function config() path.join(system.subos_sysrootdir(), "usr", "include")) end - -- The configuration layer. Neither PATH nor RPATH can carry these: the - -- process that has to see them is the user's own binary, which xlings - -- never wraps, so a per-shim environment cannot reach it. + -- The discovery layer, assembled into the SUBOS rather than announced from + -- the payload. -- - -- type(), not truthiness: import() answers an unknown module with a - -- permissive proxy whose every key is truthy, so `if subos.env then` is - -- true on clients that would accept the call and discard it. - if type(subos.env) == "function" then - -- prepend, not set, for both of these: they are colon-separated - -- LISTS, and mesa is not the only thing entitled to be on them. - -- `nvidia-gl-host-link` contributes an EGL vendor directory for the - -- host's proprietary driver, and glvnd is built to see several - -- vendors at once and pick per display -- that is what - -- vendor-neutral dispatch is. - -- - -- A `set` here does not merely lose that, it silently discards it: - -- xlings resolves a variable declared `set` by one provider and - -- `prepend` by another in favour of the `set`, so mesa would erase - -- NVIDIA's entry and the machine with the GPU would quietly render - -- through llvmpipe. Both operations still preserve a value the user - -- exported themselves, so nothing is given up by using prepend. - subos.env{ var = "LIBGL_DRIVERS_PATH", op = "prepend", - value = "${pkgdir}/lib/dri", binding = tag } - subos.env{ var = "__EGL_VENDOR_LIBRARY_DIRS", op = "prepend", - value = "${pkgdir}/share/glvnd/egl_vendor.d", binding = tag } - subos.env{ var = "XDG_DATA_DIRS", op = "prepend", - value = "${pkgdir}/share", binding = tag } - end + -- What changed and why. These three variables used to name `${pkgdir}` + -- directly -- this payload -- and were declared only through `subos.env`. + -- Both halves were wrong: + -- + -- * `${pkgdir}` pins a version directory, so upgrading mesa leaves any + -- recorded consumer environment naming the old one. + -- * `subos.env` alone is applied by `subos use` and nothing else, so + -- `xlings install godot && godot` in an ordinary shell got a subos on + -- PATH and none of these paths. That is the gap that made the whole + -- 22-package stack unreachable from the terminal a user actually has. + -- + -- So: place the driver modules and the vendor JSON into the subos view, + -- and declare the SUBOS paths. The view is the stable indirection -- the + -- same role /run/opengl-driver plays on NixOS -- and it is what lets a + -- consumer's shim carry the same values (graphics.consumer_envs) without + -- knowing anything about mesa's payload. + -- + -- The vendor JSON goes into the ONE shared directory, so cross-vendor + -- priority is decided by filename (`10_nvidia` < `50_mesa`) as it is on the + -- host, rather than by which package's binding string sorts later. See + -- libs/graphics.lua for the libglvnd scanning rules that make that the + -- only correct arrangement. + graphics.declare_dri(dir, "lib/dri", tag) + graphics.declare_egl_vendor(dir, "share/glvnd/egl_vendor.d/50_mesa.json", 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) return true end diff --git a/pkgs/n/nvidia-gl-host-link.lua b/pkgs/n/nvidia-gl-host-link.lua index 1bbaaa96..2ebcbca2 100644 --- a/pkgs/n/nvidia-gl-host-link.lua +++ b/pkgs/n/nvidia-gl-host-link.lua @@ -115,36 +115,28 @@ import("xim.libxpkg.xvm") import("xim.libxpkg.subos") import("xim.libxpkg.elfpatch") import("xim.pkgindex.sysroot") +import("xim.pkgindex.hostlib") +import("xim.pkgindex.graphics") -- Where the host keeps its NVIDIA userspace. -- -- Located by finding libGLX_nvidia.so.0 rather than by guessing a distro -- layout: the two vendor entry points and their private dependencies are -- always installed together in one directory, so one hit fixes the rest. +-- +-- The probe itself now lives in `hostlib` -- it was written here first, and +-- three other places in this ecosystem asked the same question and answered it +-- differently, two of them wrongly (mcpp#352 is one). One of the three rules it +-- carries is new even here: hostlib ELF-class checks the FALLBACK paths too, +-- so Fedora's 32-bit /usr/lib is refused rather than merely searched last. local function __probe_nvidia_dir() - -- ldconfig first — it is the answer on any distro whose driver package - -- registered itself, which is all of them when installed normally. - local out = try { - function() return os.iorun("ldconfig -p 2>/dev/null") end - } - if out and out ~= "" then - for line in out:gmatch("[^\n]+") do - if line:find("libGLX_nvidia.so.0", 1, true) - and line:find("x86-64", 1, true) then - local p = line:match("=>%s*(/%S+)") - if p and os.isfile(p) then return path.directory(p) end - end - end - end - -- Containers with no populated ld.so.cache, and non-FHS hosts. - for _, d in ipairs({ - "/usr/lib/x86_64-linux-gnu", - "/usr/lib64", - "/usr/lib", - }) do - if os.isfile(path.join(d, "libGLX_nvidia.so.0")) then return d end - end - return nil + return hostlib.dir_of("libGLX_nvidia.so.0") +end + +-- Single-quote for /bin/sh. The generated script embeds two values that come +-- from the filesystem and from /sys, so neither is a literal in this file. +local function __sh_quote(s) + return "'" .. tostring(s or ""):gsub("'", [[''"'"'']]) .. "'" end -- Every NVIDIA userspace file in DIR, by name. @@ -152,22 +144,90 @@ end -- Enumerated rather than listed: the private libraries are named after the -- driver version, so a fixed list would be a list of one driver release. The -- prefixes are the stable part. +-- +-- hostlib drops any 32-bit entry, which matters on a biarch host: Fedora +-- installs `libnvidia-glcore.so.` for both ABIs into two directories, and +-- a driver upgrade that leaves a stale 32-bit sibling in the 64-bit directory +-- would otherwise be linked into this payload and fail at load with +-- `wrong ELF class`. local function __nvidia_entries(dir) - local names = {} - local f = io.popen(string.format([[ls -1 "%s" 2>/dev/null]], dir)) - if not f then return names end - for line in f:lines() do - local name = line:gsub("[\r\n]+$", "") - if name ~= "" and (name:find("^libnvidia%-") - or name:find("^libGLX_nvidia%.") - or name:find("^libEGL_nvidia%.") - or name:find("^libGLESv1_CM_nvidia%.") - or name:find("^libGLESv2_nvidia%.")) then - table.insert(names, name) - end - end - f:close() - return names + return hostlib.entries_with_prefix(dir, { + "^libnvidia%-", + "^libGLX_nvidia%.", + "^libEGL_nvidia%.", + "^libGLESv1_CM_nvidia%.", + "^libGLESv2_nvidia%.", + }) +end + +-- The self-check, written as a shell script into the payload. +-- +-- WHY A PROGRAM AND NOT A DOCTOR RULE +-- +-- `xlings self doctor` is the obvious home for this and it is the wrong one: +-- the rule is specific to one package's relationship with one vendor's driver, +-- it changes when that relationship does, and this repo already has three +-- report/repair pairs that drifted because the check and the fix live in +-- different files. A program that ships WITH the package cannot drift from it. +-- +-- Shell rather than a compiled probe: there is no compiler at install time, and +-- what it does is compare a file to a file. +local function __write_gl_doctor(dir, kver, done, present) + local script = path.join(dir, "bin", "xlings-gl-doctor") + os.mkdir(path.directory(script)) + io.writefile(script, string.format([[#!/usr/bin/env sh +# nvidia-gl-host-link self-check. Generated at install time; do not edit. +# +# Exit 0 when the payload still matches the host it was built against, 1 when it +# does not. "Does not" is not a crash -- GL usually keeps working by resolving +# the vendor's siblings from the host's ld.so cache -- which is exactly why it +# needs saying out loud. +PAYLOAD=%s +STAMP="$PAYLOAD/.host-driver-version" +INSTALLED=%s +INTERPOSED=%d +ENTRYPOINTS=%d +rc=0 + +live="" +[ -r /sys/module/nvidia/version ] && live=$(cat /sys/module/nvidia/version) +stamped="" +[ -r "$STAMP" ] && stamped=$(cat "$STAMP") + +echo "nvidia-gl-host-link" +echo " payload $PAYLOAD" +echo " built for driver ${stamped:-unknown}" +echo " host driver now ${live:-none loaded}" +echo " interposers $INTERPOSED/$ENTRYPOINTS entry points" + +if [ -z "$live" ]; then + echo " ! no NVIDIA kernel module loaded -- GL renders through mesa." + echo " That is a normal state; nothing to repair." +elif [ "$live" != "$stamped" ]; then + echo " x host driver changed since install ($stamped -> $live)." + echo " The payload's version-named symlinks now dangle. Repair:" + echo " xlings install graphics # re-probes and relinks" + rc=1 +fi + +# Dangling links are the visible symptom of the above, and they are worth +# counting separately: a partial driver upgrade leaves some resolvable. +dangling=0 +for f in "$PAYLOAD"/lib/*; do + [ -e "$f" ] || { dangling=$((dangling+1)); echo " x dangling $(basename "$f")"; } +done +[ "$dangling" -gt 0 ] && rc=1 + +if [ "$INTERPOSED" -lt "$ENTRYPOINTS" ]; then + echo " x $((ENTRYPOINTS-INTERPOSED)) entry point(s) were not interposed --" + echo " those resolve their dependencies from the HOST." + rc=1 +fi + +[ "$rc" -eq 0 ] && echo " ok" +exit $rc +]], __sh_quote(dir), __sh_quote(kver), done, present)) + system.exec(string.format([[chmod +x "%s"]], script)) end function install() @@ -326,6 +386,29 @@ function install() } ]], path.join(dir, "lib", "libEGL_nvidia.so.0"))) + -- The driver version this payload was built against, recorded. + -- + -- Everything above adapts to the host AT INSTALL TIME and is then never + -- re-checked. When the host driver is upgraded, every `*.550.144.03` + -- symlink in this payload dangles and the `4/4` printed below was computed + -- for a driver that is gone -- and nothing says so, because a dangling + -- entry on a search path is skipped in silence and the vendor's siblings + -- are then resolved from the host's ld.so cache instead. It usually still + -- renders; in a sandbox or an empty-host container it does not. + -- + -- A distribution does not need this: the kernel module and its userspace + -- are one package version there, and DKMS rebuilds on kernel upgrade, so + -- the pair is an INSTALL-TIME INVARIANT. We do not own the kernel module, + -- so the same invariant can only be a RUN-TIME CHECK -- which is what the + -- stamp plus `xlings-gl-doctor` are. Flatpak reads the same file for the + -- same reason (`enable-if: active-gl-driver`). + local kver = "" + if os.isfile("/sys/module/nvidia/version") then + kver = (io.readfile("/sys/module/nvidia/version") or ""):gsub("%s+$", "") + end + io.writefile(path.join(dir, ".host-driver-version"), kver .. "\n") + __write_gl_doctor(dir, kver, #done, #present) + -- Both numbers, and the interposers as a FRACTION of the entry points the -- host actually has. Reporting only the symlink count would make "the -- vendor's dependencies resolve to our payloads" and "they resolve to the @@ -333,8 +416,12 @@ function install() -- just on llvmpipe. A bare "yes" would do the same thing one level in: -- one interposer out of four reads as success, and the three uncovered -- roots are exactly the APIs nobody probed. - log.info("nvidia-gl-host-link → %s (%d host libraries linked, interposers: %d/%d%s) ✓", - nvdir, linked, #done, #present, + -- + -- With the driver version, because the fraction is only true for the driver + -- it was measured against. + log.info("nvidia-gl-host-link → %s (driver %s, %d host libraries linked, " + .. "interposers: %d/%d%s) ✓", + nvdir, kver ~= "" and kver or "unknown", linked, #done, #present, #present > 0 and "" or " — no vendor, GL falls back to mesa") return true end @@ -353,33 +440,57 @@ function config() -- and the subos lib directory is where it lives. sysroot.declare_libs(dir, "lib", tag, pkginfo.version()) - if type(subos.env) == "function" then - -- prepend, where mesa's declaration for the same variable is `set`. - -- Both vendors have to be visible at once: glvnd picks per display, - -- so a machine with an NVIDIA GPU and a software fallback needs both - -- directories on the list. A second `set` would collide with mesa's - -- and one of the two would lose. - subos.env{ var = "__EGL_VENDOR_LIBRARY_DIRS", op = "prepend", - value = "${pkgdir}/share/glvnd/egl_vendor.d", - binding = tag } - - -- No LD_LIBRARY_PATH. It used to be here, and it was the one place - -- in this stack that needed a library SEARCH PATH rather than an - -- RPATH -- because the vendor is the host's file and a file we do not - -- own is a file we cannot patch. - -- - -- The interposer is a file we DO own, sitting between the loader and - -- the vendor, so the RPATH goes there and the search path is not - -- needed at all. What went away with it is the part that had no - -- scope: LD_LIBRARY_PATH is inherited by every child of the subos - -- shell, and most of them are host binaries on the host loader. - -- - -- The host driver directory is NOT declared here either. The vendor - -- dlopens its own siblings (libnvidia-glcore, libnvidia-eglcore, …) - -- by bare SONAME at runtime, and those must come from the host to - -- match its kernel module -- but the host loader finds them through - -- its own ld.so cache, without help from us. + -- The self-check, on PATH inside the subos. + -- + -- Registered only when it exists: install() writes it unconditionally, but + -- a payload from an older release will not have it and `xvm.add` on a + -- missing file registers a program that fails to dispatch. + if os.isfile(path.join(dir, "bin", "xlings-gl-doctor")) then + xvm.add("xlings-gl-doctor", { + bindir = path.join(dir, "bin"), + filename = "xlings-gl-doctor", + binding = tag, + }) end + + -- The vendor JSON into the ONE shared directory in the subos, not this + -- payload's own. + -- + -- What this fixes. libglvnd scans `__EGL_VENDOR_LIBRARY_DIRS` in list order + -- and sorts files WITHIN a directory by name -- so with two directories the + -- `10_nvidia` < `50_mesa` convention meant nothing, and NVIDIA-before-mesa + -- held only because xlings sorts providers by binding string and + -- `mesa@...` < `nvidia-gl-host-link@...`. Correct by alphabet. One shared + -- directory puts the decision back on the filename, which is what the + -- number in `10_nvidia.json` is for and how the host does it. + graphics.declare_egl_vendor(dir, + "share/glvnd/egl_vendor.d/10_nvidia.json", tag) + + -- Vendor directory only. This package has no driver modules and no + -- `share/` tree, so declaring LIBGL_DRIVERS_PATH or XDG_DATA_DIRS from + -- here would name paths it does not fill. mesa declares those. + -- + -- prepend, and both packages declaring the same value is intended: + -- `prepend` de-duplicates, and either package being absent must not remove + -- the directory for the other. + graphics.declare_subos_env(tag, graphics.EGL_VENDOR_ONLY) + + -- No LD_LIBRARY_PATH. It used to be here, and it was the one place + -- in this stack that needed a library SEARCH PATH rather than an + -- RPATH -- because the vendor is the host's file and a file we do not + -- own is a file we cannot patch. + -- + -- The interposer is a file we DO own, sitting between the loader and + -- the vendor, so the RPATH goes there and the search path is not + -- needed at all. What went away with it is the part that had no + -- scope: LD_LIBRARY_PATH is inherited by every child of the subos + -- shell, and most of them are host binaries on the host loader. + -- + -- The host driver directory is NOT declared here either. The vendor + -- dlopens its own siblings (libnvidia-glcore, libnvidia-eglcore, …) + -- by bare SONAME at runtime, and those must come from the host to + -- match its kernel module -- but the host loader finds them through + -- its own ld.so cache, without help from us. return true end diff --git a/pkgs/w/wsl-gl-host-link.lua b/pkgs/w/wsl-gl-host-link.lua new file mode 100644 index 00000000..3a7f7d0a --- /dev/null +++ b/pkgs/w/wsl-gl-host-link.lua @@ -0,0 +1,251 @@ +package = { + spec = "2", + + homepage = "https://github.com/microsoft/wslg", + name = "wsl-gl-host-link", + description = "Sentinel: links WSL2's host D3D12/DXCore userspace so mesa's d3d12 driver can reach the Windows GPU", + + authors = {"xlings contributors"}, + -- The recipe. The libraries it links to are Microsoft's, shipped as part of + -- Windows and mounted into the distribution by WSL; this package neither + -- copies nor redistributes them. + licenses = {"Apache-2.0"}, + repo = "https://github.com/openxlings/xim-pkgindex", + + type = "package", + archs = {"x86_64"}, + status = "stable", + categories = {"graphics", "gpu", "wsl", "lib"}, + keywords = {"wsl", "wsl2", "d3d12", "dxcore", "opengl", "host-link", "sentinel"}, + + -- ───────────────────────────────────────────────────────────────────── + -- The second userspace dependency the graphics stack keeps on the host, + -- and the reason is the same as NVIDIA's: it is the half of a driver whose + -- other half we do not own. + -- + -- In WSL2 there is no native DRM driver for the GPU. The GPU is reached + -- through `/dev/dxg`, a character device provided by the `dxgkrnl` module, + -- and the userspace half is `libd3d12core.so` / `libdxcore.so` -- + -- closed-source binaries that ship as part of WINDOWS and are mounted by + -- WSL at /usr/lib/wsl/lib. Mesa reaches them through its `d3d12` gallium + -- driver. + -- + -- WITHOUT THIS PACKAGE + -- A GL program in a subos on WSL2 renders on llvmpipe, silently. That is + -- the same shape as an Intel machine with no `iris`: it works, on the CPU, + -- and nothing says the GPU was available. + -- + -- WHY THIS IS SIMPLER THAN `nvidia-gl-host-link` + -- The borrowed library is a LEAF, not the root of a load chain. + -- glvnd dlopens a vendor library BY NAME, so `libGLX_nvidia.so.0` is its + -- own load-chain root with no RPATH of ours anywhere above it -- hence the + -- interposer. `libd3d12core.so` is dlopened by `d3d12_dri.so`, which is + -- OUR file with OUR DT_RPATH, and DT_RPATH is searched along the load + -- chain. So a symlink in the subos lib directory is enough: no interposer, + -- no LD_LIBRARY_PATH. + -- + -- WHY THE LINKS MUST BE OURS AND NOT THE HOST'S ld.so.cache + -- WSL makes /usr/lib/wsl/lib visible to the HOST loader through + -- /etc/ld.so.conf.d. Our processes run on our own glibc with its own + -- hermetic ld.so.cache, which does not contain that path -- the same fact + -- godot's recipe records ("xim's ld.so.cache is hermetic and does NOT see + -- /lib/x86_64-linux-gnu"). + -- + -- WHEN THE HOST IS NOT WSL2 + -- install() succeeds and links nothing, config() declares nothing. That + -- is the sentinel contract, and it is load-bearing here: this package is a + -- dependency of `graphics`, so it is installed on EVERY machine that + -- installs the stack. A sentinel with a side effect on a host it does not + -- apply to would be a regression for everyone. + -- + -- Design: xlings/.agents/docs/2026-08-07-graphics-experience-industry-survey-and-plan.md §A9 + xpm = { + linux = { + -- The split form, spelled out. A `deps` table with an array part + -- makes every client before libxpkg 0.0.52 take the legacy branch: + -- `build` is dropped and the runtime entries are copied into + -- build_deps in its place, with nothing reporting it. + deps = { + runtime = { + -- mesa is what loads the borrowed libraries: the `d3d12` + -- gallium driver module lives in its payload. Without mesa + -- there is no consumer for anything this package links. + "xim:mesa@>=25.0.7", + "xim:glibc@>=2.39", + }, + }, + exports = { + runtime = { libdirs = { "lib" } }, + }, + ["latest"] = { ref = "0.1.0" }, + -- No payload: every file this package installs is a symlink it + -- creates from what it finds on the host. The version is the + -- recipe's -- the Windows-side version is whatever Windows has, and + -- pinning it here would make the package wrong on every machine but + -- one. + ["0.1.0"] = { }, + }, + }, +} + +import("xim.libxpkg.log") +import("xim.libxpkg.pkginfo") +import("xim.libxpkg.system") +import("xim.libxpkg.xvm") +import("xim.libxpkg.subos") +import("xim.pkgindex.sysroot") +import("xim.pkgindex.hostlib") + +-- Where WSL mounts the Windows-side GPU userspace. +-- +-- A fixed path, and legitimately so: it is not a distribution layout, it is +-- WSL's own mount point, identical on every distribution WSL supports. It is +-- still ELF-class checked via hostlib rather than trusted. +local WSL_LIBDIR = "/usr/lib/wsl/lib" + +-- Is this WSL2, and does it have the D3D12 userspace? +-- +-- Two questions, deliberately answered as one: a WSL2 kernel with no GPU +-- passthrough (an old Windows build, or a VM without WDDM) has /dev/dxg absent +-- or the libraries missing, and in that case there is nothing to link and the +-- correct behaviour is the same as "not WSL at all". +-- +-- Probed by the LIBRARIES rather than by /proc/version containing "microsoft": +-- the kernel string says which kernel is running, and this package cares +-- whether the userspace half is reachable. A WSL2 kernel booted outside WSL +-- (people do this) would pass the string test and have nothing to link. +local function __probe_wsl_dir() + -- hostlib asks ldconfig first, which on WSL2 knows this directory (WSL adds + -- it via /etc/ld.so.conf.d), and falls back to the explicit path for a + -- distribution whose cache was never built -- a minimal container image + -- under WSL is exactly that case. + local dir = hostlib.dir_of("libd3d12core.so", { extra_dirs = { WSL_LIBDIR } }) + if dir then return dir end + return nil +end + +-- Every Windows-side library in DIR. +-- +-- The WHOLE set, not the two names that appear in a design document. Same rule +-- as the NVIDIA sentinel and for the same measured reason (R7): a hand-written +-- list is a list of what someone thought of, and the ones it misses come from +-- the host silently. `libd3d12core.so` dlopens `libdxcore.so`, which is a +-- Microsoft file with no RPATH of ours -- so it can only be found if it is in +-- the subos lib directory too. +-- +-- `libcuda.so.1` and `libnvidia-ml.so.1` appear here on an NVIDIA WSL2 host. +-- They are linked as well: they are the CUDA half of the same arrangement, and +-- `libcuda-host-link` -- which is what a CUDA consumer depends on -- probes for +-- them through hostlib and therefore already finds them here or on the host. +-- Linking them costs one symlink and removes a second probe path. +local function __wsl_entries(dir) + return hostlib.entries_with_prefix(dir, { "^lib.*%.so" }) +end + +function install() + local dir = pkginfo.install_dir() + os.tryrm(dir) + os.mkdir(path.join(dir, "lib")) + + local wsldir = __probe_wsl_dir() + if not wsldir then + -- NOT a failure, and not silent either. On a non-WSL host this is the + -- expected outcome and the message has to say so, because this package + -- is installed everywhere `graphics` is. + log.info("not a WSL2 host with D3D12 userspace (%s) — nothing to link. " + .. "GL uses the native driver or llvmpipe.", WSL_LIBDIR) + io.writefile(path.join(dir, ".wsl-host"), "no\n") + return true + end + + local names = __wsl_entries(wsldir) + for _, name in ipairs(names) do + system.exec(string.format([[ln -sf "%s" "%s"]], + path.join(wsldir, name), path.join(dir, "lib", name))) + end + + -- The glibc floor of the borrowed set, measured rather than assumed. + -- + -- This is the line between "borrowing" and "chasing versions" -- the whole + -- argument for taking a driver from the host rather than shipping one. + -- NVIDIA's userspace requires at most GLIBC_2.10, which is why borrowing it + -- is safe forever. Microsoft documents these libraries as compatible with + -- "Ubuntu, Debian, Fedora, CentOS, SUSE and other glibc-based + -- distributions", which implies a low floor but does not measure one. + -- + -- So: report it. If it ever exceeds the glibc in the subos, the symptom is + -- `version GLIBC_x.yz not found` from inside a dlopen three layers down -- + -- mcpp#352 exactly -- and this line is what makes that diagnosable. + local floor = __glibc_floor(path.join(wsldir, "libd3d12core.so")) + io.writefile(path.join(dir, ".wsl-host"), + string.format("yes\n%s\n%s\n", wsldir, floor or "unknown")) + + log.info("wsl-gl-host-link → %s (%d host libraries linked, glibc floor %s) ✓", + wsldir, #names, floor or "unknown") + if #names == 0 then + log.warn("no libraries under %s — GL will fall back to llvmpipe", wsldir) + end + return true +end + +-- The highest GLIBC_x.y version FILE requires, read from its dynamic symbols. +-- +-- `readelf`/`llvm-readelf` may not exist at install time, so this greps the raw +-- bytes for the version strings. Crude and sufficient: the strings are in +-- .gnu.version_r as plain `GLIBC_2.34` text, and the question is only "what is +-- the highest one". +function __glibc_floor(file) + local out = try { + function() + return os.iorun(string.format( + [[sh -c 'strings %s 2>/dev/null | grep -o "^GLIBC_[0-9.]*" | sort -Vu | tail -1']], + file)) + end + } + if not out then return nil end + out = out:gsub("%s+$", "") + return out ~= "" and out or nil +end + +function config() + local dir = pkginfo.install_dir() + local tag = package.name .. "@" .. pkginfo.version() + + xvm.add(package.name) + + -- Nothing declared on a non-WSL host. W5 in the plan's acceptance table: + -- this package ships to every machine that installs `graphics`, so "no + -- effect where it does not apply" is a property to assert, not to assume. + local state = io.readfile(path.join(dir, ".wsl-host")) or "" + if not state:find("^yes") then return true end + + -- Into `/lib`, which is what makes the borrowed libraries reachable + -- at all: `d3d12_dri.so` carries a DT_RPATH ending in the subos lib + -- directory (verified on the shipped payload), and DT_RPATH is searched + -- along the load chain -- so its dlopen of `libd3d12core.so` resolves here. + sysroot.declare_libs(dir, "lib", tag, pkginfo.version()) + + -- Tell mesa which gallium driver to use. + -- + -- Measured upstream (microsoft/wslg#1332): mesa does not always select + -- `d3d12` on its own under WSL, because the usual selection path goes + -- through a DRM device and there is not one. Declared ONLY on a WSL host, + -- which is the whole point of putting it in a sentinel: adapting to the + -- host needs no conditional syntax in the consumer, only a package that is + -- a no-op elsewhere. + -- + -- `set`, not `prepend`: this is a single value, not a list. A user who + -- exported GALLIUM_DRIVER themselves keeps it (UC-1), so + -- `GALLIUM_DRIVER=llvmpipe` remains the escape hatch when the GPU path + -- misbehaves -- and that escape is why forcing the value here is safe. + if type(subos.env) == "function" then + subos.env{ var = "GALLIUM_DRIVER", op = "set", + value = "d3d12", binding = tag } + end + return true +end + +function uninstall() + xvm.remove(package.name) + return true +end diff --git a/tests/lua/hostlib_harness.lua b/tests/lua/hostlib_harness.lua new file mode 100644 index 00000000..682a8b15 --- /dev/null +++ b/tests/lua/hostlib_harness.lua @@ -0,0 +1,136 @@ +-- Exercise libs/hostlib.lua in a plain-Lua sandbox, the way libxpkg runs a +-- hook: no xmake, only the handful of globals the prelude provides. +-- +-- The interesting case is the BIARCH host (Fedora/RHEL/SUSE): a 32-bit copy of +-- the soname in /usr/lib and the real 64-bit one in /usr/lib64. That is the +-- shape mcpp#352 got wrong, and it cannot be caught by ordering alone. + +local ROOT = assert(os.getenv("FAKE_ROOT"), "FAKE_ROOT required") + +-- ── the sandbox ──────────────────────────────────────────────────────── +path = {} +function path.join(...) + local parts = {...} + local out = parts[1] or "" + for i = 2, #parts do + if out:sub(-1) == "/" then out = out .. parts[i] + else out = out .. "/" .. parts[i] end + end + return out +end +function path.directory(p) return (p:gsub("/[^/]*$", "")) end +function path.filename(p) return (p:match("[^/]+$")) end + +local _isfile = function(p) + local f = io.open(p, "rb") + if f then f:close(); return true end + return false +end +os.isfile = _isfile +os.isdir = function(p) + -- `ls -d` on a directory succeeds and on a file also succeeds, so test the + -- trailing-slash form: only a directory answers that. + local ok = os.execute(string.format('test -d "%s"', p)) + return ok == true or ok == 0 +end +os.iorun = function(cmd) + local f = io.popen(cmd) + if not f then return "" end + local out = f:read("*a"); f:close(); return out +end +function try(t) + local fn = t[1] or t + local ok, r = pcall(fn) + if ok then return r end + return nil +end + +-- import() resolves the two modules hostlib asks for. +local _stub_log = { + info = function(fmt, ...) print("[info] " .. string.format(fmt, ...)) end, + warn = function(fmt, ...) print("[warn] " .. string.format(fmt, ...)) end, +} +local _loaded = {} +function import(name) + if name == "xim.libxpkg.log" then log = _stub_log; return _stub_log end + error("unexpected import: " .. name) +end + +-- ── the fake host ────────────────────────────────────────────────────── +-- ldconfig is shadowed: the harness must decide what the loader's index says. +-- Written as a real command on PATH because that is how hostlib asks. +local fake_bin = ROOT .. "/fake-bin" +os.execute(string.format('mkdir -p "%s"', fake_bin)) + +local function write_ldconfig(body) + local f = assert(io.open(fake_bin .. "/ldconfig", "w")) + f:write("#!/bin/sh\n", body, "\n") + f:close() + os.execute(string.format('chmod +x "%s/ldconfig"', fake_bin)) +end + +local ok_count, fail_count = 0, 0 +local function check(name, got, want) + if got == want then + print(string.format(" ok %s -> %s", name, tostring(got))) + ok_count = ok_count + 1 + else + print(string.format(" FAIL %s -> got %s, want %s", + name, tostring(got), tostring(want))) + fail_count = fail_count + 1 + end +end + +-- ── load the module under test ───────────────────────────────────────── +local hostlib = assert(loadfile(os.getenv("HOSTLIB")))() + +print("== 1. ELF class is read from the file, not guessed ==") +check("elf_class(64-bit)", hostlib.elf_class(ROOT .. "/usr/lib64/libFoo.so.1"), 64) +check("elf_class(32-bit)", hostlib.elf_class(ROOT .. "/usr/lib/libFoo.so.1"), 32) +check("elf_class(text file)", hostlib.elf_class(ROOT .. "/usr/lib/notelf.so"), nil) +check("elf_class(missing)", hostlib.elf_class(ROOT .. "/nope.so"), nil) + +print("== 2. biarch host, ldconfig lists BOTH ABIs (the #352 shape) ==") +-- 32-bit line FIRST, exactly as a biarch ldconfig may order them: taking the +-- first line is how an authoritative source yields a wrong answer. +write_ldconfig(string.format([[ +cat <<'EOF' + libFoo.so.1 (libc6) => %s/usr/lib/libFoo.so.1 + libFoo.so.1 (libc6,x86-64) => %s/usr/lib64/libFoo.so.1 +EOF]], ROOT, ROOT)) +check("dir_of via ldconfig", hostlib.dir_of("libFoo.so.1"), + ROOT .. "/usr/lib64") + +print("== 3. no ldconfig at all: fallback must still refuse the 32-bit dir ==") +write_ldconfig("exit 1") +-- The fallback list is absolute (/usr/lib64, /usr/lib), so it cannot see the +-- fake root. extra_dirs is how a caller names a layout only it knows -- and it +-- is ELF-class checked too, which is the assertion here: /usr/lib comes first +-- in the list and must still lose. +check("extra_dirs rejects 32-bit", hostlib.dir_of("libFoo.so.1", { + extra_dirs = { ROOT .. "/usr/lib", ROOT .. "/usr/lib64" } }), + ROOT .. "/usr/lib64") + +print("== 4. absent soname is nil, not a guess ==") +check("dir_of(absent)", hostlib.dir_of("libNope.so.9"), nil) + +print("== 5. entries_with_prefix drops 32-bit siblings ==") +-- The biarch trap one level in: a 64-bit directory that also holds a 32-bit +-- file with a matching name. Linking that into a payload fails at load. +local got = hostlib.entries_with_prefix(ROOT .. "/mixed", { "^libnvidia%-" }) +table.sort(got) +check("mixed dir count", #got, 1) +check("mixed dir picks 64-bit", got[1], "libnvidia-glcore.so.550") + +print("== 6. a dangling symlink is dropped, not counted ==") +local got2 = hostlib.entries_with_prefix(ROOT .. "/dangling", { "^libnvidia%-" }) +check("dangling dropped", #got2, 0) + +print() +if fail_count == 0 then + print(string.format("PASS: %d assertions", ok_count)) + os.exit(0) +else + print(string.format("FAIL: %d failed, %d passed", fail_count, ok_count)) + os.exit(1) +end diff --git a/tests/test_hostlib.py b/tests/test_hostlib.py new file mode 100644 index 00000000..55c3f54e --- /dev/null +++ b/tests/test_hostlib.py @@ -0,0 +1,152 @@ +"""hostlib: one answer to "where is the host's ". + +Two kinds of test, deliberately: + +* an INVARIANT, in pure Python, that always runs -- no recipe may carry a + hardcoded list of distribution library directories. That list is the bug + class: FHS biarch (/usr/lib = 32-bit) and Debian multiarch (/usr/lib = + 64-bit) are both correct, so a list is a decision to be wrong somewhere. + mcpp#352 is that bug in the mcpp index; this test is what stops it coming + back here. + +* a BEHAVIOUR check of libs/hostlib.lua itself, run in a plain-Lua sandbox + against a forged biarch host. Skipped rather than failed when no `lua5.4` is + on the runner: a missing interpreter is not a defect in the index, and a + fatal skip would make the whole suite unrunnable on a machine that is + otherwise fine. + +Design: xlings/.agents/docs/2026-08-07-graphics-experience-industry-survey-and-plan.md §9.2 +""" + +import os +import re +import shutil +import subprocess +from pathlib import Path + +import pytest + +REPO = Path(__file__).resolve().parent.parent +HARNESS = REPO / "tests" / "lua" / "hostlib_harness.lua" +HOSTLIB = REPO / "libs" / "hostlib.lua" + +# The three layouts, spelled the way a recipe would spell them. +LIBDIR_TOKENS = ( + "/usr/lib/x86_64-linux-gnu", + "/lib/x86_64-linux-gnu", + "/usr/lib64", + "/lib64", +) + +# hostlib.lua IS the list, and the verifier carries the same three rules in +# shell because it cannot import Lua. Both are the single implementation this +# test exists to funnel everything else into. +ALLOWED = { + "libs/hostlib.lua", +} + + +def _recipes(): + return sorted(REPO.glob("pkgs/*/*.lua")) + + +def test_hostlib_exists(): + assert HOSTLIB.is_file(), "libs/hostlib.lua is the shared host-library probe" + + +@pytest.mark.parametrize("recipe", _recipes(), ids=lambda p: p.name) +def test_no_hardcoded_distro_libdir_list(recipe): + """A recipe must not enumerate distro library directories. + + One token is fine: a package legitimately mentions a single path in a + comment, or joins one it was handed. TWO OR MORE distinct layout roots in + one file is the shape that means "I am guessing the layout", and that is + what must go through hostlib instead -- because hostlib ELF-class checks + the answer, and a list cannot. + """ + rel = recipe.relative_to(REPO).as_posix() + if rel in ALLOWED: + pytest.skip("this file is the implementation") + + text = recipe.read_text(encoding="utf-8", errors="replace") + # Comments are where the *reason* lives, and several recipes correctly + # explain the layout problem in prose. Only code counts. + code = "\n".join( + line for line in text.splitlines() if not line.lstrip().startswith("--") + ) + hits = sorted({tok for tok in LIBDIR_TOKENS if tok in code}) + assert len(hits) < 2, ( + f"{rel} enumerates distro library directories {hits}. There is no layout " + "to assume: FHS biarch makes /usr/lib 32-bit (Fedora/RHEL/SUSE) and " + "Debian multiarch makes it 64-bit. Use " + 'import("xim.pkgindex.hostlib") and hostlib.dir_of(), which asks ' + "ldconfig -p, checks the ELF class and takes the first hit." + ) + + +def test_verifier_probes_rather_than_hardcodes(): + """verify-host-link.sh must not pin one layout either. + + It skipped its own check 4 in silence on any non-Debian host and still + printed PASS -- worse than the same mistake in a recipe, because this file + exists to prove something. + """ + sh = REPO / ".agents" / "tools" / "graphics" / "verify-host-link.sh" + if not sh.is_file(): + pytest.skip("verifier not present") + text = sh.read_text(encoding="utf-8", errors="replace") + assert "host_vendor_dir" in text, ( + "verify-host-link.sh should resolve the host vendor directory with its " + "host_vendor_dir() probe (ldconfig -p, ELF class, first hit)" + ) + # A check that did not run has to be counted, or "PASS: 12 checks" is + # compatible with two of them never having executed. + assert re.search(r"\bskipped=\$\(\(skipped\+1\)\)", text), ( + "verify-host-link.sh should count skipped checks and report them in the " + "verdict" + ) + + +@pytest.mark.skipif( + shutil.which("lua5.4") is None and shutil.which("lua") is None, + reason="no lua interpreter on this machine", +) +def test_hostlib_behaviour_against_a_forged_biarch_host(tmp_path): + """The #352 shape: 32-bit copy in /usr/lib, real one in /usr/lib64.""" + lua = shutil.which("lua5.4") or shutil.which("lua") + cc = shutil.which("gcc") or shutil.which("cc") + if cc is None: + pytest.skip("no compiler to forge ELF fixtures") + + root = tmp_path / "fakehost" + for d in ("usr/lib", "usr/lib64", "mixed", "dangling"): + (root / d).mkdir(parents=True) + + src = root / "foo.c" + src.write_text("int foo(void){return 1;}\n") + so64 = root / "usr/lib64/libFoo.so.1" + subprocess.run([cc, "-shared", "-o", str(so64), str(src)], check=True) + + def make32(dst: Path): + # e_ident[EI_CLASS] = ELFCLASS32. Forged rather than cross-compiled so + # the test needs no multilib toolchain; only the class byte is read. + data = bytearray(so64.read_bytes()) + data[4] = 1 + dst.write_bytes(bytes(data)) + + make32(root / "usr/lib/libFoo.so.1") + (root / "usr/lib/notelf.so").write_text("not an elf\n") + shutil.copy(so64, root / "mixed/libnvidia-glcore.so.550") + make32(root / "mixed/libnvidia-eglcore.so.550") + (root / "dangling/libnvidia-ghost.so.1").symlink_to("/nonexistent/x.so") + + env = dict(os.environ) + env["FAKE_ROOT"] = str(root) + env["HOSTLIB"] = str(HOSTLIB) + env["PATH"] = f"{root / 'fake-bin'}:{env['PATH']}" + + proc = subprocess.run( + [lua, str(HARNESS)], capture_output=True, text=True, env=env, cwd=tmp_path + ) + assert proc.returncode == 0, proc.stdout + proc.stderr + assert "PASS:" in proc.stdout, proc.stdout From 5c1fe8964844d2acbdd2130a85c500b3f81f3bb3 Mon Sep 17 00:00:00 2001 From: sunrisepeak Date: Fri, 7 Aug 2026 05:08:15 +0800 Subject: [PATCH 6/7] fix(graphics): a range cannot match mesa's four-component version Measured: `xim:mesa@>=25.0.7` and `@>=25.0.7.1` both resolve to "package not found", while `@25.0.7.1` and a bare `xim:mesa` resolve. Every other range in these recipes (`@>=0.1`, `@>=1.8`, `@>=2.39`) works, so the resolver's comparison is fine and the four-component version is what it cannot parse -- and mesa's fourth component is deliberately ours. So the plan's "use lower bounds" is impossible for mesa specifically. Bare namespaced name, with the measurement recorded at the call site: the failure reads as a missing package rather than an unparseable constraint, which is the wrong thing to send the next reader looking for. --- .xlings-index-cache.json | 2 +- pkgs/g/graphics.lua | 13 ++++++++++++- pkgs/n/nvidia-gl-host-link.lua | 11 +++++++++++ pkgs/w/wsl-gl-host-link.lua | 13 ++++++++++++- 4 files changed, 36 insertions(+), 3 deletions(-) diff --git a/.xlings-index-cache.json b/.xlings-index-cache.json index 156c630e..9372a61d 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: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-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":"799975ecbdf647978962f8581309d2dec7b35c8d","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: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":"18cf26c52e01444b54ae5bbc18e7c611a8750c6c","version":2} \ No newline at end of file diff --git a/pkgs/g/graphics.lua b/pkgs/g/graphics.lua index fcf0cec3..4de7216d 100644 --- a/pkgs/g/graphics.lua +++ b/pkgs/g/graphics.lua @@ -61,7 +61,18 @@ package = { -- packages below it (libglvnd, libllvm, the X11 client -- libraries, wayland, libdrm, …) -- listing them here would -- be a second, drifting copy of that graph. - "xim:mesa@>=25.0.7", + -- BARE, no range, and that is measured rather than + -- stylistic: mesa's version is `25.0.7.1` -- four + -- components, upstream's three plus ours, deliberately (see + -- that recipe) -- and the resolver's range comparison + -- cannot parse a four-component version at all. Both + -- `@>=25.0.7` and `@>=25.0.7.1` resolve to + -- "package not found", which reads as a missing package + -- rather than an unparseable constraint. + -- + -- A bare namespaced name means "whatever mesa this home + -- resolves", which is what a lower bound was trying to say. + "xim:mesa", -- Sentinel: the host's proprietary NVIDIA GL userspace. -- A no-op on a machine without that driver. "xim:nvidia-gl-host-link@>=0.1", diff --git a/pkgs/n/nvidia-gl-host-link.lua b/pkgs/n/nvidia-gl-host-link.lua index 2ebcbca2..2b8f4ce0 100644 --- a/pkgs/n/nvidia-gl-host-link.lua +++ b/pkgs/n/nvidia-gl-host-link.lua @@ -17,6 +17,17 @@ package = { categories = {"graphics", "gpu", "nvidia", "lib"}, keywords = {"nvidia", "opengl", "egl", "glx", "host-link", "sentinel"}, + -- The self-check is a real program and has to be declared as one. + -- + -- Measured: `xvm.add("xlings-gl-doctor", {...})` alone registers the node + -- with the right kind, binding and filename -- and no shim appears in + -- `/bin`. The declaration is what makes xlings materialise one, and it + -- is also what the post-install check reads when it verifies that a package + -- registered what it promised ("installed but registered none of the + -- programs it declares"). Without it the node exists and nothing can run it. + programs = {"xlings-gl-doctor"}, + xvm_enable = true, + -- ───────────────────────────────────────────────────────────────────── -- The one userspace dependency the graphics stack keeps on the host. -- diff --git a/pkgs/w/wsl-gl-host-link.lua b/pkgs/w/wsl-gl-host-link.lua index 3a7f7d0a..acbec515 100644 --- a/pkgs/w/wsl-gl-host-link.lua +++ b/pkgs/w/wsl-gl-host-link.lua @@ -70,7 +70,18 @@ package = { -- mesa is what loads the borrowed libraries: the `d3d12` -- gallium driver module lives in its payload. Without mesa -- there is no consumer for anything this package links. - "xim:mesa@>=25.0.7", + -- BARE, no range, and that is measured rather than + -- stylistic: mesa's version is `25.0.7.1` -- four + -- components, upstream's three plus ours, deliberately (see + -- that recipe) -- and the resolver's range comparison + -- cannot parse a four-component version at all. Both + -- `@>=25.0.7` and `@>=25.0.7.1` resolve to + -- "package not found", which reads as a missing package + -- rather than an unparseable constraint. + -- + -- A bare namespaced name means "whatever mesa this home + -- resolves", which is what a lower bound was trying to say. + "xim:mesa", "xim:glibc@>=2.39", }, }, From 64447bb3dccb2cde7c78d5211a95f5bd153a8b56 Mon Sep 17 00:00:00 2001 From: sunrisepeak Date: Fri, 7 Aug 2026 05:48:14 +0800 Subject: [PATCH 7/7] test(graphics): a control run, so S1 stops blaming the closure for something else `S1: closure incomplete` is only a valid reading of a failure if the probe would have SUCCEEDED in the same container with the host present. Measured 2026-08-07: it does not. The same subos-built probe renders `llvmpipe (LLVM 20.1.7)` with RESULT=ok outside any container, and loads ZERO EGL vendors inside one -- identically with no unshare, --unshare-net, --unshare-user and --unshare-all, and identically with /usr, /etc and /lib bound. The vendor's DT_NEEDED closure resolves with 0 unresolved under our own loader, and the vendor JSON and .so are readable in the container. So the failure has nothing to do with the absence of /usr, which is the single variable this test exists to isolate -- and the message was sending the reader to look at the dependency closure. Now the sealed run is preceded by a CONTROL: the identical container with the host fully bound. If the control fails, the script exits 2 as INCONCLUSIVE and says what that means, instead of running the sealed case and mis-attributing the same failure. A test that reports a wrong cause is worse than one that reports nothing, because someone acts on it. Also names the mount-order trap in run_in_container, where the existing note about it was three paragraphs away from the code: --tmpfs /tmp must precede the home bind or a home under /tmp is shadowed and the binary 'does not exist'. My first namespace bisect hit exactly that and produced no output for every variant, which reads as a crash. Verified: on this home the script now exits 2 with the INCONCLUSIVE explanation rather than 1 with 'closure incomplete'. --- .agents/tools/graphics/selfcontained-check.sh | 65 +++++++++++++++---- 1 file changed, 53 insertions(+), 12 deletions(-) diff --git a/.agents/tools/graphics/selfcontained-check.sh b/.agents/tools/graphics/selfcontained-check.sh index d913e92d..ff6e4c12 100755 --- a/.agents/tools/graphics/selfcontained-check.sh +++ b/.agents/tools/graphics/selfcontained-check.sh @@ -114,26 +114,67 @@ while IFS= read -r name; do ENVARGS+=(--setenv "$name" "$value") done <<<"$DECLARED" +# The container, twice. +# +# S1 blames "closure incomplete" for any failure, and that is only a valid +# reading if the probe would have succeeded in the SAME container with the host +# present. Measured 2026-08-07: it does not. The probe renders llvmpipe fine +# outside any container and loads zero EGL vendors inside one -- with every +# namespace combination, and with /usr, /etc and /lib bound. So the failure was +# not about the absence of /usr, which is the single variable this test exists to +# isolate, and "S1: closure incomplete" was pointing at the wrong thing. +# +# So run a CONTROL first: the identical container with the host fully available. +# If the control fails, this test cannot distinguish its two cases and must say +# so instead of blaming the stack. A test that reports a wrong cause is worse +# than one that reports nothing, because someone acts on it. +run_in_container() { + # $1 = "sealed" | "control"; mount order matters -- --tmpfs /tmp must come + # BEFORE the home bind, or a home under /tmp is shadowed and the binary + # "does not exist" (see the note above). + local extra=() + if [[ "$1" == control ]]; then + extra=(--ro-bind /usr /usr --ro-bind /etc /etc + --symlink usr/lib /lib --symlink usr/lib64 /lib64) + fi + bwrap \ + --unshare-all --die-with-parent \ + --proc /proc --tmpfs /tmp \ + --ro-bind "$XHOME" "$XHOME" \ + "${extra[@]}" \ + --dev-bind /dev/dri /dev/dri \ + --ro-bind /sys /sys \ + --setenv XLINGS_HOME "$XHOME" \ + --setenv HOME /tmp \ + "${ENVARGS[@]}" \ + -- "$PROBE" 2>&1 +} + +CTRL="$(run_in_container control)" +if ! grep -q "RESULT=ok" <<<"$CTRL"; then + echo "$CTRL" | sed 's/^/ /' + echo "[gfx-check] INCONCLUSIVE: the probe does not reach RESULT=ok even with" >&2 + echo " the host fully bound (/usr, /etc, /lib present). That is a broken" >&2 + echo " probe or a broken container, NOT evidence about self-containment --" >&2 + echo " the sealed run below would fail for the same reason and S1 would" >&2 + echo " blame the closure." >&2 + echo " Compare: run \$SUBOS/bin/glprobe directly, outside bwrap." >&2 + exit 2 +fi +log " control ok — the probe reaches RESULT=ok in this container WITH the host" + # No LD_LIBRARY_PATH either: the probe was linked with -rpath into the subos, # which is how any program xlings installs finds its libraries. Handing one in # would hide a stack that only resolves when someone sets a search path. -OUT="$( - bwrap \ - --unshare-all --die-with-parent \ - --proc /proc --tmpfs /tmp \ - --ro-bind "$XHOME" "$XHOME" \ - --dev-bind /dev/dri /dev/dri \ - --ro-bind /sys /sys \ - --setenv XLINGS_HOME "$XHOME" \ - --setenv HOME /tmp \ - "${ENVARGS[@]}" \ - -- "$PROBE" 2>&1 -)" +OUT="$(run_in_container sealed)" RC=$? echo "$OUT" | sed 's/^/ /' # ── assertions ────────────────────────────────────────────────────────── +# Now "closure incomplete" is a sound reading: the control proved the same +# container and probe work when the host is present, so the only thing that +# changed is the host being gone. [[ $RC -eq 0 ]] || fail "S1: probe exited $RC inside the empty host (closure incomplete)" grep -q "RESULT=ok" <<<"$OUT" || fail "S1/S4: probe did not reach RESULT=ok" log " S1 ok — no loader error with no /usr present"