Brings the public tree back in line with the development repo after several weeks of drift caused by a stale publish include list. New: - In-app update path: GET /update/check compares the checkout against origin/main and POST /update/apply runs `ncp upgrade` detached (pull, rebuild, restart). The sidebar shows the version, checks on click, and offers an "update available" pill. - Projects: a project workspace groups chats and RAG documents, with per-project instructions and document retrieval scoped to the active project. Replaces the standalone Documents page. - modules/: auto-discovered feature plugins (mail, network) with their frontend counterparts and tests. - Memory curation runs in-process (synapse/memory/curator.py) on the chat model when a conversation goes idle. The separate memory service on :8001 is gone, along with the launcher lines that started it. Also: the KDE theme, panel and Promethean terminal assets, the full test suite, and VERSION 1.2.0. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
75 lines
3.9 KiB
Bash
75 lines
3.9 KiB
Bash
#!/bin/bash
|
|
|
|
# The Linux-only half of a backup: snapshot the LIVE desktop wiring into the repo
|
|
# (reference copy for recovery/diffing; assets/themes/install-theme.sh remains the
|
|
# applier on restore) and copy the Claude memory notes in so git commits their
|
|
# content. None of it exists on Windows, which is why it isn't in bin/sync.py.
|
|
#
|
|
# Not meant to be run by hand — it's the `--full` stage of:
|
|
# python bin/sync.py backup --full (or `ncp backup -f`)
|
|
|
|
# Set by bin/sync.py to the repo it was invoked from, so a clone in a scratch dir
|
|
# operates on itself instead of reaching into the real ~/nexus-core.
|
|
NEXUS_ROOT="${NEXUS_ROOT:-$HOME/nexus-core}"
|
|
cd "$NEXUS_ROOT" || { echo "No $NEXUS_ROOT"; exit 1; }
|
|
|
|
snap="$NEXUS_ROOT/assets/themes/restore-snapshot"
|
|
mkdir -p "$snap"
|
|
{
|
|
# No timestamp here — git records commit time, and a date line makes every
|
|
# `backup full` dirty this file and commit even when nothing changed.
|
|
echo "# NexusOS live desktop wiring — reference snapshot"
|
|
echo "# Reference only. Restore is done by assets/themes/install-theme.sh"
|
|
for p in /Net/ThemeName /Net/IconThemeName /Gtk/CursorThemeName \
|
|
/Gtk/CursorThemeSize /Gtk/FontName; do
|
|
echo "xsettings $p = $(xfconf-query -c xsettings -p "$p" 2>/dev/null)"
|
|
done
|
|
echo "xfwm4 /general/theme = $(xfconf-query -c xfwm4 -p /general/theme 2>/dev/null)"
|
|
} > "$snap/xfconf.txt" 2>/dev/null || true
|
|
cp -f "$HOME/.config/gtk-3.0/settings.ini" "$snap/gtk-3.0-settings.ini" 2>/dev/null || true
|
|
cp -f "$HOME/.config/gtk-4.0/settings.ini" "$snap/gtk-4.0-settings.ini" 2>/dev/null || true
|
|
cp -f "$HOME/.config/xfce4/panel/genmon-13.rc" \
|
|
"$NEXUS_ROOT/management/panel/genmon-13.rc" 2>/dev/null || true
|
|
|
|
# The xfconf channel XMLs ARE the desktop: panel layout/size/colour, the
|
|
# wallpaper, compositing + keybindings, terminal profile. Copying the files
|
|
# is the whole restore — no per-property xfconf-query scripting needed.
|
|
# displays.xml is deliberately excluded (monitor-specific; would break another box).
|
|
xml_src="$HOME/.config/xfce4/xfconf/xfce-perchannel-xml"
|
|
mkdir -p "$snap/xfconf-xml"
|
|
for c in xfce4-panel xfce4-desktop xfwm4 xsettings xfce4-keyboard-shortcuts xfce4-terminal; do
|
|
cp -f "$xml_src/$c.xml" "$snap/xfconf-xml/$c.xml" 2>/dev/null || true
|
|
done
|
|
|
|
# Multi-monitor primary-follow watcher lives in ~/.local/bin, not the repo.
|
|
cp -f "$HOME/.local/bin/plank-primary-watch.sh" \
|
|
"$NEXUS_ROOT/bin/panel/plank-primary-watch.sh" 2>/dev/null || true
|
|
# Trailing /. copies the CONTENTS — plain `cp -r src dst` nests into dst/src
|
|
# once dst exists, burying the dock one level deeper on every backup.
|
|
rm -rf "$snap/plank"
|
|
if [ -d "$HOME/.config/plank" ]; then
|
|
mkdir -p "$snap/plank"
|
|
cp -rf "$HOME/.config/plank/." "$snap/plank/" 2>/dev/null || true
|
|
fi
|
|
# The .dockitem files alone are NOT the dock. Everything else — item list, theme,
|
|
# icon size, position, hide mode — lives in dconf, and on startup Plank DELETES
|
|
# every .dockitem not in its list, so copying files alone restores nothing.
|
|
# `monitor` is stripped: it's per-machine, and plank-primary-watch.sh sets it.
|
|
dconf dump /net/launchpad/plank/ 2>/dev/null | grep -v '^monitor=' > "$snap/plank-dconf.ini" || true
|
|
# Dock launchers point at .desktop files in ~/.local/share/applications, which
|
|
# is outside the repo — Plank prunes any item whose target is missing.
|
|
mkdir -p "$snap/applications"
|
|
for d in $(sed -n 's#.*applications/\([^.]*\.desktop\).*#\1#p' \
|
|
"$snap"/plank/dock1/launchers/*.dockitem 2>/dev/null); do
|
|
cp -f "$HOME/.local/share/applications/$d" "$snap/applications/$d" 2>/dev/null || true
|
|
done
|
|
|
|
# Copy the Claude memory notes (machine knowledge under ~/.claude) into the
|
|
# repo so they're versioned too. Some aren't Nexus-specific (Fusion 360, etc.).
|
|
notes_src="$HOME/.claude/projects/-home-jon-nexus-core/memory"
|
|
notes_dst="$NEXUS_ROOT/assets/notes"
|
|
mkdir -p "$notes_dst"
|
|
cp -f "$notes_src"/*.md "$notes_dst/" 2>/dev/null || true
|
|
|
|
echo "Snapshotted desktop wiring + Claude notes."
|