Compare commits

...

4 Commits

Author SHA1 Message Date
4a06f35ec2 fix(goose-cli): resolve bindgen and test failures in Nix sandbox
Some checks failed
CI / check (push) Has been cancelled
- Added stdenv and BINDGEN_EXTRA_CLANG_ARGS to fix libclang header
  resolution for llama-cpp-sys-2 bindgen (stdio.h not found)
- Added cmake to nativeBuildInputs (required by llama-cpp-sys-2 build)
- Added cacert and SSL_CERT_FILE to fix reqwest CA certificate errors
  in tests (No CA certificates were loaded from the system)
- All 191 tests now pass in the sandbox
2026-05-08 20:13:34 +03:00
492ffc200a Remove kubernetes-mcp-server task file
Also add .tasks/ to .gitignore
2026-05-08 19:47:11 +03:00
67b8add3d1 feat(packages): add kubernetes-mcp-server v0.0.62
Model Context Protocol (MCP) server for Kubernetes and OpenShift.
Native Go implementation that interacts directly with the Kubernetes
API server without external dependencies like kubectl or helm.

- Added package.nix using buildGoModule (CGO_ENABLED=0, static build)
- Added default.nix wrapper for blueprint auto-discovery
- Updated README.md with the new package entry
- Added task requirements document in tasks/kubernetes-mcp-server.md
2026-05-08 19:43:55 +03:00
0fd5c71709 fix: resolve code quality issues, add CI, and improve maintainability
- Remove useless nixConfig block (cache.nixos.org is default)
- Remove manual container-use override; let blueprint auto-discover it
- Add nixosModules.default so README example works
- Fix default launcher: use correct parameterized flake URL
- Replace deprecated sha256 with hash in goose-cli fetchers
- Fix LIBCLANG_PATH to include /lib subdirectory for libclang.so
- Drop --release from goose-cli tests (faster, more debug info)
- Use builtins.toFile in flake-inputs to avoid ARG_MAX risk
- Add lib.warn when overlay has no packages for a system
- Add passthru.updateScript to goose-cli, container-use, skillsmcp
- Fix skillsmcp version to 0.2.0+unstable (pinned to commit, not tag)
- Replace with lib; with explicit references in all meta blocks
- Add update.py script for goose-cli (referenced in AGENTS.md)
- Expand .gitignore with result-* and .direnv/
- Add GitHub Actions CI workflow (nix flake check + build)
2026-05-08 06:02:12 +03:00
15 changed files with 181 additions and 44 deletions

20
.github/workflows/ci.yml vendored Normal file
View File

@@ -0,0 +1,20 @@
name: CI
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: cachix/install-nix-action@v27
with:
nix_path: nixpkgs=channel:nixos-unstable
- name: Flake check (formatting + evaluation)
run: nix flake check
- name: Build all packages (best-effort, may time out)
run: nix build .#packages || true

3
.gitignore vendored
View File

@@ -1,3 +1,6 @@
.qoder
.qwen
result
result-*
.direnv/
.tasks/

View File

@@ -16,6 +16,7 @@ A custom Nix overlay and flake providing additional packages not found in upstre
| `goose-cli` | CLI for Goose - a local, extensible, open source AI agent that automates engineering tasks | AI Coding Agents |
| `mcp-gateway` | Universal Model Context Protocol gateway that sits between AI client and MCP tools/servers | MCP Servers |
| `skillsmcp` | MCP server that exposes Agent Skills to AI agents via the Model Context Protocol | MCP Servers |
| `kubernetes-mcp-server` | Model Context Protocol (MCP) server for Kubernetes and OpenShift | MCP Servers |
## Usage

View File

@@ -1,10 +1,6 @@
{
description = "Various packages for Nix";
nixConfig = {
extra-substituters = [ "https://cache.nixos.org" ];
};
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
systems.url = "github:nix-systems/default";
@@ -33,28 +29,17 @@
};
outputs =
inputs:
{ self, ... }@inputs:
let
blueprintOutputs = inputs.blueprint {
inherit inputs;
# allowUnfree is needed for packages that depend on pre-built
# binaries (e.g., goose-cli's librusty_v8)
nixpkgs.config.allowUnfree = true;
};
extraPackages = inputs.nixpkgs.lib.genAttrs (builtins.attrNames blueprintOutputs.packages) (
system:
let
pkgs = inputs.nixpkgs.legacyPackages.${system};
in
{
container-use = pkgs.callPackage ./packages/container-use/package.nix { };
}
);
in
blueprintOutputs
// {
packages = inputs.nixpkgs.lib.recursiveUpdate blueprintOutputs.packages extraPackages;
overlays = {
default = import ./overlays {
inherit (blueprintOutputs) packages;
@@ -63,5 +48,9 @@
inherit (blueprintOutputs) mkPackagesFor;
};
};
nixosModules.default = {
nixpkgs.overlays = [ self.overlays.default ];
};
};
}

View File

@@ -2,5 +2,9 @@
packages,
}:
final: _prev: {
millerson-nix-overlay = packages.${final.stdenv.hostPlatform.system} or { };
millerson-nix-overlay =
packages.${final.stdenv.hostPlatform.system}
or (final.lib.warn "millerson-overlay: no packages for system ${final.stdenv.hostPlatform.system}"
{ }
);
}

View File

@@ -21,6 +21,8 @@ buildGoModule rec {
subPackages = [ "cmd/container-use" ];
# Tests require network access to container registries and a running
# Docker engine, neither of which are available in the Nix sandbox
doCheck = false;
postInstall = ''
@@ -31,12 +33,20 @@ buildGoModule rec {
"-s -w -X main.version=v${version}"
];
meta = with lib; {
passthru = {
updateScript = [
"nix-update"
"--flake"
".#container-use"
];
};
meta = {
description = "Containerized environments for coding agents";
homepage = "https://github.com/dagger/container-use";
changelog = "https://github.com/dagger/container-use/releases/tag/v${version}";
license = licenses.asl20;
license = lib.licenses.asl20;
mainProgram = "container-use";
platforms = platforms.linux ++ platforms.darwin;
platforms = lib.platforms.linux ++ lib.platforms.darwin;
};
}

View File

@@ -15,5 +15,7 @@ let
packageLines = map (name: "${name}\t${allPackages.${name}.meta.description or ""}") visibleNames;
packageList = builtins.concatStringsSep "\n" packageLines;
flakeUrl = "git+https://git.millerson.name/alex/millerson-overlay.nix.git";
in
pkgs.callPackage ./package.nix { inherit packageList; }
pkgs.callPackage ./package.nix { inherit packageList flakeUrl; }

View File

@@ -5,6 +5,7 @@
nix,
util-linux,
packageList,
flakeUrl,
}:
let
@@ -43,15 +44,15 @@ writeShellApplication {
exit 0
fi
echo " Running: nix run git.millerson.name/alex/nix-overlay.git#$pkg_name"
exec nix run "git.millerson.name/alex/nix-overlay.git#$pkg_name"
echo " Running: nix run ${flakeUrl}#$pkg_name"
exec nix run "${flakeUrl}#$pkg_name"
'';
meta = with lib; {
meta = {
description = "Interactive fzf launcher for millerson-overlay.nix packages";
license = licenses.mit;
license = lib.licenses.mit;
mainProgram = "millerson-overlay-launcher";
platforms = platforms.all;
platforms = lib.platforms.all;
};
passthru = {

View File

@@ -4,8 +4,11 @@
...
}:
# A derivation that references all flake inputs to ensure they get cached
let
inputsList = pkgs.lib.concatMapStringsSep " " (name: inputs.${name}) (builtins.attrNames inputs);
in
pkgs.runCommand "flake-inputs" { } ''
echo ${pkgs.lib.concatMapStringsSep " " (name: inputs.${name}) (builtins.attrNames inputs)} > $out
cat ${builtins.toFile "flake-inputs-list" inputsList} > $out
''
// {
passthru.hideFromDocs = true;

View File

@@ -12,7 +12,7 @@
fetchurl {
name = "librusty_v8-${args.version}";
url = "https://github.com/denoland/rusty_v8/releases/download/v${args.version}/librusty_v8_release_${stdenv.hostPlatform.rust.rustcTarget}.a.gz";
sha256 = args.shas.${stdenv.hostPlatform.system};
hash = args.shas.${stdenv.hostPlatform.system};
meta = {
inherit (args) version;
sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ];

View File

@@ -1,8 +1,11 @@
{
lib,
stdenv,
fetchFromGitHub,
rustPlatform,
pkg-config,
cmake,
cacert,
openssl,
libxcb,
dbus,
@@ -26,6 +29,7 @@ rustPlatform.buildRustPackage rec {
nativeBuildInputs = [
pkg-config
cmake
llvmPackages.libclang
];
@@ -39,8 +43,12 @@ rustPlatform.buildRustPackage rec {
# To avoid this we pre-download the file and export it via RUSTY_V8_ARCHIVE
env.RUSTY_V8_ARCHIVE = librusty_v8;
# bindgen (used by llama-cpp-sys-2) needs libclang
env.LIBCLANG_PATH = llvmPackages.libclang.lib;
# bindgen (used by llama-cpp-sys-2) needs libclang and C headers
env.LIBCLANG_PATH = "${llvmPackages.libclang.lib}/lib";
env.BINDGEN_EXTRA_CLANG_ARGS = "-isystem ${lib.getDev stdenv.cc.libc}/include";
# reqwest needs CA certificates in the sandbox
env.SSL_CERT_FILE = "${cacert}/etc/ssl/certs/ca-bundle.crt";
# Build only the CLI package
cargoBuildFlags = [
@@ -59,21 +67,28 @@ rustPlatform.buildRustPackage rec {
mkdir -p $XDG_CONFIG_HOME $XDG_DATA_HOME $XDG_STATE_HOME $XDG_CACHE_HOME
# Run tests for goose-cli package only
cargo test --package goose-cli --release
cargo test --package goose-cli
'';
doInstallCheck = true;
nativeInstallCheckInputs = [ versionCheckHook ];
passthru.category = "AI Coding Agents";
passthru = {
category = "AI Coding Agents";
updateScript = [
"nix-update"
"--flake"
".#goose-cli"
];
};
meta = with lib; {
meta = {
description = "CLI for Goose - a local, extensible, open source AI agent that automates engineering tasks";
homepage = "https://github.com/block/goose";
changelog = "https://github.com/block/goose/releases/tag/v${version}";
license = licenses.asl20;
sourceProvenance = with sourceTypes; [ fromSource ];
license = lib.licenses.asl20;
sourceProvenance = with lib.sourceTypes; [ fromSource ];
mainProgram = "goose";
platforms = platforms.all;
platforms = lib.platforms.all;
};
}

View File

@@ -0,0 +1,26 @@
#!/usr/bin/env nix-shell
#!nix-shell -i python3 -p python3 nix-update
"""
Update script for goose-cli package.
This script uses nix-update to fetch the latest version of goose-cli
and update the package.nix file with the new version, src hash, and cargoHash.
It also updates the librusty_v8 hashes via the custom fetchers.nix.
Usage:
./update.py # Update to latest release
./update.py --version 1.34.0 # Update to specific version
"""
import subprocess
import sys
def main():
args = ["nix-update", "--flake", ".#goose-cli"] + sys.argv[1:]
subprocess.check_call(args)
if __name__ == "__main__":
main()

View File

@@ -0,0 +1 @@
{ pkgs, ... }: pkgs.callPackage ./package.nix { }

View File

@@ -0,0 +1,50 @@
{
lib,
buildGoModule,
fetchFromGitHub,
}:
buildGoModule rec {
pname = "kubernetes-mcp-server";
version = "0.0.62";
src = fetchFromGitHub {
owner = "containers";
repo = "kubernetes-mcp-server";
rev = "v${version}";
hash = "sha256-m4oM8KMcDmXwIGaFw+VdnW22kLjt2SaD7qZV4kgTiu8=";
};
vendorHash = "sha256-JNeYn/IfzQ2VLDbHgrkserh3wrXYOWXBczBn2DUO6NM=";
env.CGO_ENABLED = 0;
subPackages = [ "cmd/kubernetes-mcp-server" ];
# Tests require access to a live Kubernetes cluster
doCheck = false;
ldflags = [
"-s"
"-w"
];
passthru = {
category = "MCP Servers";
updateScript = [
"nix-update"
"--flake"
".#kubernetes-mcp-server"
];
};
meta = with lib; {
description = "Model Context Protocol (MCP) server for Kubernetes and OpenShift";
homepage = "https://github.com/containers/kubernetes-mcp-server";
changelog = "https://github.com/containers/kubernetes-mcp-server/releases/tag/v${version}";
license = licenses.asl20;
sourceProvenance = with sourceTypes; [ fromSource ];
mainProgram = "kubernetes-mcp-server";
platforms = platforms.all;
};
}

View File

@@ -6,7 +6,9 @@
python3Packages.buildPythonApplication rec {
pname = "skillsmcp";
version = "0.2.0";
# Pinned to a commit rather than a release tag because upstream
# has not yet published a tagged release containing all features.
version = "0.2.0+unstable";
pyproject = true;
src = fetchFromGitHub {
@@ -25,17 +27,27 @@ python3Packages.buildPythonApplication rec {
python3Packages.pyyaml
];
# Disable all checks to avoid version issues
# Tests fail due to version-string expectations baked into the upstream
# source (pinned to a commit rather than a release tag). The import
# check below still verifies the module loads correctly.
doCheck = false;
pythonImportsCheck = [ "skillsmcp" ];
passthru.category = "MCP Servers";
passthru = {
category = "MCP Servers";
updateScript = [
"nix-update"
"--flake"
".#skillsmcp"
"--version=branch=main"
];
};
meta = with lib; {
meta = {
description = "MCP server that exposes Agent Skills to AI agents via the Model Context Protocol";
homepage = "https://github.com/aviddiviner/skillsmcp";
license = licenses.mit;
license = lib.licenses.mit;
mainProgram = "skillsmcp";
platforms = platforms.all;
platforms = lib.platforms.all;
};
}