146 lines
3.6 KiB
Nix
146 lines
3.6 KiB
Nix
{
|
|
description = "QVM - Quick development VMs for AI-assisted workflows";
|
|
|
|
inputs = {
|
|
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
|
flake-utils.url = "github:numtide/flake-utils";
|
|
};
|
|
|
|
outputs =
|
|
{
|
|
self,
|
|
nixpkgs,
|
|
flake-utils,
|
|
}:
|
|
{
|
|
nixosModules.default =
|
|
{
|
|
config,
|
|
lib,
|
|
pkgs,
|
|
...
|
|
}:
|
|
let
|
|
cfg = config.programs.qvm;
|
|
in
|
|
{
|
|
options.programs.qvm = {
|
|
memory = lib.mkOption {
|
|
type = lib.types.str;
|
|
default = "8G";
|
|
description = "Amount of memory to allocate to the VM (e.g., '8G', '16G')";
|
|
};
|
|
|
|
cpus = lib.mkOption {
|
|
type = lib.types.int;
|
|
default = 4;
|
|
description = "Number of CPU cores to allocate to the VM";
|
|
};
|
|
};
|
|
|
|
config = {
|
|
environment.systemPackages = [ self.packages.${pkgs.system}.qvm ];
|
|
|
|
environment.etc."xdg/qvm/qvm.conf".text = ''
|
|
QVM_MEMORY="${cfg.memory}"
|
|
QVM_CPUS="${toString cfg.cpus}"
|
|
'';
|
|
};
|
|
};
|
|
}
|
|
// flake-utils.lib.eachDefaultSystem (
|
|
system:
|
|
let
|
|
pkgs = import nixpkgs { inherit system; };
|
|
|
|
qvm = pkgs.buildGoModule {
|
|
pname = "qvm";
|
|
version = "0.1.0";
|
|
|
|
# NOTE: In a flake, only git-tracked files are included by default.
|
|
# The Go source files must be committed to git for this build to work.
|
|
# For development, use: go build ./cmd/qvm
|
|
src = ./.;
|
|
|
|
vendorHash = "sha256-d6Z32nPDawwFqhKfVw/QwHUuDuMuTdQdHApmxcXzFng=";
|
|
|
|
subPackages = [ "cmd/qvm" ];
|
|
|
|
nativeBuildInputs = with pkgs; [
|
|
makeWrapper
|
|
];
|
|
|
|
postInstall = ''
|
|
# Install default VM flake template
|
|
if [ -d "$src/flake/default-vm" ]; then
|
|
mkdir -p $out/share/qvm
|
|
cp -r $src/flake/default-vm $out/share/qvm/default-vm
|
|
fi
|
|
|
|
# Wrap binary with PATH containing required dependencies
|
|
wrapProgram $out/bin/qvm \
|
|
--prefix PATH : ${
|
|
pkgs.lib.makeBinPath [
|
|
pkgs.qemu
|
|
pkgs.openssh
|
|
pkgs.jq
|
|
pkgs.nix
|
|
pkgs.netcat-gnu
|
|
pkgs.sshpass
|
|
]
|
|
}
|
|
'';
|
|
|
|
meta = with pkgs.lib; {
|
|
description = "Quick development VMs for AI-assisted workflows";
|
|
homepage = "https://github.com/josh/qvm";
|
|
license = licenses.mit;
|
|
maintainers = [ ];
|
|
platforms = platforms.linux;
|
|
mainProgram = "qvm";
|
|
};
|
|
};
|
|
|
|
in
|
|
{
|
|
packages = {
|
|
inherit qvm;
|
|
default = qvm;
|
|
};
|
|
|
|
apps = {
|
|
qvm = {
|
|
type = "app";
|
|
program = "${qvm}/bin/qvm";
|
|
};
|
|
default = {
|
|
type = "app";
|
|
program = "${qvm}/bin/qvm";
|
|
};
|
|
};
|
|
|
|
devShells.default = pkgs.mkShell {
|
|
buildInputs = with pkgs; [
|
|
# Runtime dependencies for development
|
|
qemu
|
|
openssh
|
|
jq
|
|
nix
|
|
netcat-gnu
|
|
sshpass
|
|
|
|
# Development tools
|
|
go
|
|
gopls
|
|
gotools
|
|
];
|
|
|
|
shellHook = ''
|
|
echo "QVM development environment (Go)"
|
|
echo "Build: go build ./cmd/qvm"
|
|
echo "Run: ./qvm status"
|
|
'';
|
|
};
|
|
}
|
|
);
|
|
}
|