{ description = "Kagi-powered web search for kli"; inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; kli.url = "github:kleisli-io/kli"; cl-deps.follows = "kli/cl-deps"; }; outputs = { nixpkgs, kli, cl-deps, ... }: let systems = [ "x86_64-linux" "aarch64-linux" "aarch64-darwin" ]; forEachSystem = nixpkgs.lib.genAttrs systems; mkExtension = system: let pkgs = nixpkgs.legacyPackages.${system}; inherit (cl-deps.lib.${system}) buildLisp lisp; kliLibrary = pkgs.lib.findFirst ( dependency: (dependency.passthru.lispName or null) == "kli" ) (throw "kli buildLisp library not found") kli.packages.${system}.default.passthru.lispDeps; in buildLisp.library { name = "kli-kagi"; deps = [ kliLibrary lisp.jzon lisp.drakma lisp.flexi-streams ]; srcs = [ ./kli-kagi.lisp ]; tests = { deps = [ lisp.fiveam ]; srcs = [ ./t/tests.lisp ]; expression = "(fiveam:run! 'kli/kagi/tests::all)"; }; passthru = { name = "kli-kagi"; manifestSymbol = "kli/kagi:*kli-kagi-extension-manifest*"; }; }; in { packages = forEachSystem ( system: let extension = mkExtension system; in { default = extension; extension = extension; } ); checks = forEachSystem ( system: let pkgs = nixpkgs.legacyPackages.${system}; extension = mkExtension system; configuredKli = kli.lib.${system}.mkConfiguredKli { extensions = [ extension ]; }; in { extension = extension; tests = extension.tests; manifest = configuredKli.manifestGate; source-load = pkgs.runCommand "kli-kagi-source-load" { } '' export HOME="$TMPDIR/home" mkdir -p "$HOME/.config/kli/extensions" cp ${./kli-kagi.lisp} "$HOME/.config/kli/extensions/kli-kagi.lisp" output="$(printf '%s\n' \ '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' \ | ${kli.packages.${system}.default}/bin/kli mcp-serve kli-kagi)" printf '%s\n' "$output" if ! printf '%s\n' "$output" | grep -q '"name":"web_search"'; then echo "kli-kagi did not load from source" >&2 exit 1 fi touch "$out" ''; } ); devShells = forEachSystem (system: { default = nixpkgs.legacyPackages.${system}.mkShell { packages = [ kli.packages.${system}.default nixpkgs.legacyPackages.${system}.nixfmt ]; }; }); formatter = forEachSystem (system: nixpkgs.legacyPackages.${system}.nixfmt); }; }