feat: sync with upstream — v1.2.0, in-app updates, Projects, modules

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)
This commit is contained in:
janvanwan
2026-08-25 09:13:55 -05:00
parent fe5d18afa7
commit 42eaed647a
88 changed files with 4280 additions and 1888 deletions
+48 -12
View File
@@ -1,17 +1,20 @@
#!/bin/bash
# The Linux-only half of a restore: system packages, the bundled Ollama binary,
# and the XFCE desktop wiring (panel, wallpaper, theme, terminal, branding).
# and the desktop wiring (panel, wallpaper, theme, terminal, branding) for
# whichever of XFCE / Plasma is installed.
# None of it means anything on Windows, which is why it lives here instead of in
# bin/sync.py — sync.py owns the portable half and calls this in three stages:
#
# restore-linux.sh prep Before the rebuild: system packages the build needs.
# restore-linux.sh runtime After: Ollama binary + shell wiring. Any Linux box
# needs these to actually run NexusOS.
# restore-linux.sh desktop After: the XFCE look (panel, wallpaper, theme,
# branding). Cosmetic, this box's setup, and the only
# stage that rewrites files outside the repo and $HOME.
# Skippable with `--no-desktop`; auto-skipped off XFCE.
# restore-linux.sh desktop After: the desktop look (Plasma global theme,
# XFCE panel/wallpaper/theme, boot + distro
# branding). Cosmetic, this box's setup, and the
# only stage that rewrites files outside the repo
# and $HOME. Skippable with `--no-desktop`; each
# desktop's branch auto-skips when absent.
#
# Not meant to be run by hand — use `ncp restore` (python bin/sync.py restore).
@@ -123,15 +126,28 @@ EOF
exit 0
fi
# --- desktop stage: XFCE only, and it writes outside the repo -----------------
# Everything below reconfigures the logged-in user's desktop. On any other DE it
# would be actively wrong (copying XFCE channel XMLs onto a GNOME box does
# nothing good), so bail rather than make a mess of someone else's machine.
if ! command -v xfconf-query >/dev/null; then
echo "Not an XFCE session (no xfconf-query) — skipping desktop wiring."
exit 0
# --- desktop stage: reconfigures the logged-in user's desktop ------------------
# Keyed on what is installed, not on one either/or: XFCE and Plasma can both be
# present (this box runs both and picks at the SDDM greeter), and each branch
# writes only to its own config. Anything neither branch matches falls through
# to the boot/distro branding at the bottom, which is DE-independent.
# Plasma. install-plasma.sh is idempotent and applies live when a session is
# running; --no-sddm because bin/boot-branding.sh owns the SDDM theme, and
# letting both write it was how the setting ended up in two files.
if command -v lookandfeeltool >/dev/null && [ -x "$NEXUS_ROOT/assets/themes/KDE/install-plasma.sh" ]; then
echo ""
echo "Restoring NexusOS Plasma theme..."
"$NEXUS_ROOT/assets/themes/KDE/install-plasma.sh" --no-sddm \
|| echo "Warning: Plasma theme restore failed."
fi
# XFCE. Copying XFCE channel XMLs onto a box with no XFCE does nothing good, so
# this whole branch is skipped rather than half-applied.
if ! command -v xfconf-query >/dev/null; then
echo "No XFCE (no xfconf-query) — skipping the XFCE desktop wiring."
else
# Panel layout, wallpaper, compositing, keybindings and terminal profile all live
# in the xfconf channel XMLs — restore them by copying the files back. xfconfd
# caches channels in memory and rewrites them on exit, so it has to die first or
@@ -163,8 +179,26 @@ if [ -f "$NEXUS_ROOT/bin/panel/plank-primary-watch.sh" ]; then
fi
plank_snap="$NEXUS_ROOT/assets/themes/restore-snapshot/plank"
if [ -d "$plank_snap" ]; then
# Plank owns its item list in dconf and deletes any .dockitem missing from it
# on startup, so copying files alone silently restores nothing. Order here:
# kill Plank (a running one prunes what we copy), put the launcher .desktop
# targets back, copy the items, set the list, restart.
pkill -x plank 2>/dev/null && sleep 1
mkdir -p "$HOME/.local/share/applications"
cp -f "$NEXUS_ROOT/assets/themes/restore-snapshot/applications"/*.desktop \
"$HOME/.local/share/applications/" 2>/dev/null || true
mkdir -p "$HOME/.config/plank"
cp -rf "$plank_snap/." "$HOME/.config/plank/" # /. = contents, else it nests
plank_cfg="$NEXUS_ROOT/assets/themes/restore-snapshot/plank-dconf.ini"
if [ -s "$plank_cfg" ]; then
dconf load /net/launchpad/plank/ < "$plank_cfg" 2>/dev/null || true
fi
theme_snap="$NEXUS_ROOT/assets/themes/plank"
if [ -d "$theme_snap" ]; then
mkdir -p "$HOME/.local/share/plank/themes"
cp -rf "$theme_snap/." "$HOME/.local/share/plank/themes/"
fi
command -v plank >/dev/null && setsid plank >/dev/null 2>&1 </dev/null &
fi
echo ""
@@ -196,6 +230,8 @@ else
echo "Warning: $panel_installer not found — skipping panel install."
fi
fi
# Boot branding — the Plymouth splash. Not XFCE-specific, but it's cosmetic and
# writes outside the repo, so it belongs to the skippable stage like os-release
# below. Self-skips when the theme is already installed (initramfs rebuild is slow).