feat: custom package derivations — forgejo-mcp, plymouth-theme, try-cli, scripts

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Padreug 2026-06-28 06:48:37 +02:00
commit c8c89a19cf
4 changed files with 957 additions and 0 deletions

549
packages/scripts.nix Normal file
View file

@ -0,0 +1,549 @@
{ pkgs, lib, ... }:
# Omnixient utility scripts as a Nix package
pkgs.stdenv.mkDerivation rec {
pname = "omni-scripts";
version = "1.0.0";
# No source needed for script-only package
dontUnpack = true;
buildInputs = with pkgs; [
bash
coreutils
gnugrep
gnused
gawk
jq
curl
wget
git
fzf
ripgrep
];
installPhase = ''
mkdir -p $out/bin
# Theme management
cat > $out/bin/omni-theme-set << 'EOF'
#!/usr/bin/env bash
set -e
THEME="$1"
AVAILABLE_THEMES="tokyo-night catppuccin gruvbox nord everforest rose-pine kanagawa catppuccin-latte matte-black osaka-jade ristretto"
if [ -z "$THEME" ]; then
if [[ "''${OMNI_QUIET:-}" == "1" ]]; then
exit 1
fi
echo "Usage: omni theme set <theme>" >&2
echo "Available themes: $AVAILABLE_THEMES" >&2
exit 1
fi
if ! echo "$AVAILABLE_THEMES" | grep -qw "$THEME"; then
if [[ "''${OMNI_QUIET:-}" == "1" ]]; then
exit 1
fi
echo "Error: Unknown theme '$THEME'" >&2
echo "Available themes: $AVAILABLE_THEMES" >&2
exit 1
fi
# Update configuration
sudo sed -i "s/currentTheme = \".*\"/currentTheme = \"$THEME\"/" /etc/nixos/configuration.nix
if [[ "''${OMNI_QUIET:-}" != "1" ]]; then
echo "Switching to theme: $THEME"
fi
# Rebuild system
if [[ "''${OMNI_QUIET:-}" == "1" ]]; then
sudo nixos-rebuild switch --flake /etc/nixos#omni >/dev/null 2>&1
else
sudo nixos-rebuild switch --flake /etc/nixos#omni
echo "Theme switched to $THEME successfully!"
fi
EOF
chmod +x $out/bin/omni-theme-set
cat > $out/bin/omni-theme-list << 'EOF'
#!/usr/bin/env bash
THEMES="tokyo-night catppuccin gruvbox nord everforest rose-pine kanagawa catppuccin-latte matte-black osaka-jade ristretto"
if [[ "''${OMNI_QUIET:-}" == "1" ]]; then
echo "$THEMES" | tr ' ' '\n'
exit 0
fi
if [[ "''${OMNI_JSON:-}" == "1" ]]; then
current=$(grep currentTheme /etc/nixos/configuration.nix 2>/dev/null | cut -d'"' -f2 || echo "tokyo-night")
echo '{'
echo ' "available": ["'$(echo "$THEMES" | sed 's/ /", "/g')'"],'
echo ' "current": "'$current'"'
echo '}'
exit 0
fi
echo "Available Omnixient themes:"
echo "========================"
echo " tokyo-night (default)"
echo " catppuccin"
echo " gruvbox"
echo " nord"
echo " everforest"
echo " rose-pine"
echo " kanagawa"
echo " catppuccin-latte"
echo " matte-black"
echo " osaka-jade"
echo " ristretto"
echo ""
echo "Current theme: $(grep currentTheme /etc/nixos/configuration.nix 2>/dev/null | cut -d'"' -f2 || echo "tokyo-night")"
echo ""
echo "To change theme, run: omni theme set <theme-name>"
EOF
chmod +x $out/bin/omni-theme-list
# Get current theme command
cat > $out/bin/omni-theme-get << 'EOF'
#!/usr/bin/env bash
current=$(grep currentTheme /etc/nixos/configuration.nix 2>/dev/null | cut -d'"' -f2 || echo "tokyo-night")
if [[ "''${OMNI_JSON:-}" == "1" ]]; then
echo '{"current": "'$current'"}'
else
echo "$current"
fi
EOF
chmod +x $out/bin/omni-theme-get
# System management
cat > $out/bin/omni-update << 'EOF'
#!/usr/bin/env bash
set -e
if [[ "''${OMNI_QUIET:-}" != "1" ]]; then
echo "🔄 Updating Omnixient system..."
echo ""
fi
# Update flake inputs
if [[ "''${OMNI_QUIET:-}" != "1" ]]; then
echo "📦 Updating flake inputs..."
fi
cd /etc/nixos
if [[ "''${OMNI_QUIET:-}" == "1" ]]; then
sudo nix flake update >/dev/null 2>&1
else
sudo nix flake update
fi
# Show what changed
if [[ "''${OMNI_QUIET:-}" != "1" ]]; then
echo ""
echo "📊 Changes:"
git diff flake.lock | grep -E "^\+" | head -20
fi
# Rebuild system
if [[ "''${OMNI_QUIET:-}" != "1" ]]; then
echo ""
echo "🏗 Rebuilding system..."
fi
if [[ "''${OMNI_QUIET:-}" == "1" ]]; then
sudo nixos-rebuild switch --flake .#omni >/dev/null 2>&1
else
sudo nixos-rebuild switch --flake .#omni
echo ""
echo " System updated successfully!"
fi
EOF
chmod +x $out/bin/omni-update
cat > $out/bin/omni-clean << 'EOF'
#!/usr/bin/env bash
set -e
if [[ "''${OMNI_QUIET:-}" != "1" ]]; then
echo "🧹 Cleaning Omnixient system..."
echo ""
# Show current store size
echo "Current store size:"
du -sh /nix/store 2>/dev/null || echo "Unable to calculate"
echo ""
fi
# Run garbage collection
if [[ "''${OMNI_QUIET:-}" != "1" ]]; then
echo "Running garbage collection..."
fi
if [[ "''${OMNI_QUIET:-}" == "1" ]]; then
sudo nix-collect-garbage -d >/dev/null 2>&1
else
sudo nix-collect-garbage -d
fi
# Optimize store
if [[ "''${OMNI_QUIET:-}" != "1" ]]; then
echo "Optimizing Nix store..."
fi
if [[ "''${OMNI_QUIET:-}" == "1" ]]; then
sudo nix-store --optimise >/dev/null 2>&1
else
sudo nix-store --optimise
fi
if [[ "''${OMNI_QUIET:-}" != "1" ]]; then
# Show new size
echo ""
echo "New store size:"
du -sh /nix/store 2>/dev/null || echo "Unable to calculate"
echo ""
echo " Cleanup complete!"
fi
EOF
chmod +x $out/bin/omni-clean
# Package management
cat > $out/bin/omni-search << 'EOF'
#!/usr/bin/env bash
QUERY="$1"
if [ -z "$QUERY" ]; then
echo "Usage: omni-search <package-name>"
exit 1
fi
echo "Searching for '$QUERY'..."
nix search nixpkgs "$QUERY" 2>/dev/null | head -50
EOF
chmod +x $out/bin/omni-search
cat > $out/bin/omni-install << 'EOF'
#!/usr/bin/env bash
set -e
PACKAGES="$*"
if [ -z "$PACKAGES" ]; then
echo "Usage: omni-install <package-name> [package-name...]"
exit 1
fi
echo "📦 Installing packages: $PACKAGES"
echo ""
# Add packages to configuration
CONFIG="/etc/nixos/configuration.nix"
for PKG in $PACKAGES; do
echo "Adding $PKG to configuration..."
# This would need more sophisticated editing
echo "Package $PKG needs to be manually added to $CONFIG"
done
echo ""
echo "Please edit $CONFIG and add the packages to environment.systemPackages"
echo "Then run: omni-rebuild"
EOF
chmod +x $out/bin/omni-install
# Development helpers
cat > $out/bin/omni-dev-shell << 'EOF'
#!/usr/bin/env bash
LANG="$1"
case "$LANG" in
rust)
echo "Starting Rust development shell..."
nix-shell -p rustc cargo rust-analyzer rustfmt clippy
;;
go)
echo "Starting Go development shell..."
nix-shell -p go gopls gotools golangci-lint
;;
python)
echo "Starting Python development shell..."
nix-shell -p python3 python3Packages.pip python3Packages.virtualenv python3Packages.ipython
;;
node|js)
echo "Starting Node.js development shell..."
nix-shell -p nodejs pnpm typescript
;;
c|cpp)
echo "Starting C/C++ development shell..."
nix-shell -p gcc cmake gnumake gdb clang-tools
;;
*)
echo "Usage: omni-dev-shell <language>"
echo "Supported languages: rust, go, python, node/js, c/cpp"
exit 1
;;
esac
EOF
chmod +x $out/bin/omni-dev-shell
# Screenshot utility
cat > $out/bin/omni-screenshot << 'EOF'
#!/usr/bin/env bash
MODE="''${1:-region}"
OUTPUT_DIR="$HOME/Pictures/Screenshots"
mkdir -p "$OUTPUT_DIR"
FILENAME="$OUTPUT_DIR/screenshot-$(date +%Y%m%d-%H%M%S).png"
case "$MODE" in
region|area)
grim -g "$(slurp)" "$FILENAME"
;;
full|screen)
grim "$FILENAME"
;;
window)
grim -g "$(hyprctl activewindow -j | jq -r '"\(.at[0]),\(.at[1]) \(.size[0])x\(.size[1])"')" "$FILENAME"
;;
*)
echo "Usage: omni-screenshot [region|full|window]"
exit 1
;;
esac
if [ -f "$FILENAME" ]; then
wl-copy < "$FILENAME"
notify-send "Screenshot saved" "$FILENAME" -i "$FILENAME"
echo "$FILENAME"
fi
EOF
chmod +x $out/bin/omni-screenshot
# System info
cat > $out/bin/omni-info << 'EOF'
#!/usr/bin/env bash
# Gather data once
VERSION=$(nixos-version)
KERNEL=$(uname -r)
THEME=$(grep currentTheme /etc/nixos/configuration.nix 2>/dev/null | cut -d'"' -f2 || echo "tokyo-night")
CPU=$(lscpu | grep 'Model name' | cut -d':' -f2 | xargs)
MEMORY=$(free -h | awk '/^Mem:/ {print $2}')
DISK=$(df -h / | awk 'NR==2 {print $2}')
if [[ "''${OMNI_JSON:-}" == "1" ]]; then
echo "{"
echo " \"system\": {"
echo " \"version\": \"$VERSION\","
echo " \"kernel\": \"$KERNEL\","
echo " \"theme\": \"$THEME\","
echo " \"user\": \"$USER\","
echo " \"shell\": \"$SHELL\","
echo " \"terminal\": \"$TERM\""
echo " },"
echo " \"hardware\": {"
echo " \"cpu\": \"$CPU\","
echo " \"memory\": \"$MEMORY\","
echo " \"disk\": \"$DISK\""
echo " }"
echo "}"
exit 0
fi
if [[ "''${OMNI_QUIET:-}" == "1" ]]; then
echo "version=$VERSION"
echo "kernel=$KERNEL"
echo "theme=$THEME"
echo "user=$USER"
echo "shell=$SHELL"
echo "terminal=$TERM"
echo "cpu=$CPU"
echo "memory=$MEMORY"
echo "disk=$DISK"
exit 0
fi
echo ""
echo " OMNI NIXOS "
echo ""
echo ""
echo "System Information:"
echo "==================="
echo "Version: $VERSION"
echo "Kernel: $KERNEL"
echo "Theme: $THEME"
echo "User: $USER"
echo "Shell: $SHELL"
echo "Terminal: $TERM"
echo ""
echo "Hardware:"
echo "========="
echo "CPU: $CPU"
echo "Memory: $MEMORY"
echo "Disk: $DISK"
echo ""
echo "Quick Commands:"
echo "=============="
echo " omni help - Show help"
echo " omni update - Update system"
echo " omni clean - Clean system"
echo " omni theme - List themes"
EOF
chmod +x $out/bin/omni-info
# Help command
cat > $out/bin/omni-help << 'EOF'
#!/usr/bin/env bash
cat << HELP
Omnixient NixOS - Command Reference
================================
System Management:
------------------
omni-update Update system and flake inputs
omni-clean Clean and optimize Nix store
omni-rebuild Rebuild system configuration
omni-info Show system information
Package Management:
-------------------
omni-search Search for packages
omni-install Install packages (guide)
Theme Management:
-----------------
omni-theme-list List available themes
omni-theme-set Set system theme
Development:
------------
omni-dev-shell Start language-specific shell
dev-postgres Start PostgreSQL container
dev-redis Start Redis container
dev-mysql Start MySQL container
dev-mongodb Start MongoDB container
Utilities:
----------
omni-screenshot Take screenshots
Hyprland Keybindings:
---------------------
Super + Return Open terminal
Super + B Open browser
Super + E Open file manager
Super + D Application launcher
Super + Q Close window
Super + F Fullscreen
Super + Space Toggle floating
Super + 1-9 Switch workspace
Super + Shift + 1-9 Move to workspace
Print Screenshot region
Shift + Print Screenshot full
For more information: https://github.com/TheArctesian/omnixy
HELP
EOF
chmod +x $out/bin/omni-help
# Main omni command
cat > $out/bin/omni << 'EOF'
#!/usr/bin/env bash
# Parse global flags
QUIET=false
JSON=false
while [[ $# -gt 0 ]]; do
case $1 in
--quiet|-q)
QUIET=true
export OMNI_QUIET=1
shift
;;
--json)
JSON=true
export OMNI_JSON=1
shift
;;
*)
break
;;
esac
done
CMD="''${1:-help}"
shift || true
case "$CMD" in
update|upgrade)
omni-update "$@"
;;
clean|gc)
omni-clean "$@"
;;
theme)
case "''${1:-}" in
set)
shift
omni-theme-set "$@"
;;
list|ls)
omni-theme-list "$@"
;;
get|current)
omni-theme-get "$@"
;;
"")
omni-theme-list "$@"
;;
*)
# Legacy: assume it's a theme name
omni-theme-set "$@"
;;
esac
;;
search)
omni-search "$@"
;;
install)
omni-install "$@"
;;
info|status)
omni-info "$@"
;;
help|--help|-h)
omni-help "$@"
;;
*)
if [[ "$QUIET" == "false" ]]; then
echo "Unknown command: $CMD" >&2
echo "Run 'omni help' for available commands" >&2
fi
exit 1
;;
esac
EOF
chmod +x $out/bin/omni
# Create rebuild alias
# nh wraps nixos-rebuild with tree-style build output, package diffs, and
# profile-aware GC. It handles privilege escalation itself, so no `sudo`
# prefix. --hostname pins the nixosConfiguration to "omni" regardless of
# the live machine hostname.
cat > $out/bin/omni-rebuild << 'EOF'
#!/usr/bin/env bash
nh os switch --hostname omni /etc/nixos "$@"
EOF
chmod +x $out/bin/omni-rebuild
'';
meta = with lib; {
description = "Omnixient utility scripts for NixOS";
license = licenses.mit;
platforms = platforms.linux;
};
}