quickshell: run as qs -c souveraine + dock/shell/apps method surfaces
Own config name composed by deploy.sh from our files + pristine-ii dir borrows; ii tree stays untouched. One SouveraineFamily, two modes gated on souveraine.phone. Three guarded IPC surfaces for the agent (via Souveraine's harness, not a new integration): dock.manifest/pin/unpin/restack, shell.surfaces/state (layer registry, live-derived), apps.list/get/find/categories (.desktop scan). Refusals are result shapes, not errors. Settings app split into per-domain pages (Device/Lock/Dock/Pill/Keyboard). Config backports (background.widgets, claudeUsage, fileSearch) kill the laptop TypeErrors.
This commit is contained in:
parent
72f5169458
commit
c78c5510af
29 changed files with 2362 additions and 101 deletions
|
|
@ -1,53 +1,76 @@
|
|||
#!/usr/bin/env bash
|
||||
# Deploy the Souveraine quickshell surface over illogical-impulse.
|
||||
# Overlay pattern: full replacement files, SYMLINKED so this repo checkout
|
||||
# stays the source of truth — a "live edit" in ~/.config is an edit to the
|
||||
# repo tree, visible in git status. Idempotent; -u restores upstream.
|
||||
# Compose the Souveraine quickshell config (`qs -c souveraine`).
|
||||
#
|
||||
# deploy.sh symlink the surface into this machine's ii config
|
||||
# deploy.sh -u restore upstream files, remove our additions
|
||||
# Model: ~/.config/quickshell/souveraine is BUILT by this script —
|
||||
# - our files (this repo) are symlinked in, repo stays source of truth
|
||||
# - untouched upstream directories are borrowed as whole-dir symlinks
|
||||
# into the pristine ii tree (so upstream updates flow through)
|
||||
# - directories where we override any file are composed file-by-file
|
||||
# ii's own tree is left pristine: no overlay symlinks, no .upstream backups.
|
||||
# Cutting the cord from ii later = vendor a borrowed dir, per directory.
|
||||
#
|
||||
# deploy.sh compose ~/.config/quickshell/souveraine
|
||||
# deploy.sh -u remove the souveraine config dir (ii untouched)
|
||||
# deploy.sh --legacy-clean remove the OLD overlay symlinks from ii and
|
||||
# restore its .upstream backups (one-time migration)
|
||||
# deploy.sh --phone rsync this surface to the phone and deploy there
|
||||
# (tree lands in ~/souveraine-surfaces/quickshell)
|
||||
set -euo pipefail
|
||||
|
||||
SRC="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
QS="${HOME}/.config/quickshell"
|
||||
II="${QS}/ii"
|
||||
SV="${QS}/souveraine"
|
||||
|
||||
# Manifest: "<repo-relative> <target-relative-to-~/.config/quickshell>"
|
||||
# Files replacing an upstream ii file get a one-time .upstream backup;
|
||||
# files with no upstream counterpart (new components) are just linked.
|
||||
MANIFEST="
|
||||
GlobalStates.qml ii/GlobalStates.qml
|
||||
services/Souveraine.qml ii/services/Souveraine.qml
|
||||
services/Ai.qml ii/services/Ai.qml
|
||||
services/TaskbarApps.qml ii/services/TaskbarApps.qml
|
||||
services/GlobalFocusGrab.qml ii/services/GlobalFocusGrab.qml
|
||||
services/Idle.qml ii/services/Idle.qml
|
||||
services/ConflictKiller.qml ii/services/ConflictKiller.qml
|
||||
modules/ii/sidebarLeft/SidebarLeft.qml ii/modules/ii/sidebarLeft/SidebarLeft.qml
|
||||
modules/ii/sidebarLeft/AiChat.qml ii/modules/ii/sidebarLeft/AiChat.qml
|
||||
modules/ii/sidebarRight/SidebarRight.qml ii/modules/ii/sidebarRight/SidebarRight.qml
|
||||
modules/common/Config.qml ii/modules/common/Config.qml
|
||||
modules/ii/dock/Dock.qml ii/modules/ii/dock/Dock.qml
|
||||
modules/ii/dock/DockApps.qml ii/modules/ii/dock/DockApps.qml
|
||||
modules/ii/dock/DockAppButton.qml ii/modules/ii/dock/DockAppButton.qml
|
||||
modules/ii/dock/DockButton.qml ii/modules/ii/dock/DockButton.qml
|
||||
modules/ii/dock/DockSeparator.qml ii/modules/ii/dock/DockSeparator.qml
|
||||
modules/ii/dock/DockStack.qml ii/modules/ii/dock/DockStack.qml
|
||||
modules/ii/overview/Overview.qml ii/modules/ii/overview/Overview.qml
|
||||
modules/common/Persistent.qml ii/modules/common/Persistent.qml
|
||||
modules/common/panels/lock/LockScreen.qml ii/modules/common/panels/lock/LockScreen.qml
|
||||
modules/ii/lock/Lock.qml ii/modules/ii/lock/Lock.qml
|
||||
modules/ii/lock/TouchLockSurface.qml ii/modules/ii/lock/TouchLockSurface.qml
|
||||
shell.qml souveraine/shell.qml
|
||||
GlobalStates.qml souveraine/GlobalStates.qml
|
||||
settings-phone.qml souveraine/settings-phone.qml
|
||||
panelFamilies/SouveraineFamily.qml souveraine/panelFamilies/SouveraineFamily.qml
|
||||
services/Souveraine.qml souveraine/services/Souveraine.qml
|
||||
services/Ai.qml souveraine/services/Ai.qml
|
||||
services/TaskbarApps.qml souveraine/services/TaskbarApps.qml
|
||||
services/GlobalFocusGrab.qml souveraine/services/GlobalFocusGrab.qml
|
||||
services/Idle.qml souveraine/services/Idle.qml
|
||||
services/ConflictKiller.qml souveraine/services/ConflictKiller.qml
|
||||
modules/ii/sidebarLeft/SidebarLeft.qml souveraine/modules/ii/sidebarLeft/SidebarLeft.qml
|
||||
modules/ii/sidebarLeft/AiChat.qml souveraine/modules/ii/sidebarLeft/AiChat.qml
|
||||
modules/ii/sidebarRight/SidebarRight.qml souveraine/modules/ii/sidebarRight/SidebarRight.qml
|
||||
modules/common/Config.qml souveraine/modules/common/Config.qml
|
||||
modules/common/ShellModel.qml souveraine/modules/common/ShellModel.qml
|
||||
modules/common/widgets/ContentPage.qml souveraine/modules/common/widgets/ContentPage.qml
|
||||
modules/common/widgets/StyledToolTip.qml souveraine/modules/common/widgets/StyledToolTip.qml
|
||||
modules/settings/DeviceConfig.qml souveraine/modules/settings/DeviceConfig.qml
|
||||
modules/settings/LockConfig.qml souveraine/modules/settings/LockConfig.qml
|
||||
modules/settings/DockConfig.qml souveraine/modules/settings/DockConfig.qml
|
||||
modules/settings/PillConfig.qml souveraine/modules/settings/PillConfig.qml
|
||||
modules/settings/KeyboardConfig.qml souveraine/modules/settings/KeyboardConfig.qml
|
||||
modules/ii/polkit/Polkit.qml souveraine/modules/ii/polkit/Polkit.qml
|
||||
modules/ii/dock/Dock.qml souveraine/modules/ii/dock/Dock.qml
|
||||
modules/ii/dock/DockManifest.qml souveraine/modules/ii/dock/DockManifest.qml
|
||||
modules/ii/dock/DockApps.qml souveraine/modules/ii/dock/DockApps.qml
|
||||
modules/ii/dock/DockAppButton.qml souveraine/modules/ii/dock/DockAppButton.qml
|
||||
modules/ii/dock/DockButton.qml souveraine/modules/ii/dock/DockButton.qml
|
||||
modules/ii/dock/DockSeparator.qml souveraine/modules/ii/dock/DockSeparator.qml
|
||||
modules/ii/dock/DockStack.qml souveraine/modules/ii/dock/DockStack.qml
|
||||
modules/ii/appInventory/AppInventory.qml souveraine/modules/ii/appInventory/AppInventory.qml
|
||||
modules/ii/appInventory/AppInventoryScope.qml souveraine/modules/ii/appInventory/AppInventoryScope.qml
|
||||
modules/ii/overview/Overview.qml souveraine/modules/ii/overview/Overview.qml
|
||||
modules/ii/onScreenKeyboard/OnScreenKeyboard.qml souveraine/modules/ii/onScreenKeyboard/OnScreenKeyboard.qml
|
||||
modules/common/Persistent.qml souveraine/modules/common/Persistent.qml
|
||||
modules/common/panels/lock/LockScreen.qml souveraine/modules/common/panels/lock/LockScreen.qml
|
||||
modules/ii/lock/Lock.qml souveraine/modules/ii/lock/Lock.qml
|
||||
modules/ii/lock/TouchLockSurface.qml souveraine/modules/ii/lock/TouchLockSurface.qml
|
||||
pill/shell.qml pill/shell.qml
|
||||
"
|
||||
|
||||
PHONE_USB=casey@172.16.42.1
|
||||
PHONE_DEST="souveraine-surfaces/quickshell"
|
||||
|
||||
manifest_lines() { printf '%s\n' "$MANIFEST" | sed '/^[[:space:]]*$/d'; }
|
||||
|
||||
if [[ "${1:-}" == "--manifest" ]]; then
|
||||
printf '%s\n' "$MANIFEST" | sed '/^[[:space:]]*$/d'
|
||||
manifest_lines
|
||||
exit 0
|
||||
fi
|
||||
|
||||
|
|
@ -56,38 +79,90 @@ if [[ "${1:-}" == "--phone" ]]; then
|
|||
"${ssh_i[@]}" "$PHONE_USB" "mkdir -p ~/$PHONE_DEST"
|
||||
rsync -a --delete -e "ssh -i $HOME/.ssh/ani" "$SRC/" "$PHONE_USB:$PHONE_DEST/"
|
||||
"${ssh_i[@]}" "$PHONE_USB" "bash ~/$PHONE_DEST/deploy.sh"
|
||||
echo "Deployed to phone. Quickshell hot-reloads; if the dock misbehaves: pkill -f 'qs -c ii' (autostart relaunches)."
|
||||
# Phone-only: install the mobile settings launcher into the app grid.
|
||||
"${ssh_i[@]}" "$PHONE_USB" "mkdir -p ~/.local/share/applications && ln -sf ~/$PHONE_DEST/souveraine-settings.desktop ~/.local/share/applications/souveraine-settings.desktop"
|
||||
echo "Deployed to phone. If qsConfig is still 'ii' there, flip it:"
|
||||
echo " ssh: sed -i 's/hl.env(\"qsConfig\", \"ii\")/hl.env(\"qsConfig\", \"souveraine\")/' ~/.config/hypr/hyprland/variables.lua"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [[ "${1:-}" == "-u" || "${1:-}" == "--uninstall" ]]; then
|
||||
while read -r rel target; do
|
||||
[[ -z "$rel" ]] && continue
|
||||
t="$QS/$target"
|
||||
if [[ -f "$t.upstream" ]]; then
|
||||
rm -f "$t"; mv "$t.upstream" "$t"
|
||||
echo "restored $target"
|
||||
elif [[ -L "$t" ]]; then
|
||||
rm -f "$t"
|
||||
echo "removed $target (no upstream)"
|
||||
fi
|
||||
done <<< "$MANIFEST"
|
||||
rm -rf "$SV"
|
||||
echo "removed $SV (ii tree untouched)"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [[ "${1:-}" == "--legacy-clean" ]]; then
|
||||
# One-time migration: strip the old overlay out of ii.
|
||||
# 1. remove any symlink in ii that points into a souveraine checkout
|
||||
find "$II" -type l | while read -r l; do
|
||||
case "$(readlink "$l")" in
|
||||
*souveraine*) rm -f "$l"; echo "unlinked ${l#$QS/}" ;;
|
||||
esac
|
||||
done
|
||||
# 2. restore upstream backups
|
||||
find "$II" -name '*.upstream' | while read -r u; do
|
||||
mv -f "$u" "${u%.upstream}"
|
||||
echo "restored ${u%.upstream}"
|
||||
done
|
||||
exit 0
|
||||
fi
|
||||
|
||||
[[ -d "$II" ]] || { echo "illogical-impulse config not found at $II" >&2; exit 1; }
|
||||
mkdir -p "$QS/pill"
|
||||
|
||||
# --- Compose -------------------------------------------------------------
|
||||
# Targets under souveraine/, relative to $SV
|
||||
SV_TARGETS="$(manifest_lines | awk '$2 ~ /^souveraine\// {sub(/^souveraine\//, "", $2); print $2}')"
|
||||
|
||||
is_replaced() { # exact file override
|
||||
grep -qxF "$1" <<< "$SV_TARGETS"
|
||||
}
|
||||
is_touched() { # dir contains an override somewhere below
|
||||
grep -q "^$1/" <<< "$SV_TARGETS"
|
||||
}
|
||||
|
||||
compose_dir() { # $1 = path relative to ii root ("" for root)
|
||||
local rel="$1" entry name erel
|
||||
mkdir -p "$SV${rel:+/$rel}"
|
||||
for entry in "$II${rel:+/$rel}"/*; do
|
||||
[[ -e "$entry" ]] || continue
|
||||
name="$(basename "$entry")"
|
||||
[[ "$name" == *.upstream ]] && continue
|
||||
erel="${rel:+$rel/}$name"
|
||||
if [[ -d "$entry" ]]; then
|
||||
if is_touched "$erel"; then
|
||||
compose_dir "$erel"
|
||||
else
|
||||
ln -sfn "$II/$erel" "$SV/$erel"
|
||||
fi
|
||||
else
|
||||
# root files and files inside touched dirs: link individually,
|
||||
# skipping ones our manifest replaces
|
||||
is_replaced "$erel" && continue
|
||||
ln -sf "$II/$erel" "$SV/$erel"
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
# Rebuild from scratch each run: cheap, and guarantees no stale links.
|
||||
rm -rf "$SV"
|
||||
compose_dir ""
|
||||
|
||||
# Our files on top (this also creates dirs that exist only in our tree,
|
||||
# e.g. brand-new settings pages)
|
||||
mkdir -p "$QS/pill"
|
||||
while read -r rel target; do
|
||||
[[ -z "$rel" ]] && continue
|
||||
src="$SRC/$rel"; t="$QS/$target"
|
||||
[[ -f "$src" ]] || { echo "missing $src" >&2; exit 1; }
|
||||
# Back up upstream once (a real file, not our own symlink)
|
||||
if [[ -f "$t" && ! -L "$t" && ! -f "$t.upstream" ]]; then
|
||||
cp "$t" "$t.upstream"
|
||||
fi
|
||||
mkdir -p "$(dirname "$t")"
|
||||
ln -sf "$src" "$t"
|
||||
done <<< "$MANIFEST"
|
||||
done < <(manifest_lines)
|
||||
|
||||
echo "Souveraine quickshell surface deployed ($(echo "$MANIFEST" | grep -c .) files symlinked from $SRC)"
|
||||
echo "Quickshell hot-reloads on change; restart with: pkill -f 'qs -c ii' && pkill -f 'qs -c pill'"
|
||||
n_ours=$(manifest_lines | grep -c .)
|
||||
n_borrowed_dirs=$(find "$SV" -maxdepth 3 -type l -xtype d | wc -l)
|
||||
echo "souveraine config composed at $SV ($n_ours files ours, $n_borrowed_dirs dirs borrowed from ii)"
|
||||
if grep -q 'qsConfig", "ii"' "$HOME/.config/hypr/hyprland/variables.lua" 2>/dev/null; then
|
||||
echo "NOTE: hyprland qsConfig is still 'ii' — flip variables.lua to 'souveraine' to switch."
|
||||
fi
|
||||
echo "Run with: qs -c souveraine (restart: pkill -f 'qs -c souveraine')"
|
||||
|
|
|
|||
Loading…
Reference in a new issue