NoSignal-OS/os updates/additions-installer/nosignal-additions
28allday 19fd794b6b NoSignal — fully-offline Arch → Hyprland desktop installer
Single-script builder (nosignal.sh) that turns a stock Arch Linux ISO into a
fully-offline installer for a themed Hyprland + caelestia (Quickshell) desktop:
matching SDDM greeter, Btrfs/Limine bootable snapshots, chwd-style GPU
detection, and a curated "os updates" layer (keybind cheatsheet, settings
panels, system polish, on-box management skill). See README.md.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 11:03:10 +01:00

58 lines
2.3 KiB
Bash
Executable file

#!/bin/sh
# nosignal-additions — backend for Settings → Additions (optional software).
# The manifest (additions.json, next to this component's on-system copy) is
# the single source of truth: id/name/desc/icon per item, a `check` command
# (exit 0 = installed) and an `install` command (run in a visible terminal).
#
# nosignal-additions status rewrite the status cache (JSON)
# nosignal-additions list list manifest items (id<TAB>name)
# nosignal-additions install <id> run the item's installer, then re-status
#
# Sources policy: official pacman repos or official upstream installers/git
# only — no AUR, no Flatpak.
set -eu
SHARE="$HOME/.local/share/nosignal/additions-installer"
MANIFEST="${NOSIGNAL_ADDITIONS_MANIFEST:-$SHARE/additions.json}"
STATE_DIR="${XDG_STATE_HOME:-$HOME/.local/state}/nosignal"
STATE="$STATE_DIR/additions-status.json"
[ -f "$MANIFEST" ] || { echo "nosignal-additions: manifest not found: $MANIFEST" >&2; exit 1; }
status() {
mkdir -p "$STATE_DIR"
{
printf '{"checked":"%s","items":[' "$(date -Iseconds)"
sep=""
jq -c '.items[]' "$MANIFEST" | while IFS= read -r item; do
check=$(printf '%s' "$item" | jq -r '.check')
if sh -c "$check" >/dev/null 2>&1; then inst=true; else inst=false; fi
printf '%s' "$sep"
printf '%s' "$item" | jq -c --argjson inst "$inst" 'del(.check, .install) + {installed: $inst}'
sep=","
done
printf ']}\n'
} > "$STATE.tmp"
jq -e . "$STATE.tmp" >/dev/null # never replace the cache with broken JSON
mv "$STATE.tmp" "$STATE"
}
install_one() {
id="$1"
item=$(jq -ce --arg id "$id" '.items[] | select(.id == $id)' "$MANIFEST") \
|| { echo "nosignal-additions: unknown addition: $id" >&2; exit 1; }
name=$(printf '%s' "$item" | jq -r '.name')
cmd=$(printf '%s' "$item" | jq -r '.install')
printf '\033[1;34m::\033[0m installing %s\n' "$name"
sh -ec "$cmd"
printf '\033[1;34m::\033[0m %s — installer finished\n' "$name"
status
}
case "${1:-}" in
status) status ;;
list) jq -r '.items[] | "\(.id)\t\(.name)"' "$MANIFEST" ;;
install) [ -n "${2:-}" ] || { echo "usage: nosignal-additions install <id>" >&2; exit 2; }
install_one "$2" ;;
*) echo "usage: nosignal-additions status | list | install <id>" >&2; exit 2 ;;
esac