From b3dd5f285365f59153a8f4549efa0607ccddf19d Mon Sep 17 00:00:00 2001 From: Ben Sima Date: Sat, 15 Nov 2025 10:06:18 -0500 Subject: Fix NixOS integration: separate package building from OS builds Problem: Calling bild.run inside NixOS configs triggered IFD during OS evaluation. ANSI escape codes from bild broke JSON parsing in Nix sandbox, causing build failures. Root cause: bild.run uses IFD (Import From Derivation) which runs bild --plan during Nix evaluation. When this happened inside NixOS service definitions, it ran recursively and bild output ANSI codes that corrupted the JSON analysis output. Solution: Two-phase architecture + NO_COLOR support 1. Biz/Packages.nix: Pre-builds all packages outside NixOS context 2. Biz.nix: Accepts packages as function argument (default: Packages.nix) 3. Omni/Bild.nix: Sets NO_COLOR=1 in analysis derivation 4. Omni/Log/Terminal.hs: Respects NO_COLOR env var 5. Omni/Log/Terminal.hs: Skip getTerminalSize when NO_COLOR set to avoid escape code output 6. Omni/Log/Concurrent.hs: Skip line initialization without ANSI support Now NixOS builds succeed: - Package IFD happens once at top level - No recursive builds during service evaluation - Clean JSON output from bild --plan in Nix sandbox - NixOS configs reference pre-analyzed packages Changes: - Add Biz/Packages.nix - standalone package builder - Update Biz.nix to accept packages argument - Update Biz/Dragons/Analysis.nix to use Packages.nix - Remove Biz/Targets.nix (replaced by Packages.nix) - Add NO_COLOR support throughout logging stack - Fix ANSI.getTerminalSize outputting escape codes when NO_COLOR set Amp-Thread-ID: https://ampcode.com/threads/T-bc0f6fc7-46bf-4aa2-892e-dd62e7251d4b Co-authored-by: Amp --- Biz/Dragons/Analysis.nix | 35 ++++++++++++++++++----------------- Biz/Packages.nix | 15 +++++++++++++++ Biz/Targets.nix | 19 ------------------- 3 files changed, 33 insertions(+), 36 deletions(-) create mode 100644 Biz/Packages.nix delete mode 100644 Biz/Targets.nix (limited to 'Biz') diff --git a/Biz/Dragons/Analysis.nix b/Biz/Dragons/Analysis.nix index de641e8..b0e0cc9 100755 --- a/Biz/Dragons/Analysis.nix +++ b/Biz/Dragons/Analysis.nix @@ -1,18 +1,19 @@ #!/usr/bin/env run.sh -{bild}: let - targets = import ../Targets.nix {inherit bild;}; -in - # Run this like so: - # - # bild Biz/Dragons/Analysis.nix - # docker load < _/nix/Biz/Dragons/Analysis.nix - # docker run --volume $PWD:/src dragons-analyze dragons-analyze /src/.git - bild.image { - name = "dragons-analyze"; - tag = "latest"; - fromImage = null; - fromImageName = null; - fromImageTag = "latest"; - contents = [bild.pkgs.git targets.dragons-analysis]; - config.Cmd = ["/bin/dragons-analyze"]; - } +{ + bild, + packages ? import ../Packages.nix {inherit bild;}, +}: +# Run this like so: +# +# bild Biz/Dragons/Analysis.nix +# docker load < _/nix/Biz/Dragons/Analysis.nix +# docker run --volume $PWD:/src dragons-analyze dragons-analyze /src/.git +bild.image { + name = "dragons-analyze"; + tag = "latest"; + fromImage = null; + fromImageName = null; + fromImageTag = "latest"; + contents = [bild.pkgs.git packages.dragons-analysis]; + config.Cmd = ["/bin/dragons-analyze"]; +} diff --git a/Biz/Packages.nix b/Biz/Packages.nix new file mode 100644 index 0000000..6b17fe5 --- /dev/null +++ b/Biz/Packages.nix @@ -0,0 +1,15 @@ +# Build all Biz packages independently, outside NixOS context. +# +# This file builds all Biz packages and returns them as an attribute set. +# The NixOS config (Biz.nix) will accept these as inputs rather than +# building them during OS evaluation. +# +# Usage: +# nix-build Biz/Packages.nix # builds all packages +# nix-build Biz/Packages.nix -A storybook # builds one package +{bild ? import ../Omni/Bild.nix {}}: { + storybook = bild.run ../Biz/Storybook.py; + podcastitlater-web = bild.run ../Biz/PodcastItLater/Web.py; + podcastitlater-worker = bild.run ../Biz/PodcastItLater/Worker.py; + dragons-analysis = bild.run ../Biz/Dragons/Analysis.hs; +} diff --git a/Biz/Targets.nix b/Biz/Targets.nix deleted file mode 100644 index 77e462c..0000000 --- a/Biz/Targets.nix +++ /dev/null @@ -1,19 +0,0 @@ -# Pre-declared build targets for the Biz namespace. -# -# This file exposes all buildable Biz targets as an attribute set, allowing -# NixOS configs to reference them directly without triggering recursive builds. -# -# To add a new target: -# 1. Add the attribute here pointing to bild.run ./path/to/target -# 2. Reference it in Biz.nix or other configs as targets. -{bild}: { - # Web services - storybook = bild.run ./Storybook.py; - podcastitlater-web = bild.run ./PodcastItLater/Web.py; - podcastitlater-worker = bild.run ./PodcastItLater/Worker.py; - - # CLI tools and analysis - dragons-analysis = bild.run ./Dragons/Analysis.hs; - - # Add new Biz targets here as they are created -} -- cgit v1.2.3