Commit Graph
143 Commits
Author SHA1 Message Date
davidandClaude Opus 5.5 a811c347b7 Report receiver: fix a race in its tests, and log Gitea's reasons
The first test checked that a report was no longer pending as soon as
its log reached the fake Gitea, a moment before the receiver marks it
filed, so it could fail; wait for the mark instead. The tests now close
their servers and error responses.

When Gitea refuses an issue or attachment, the receiver closes the reply
and logs Gitea's reason, such as a token without the right permission.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 11:43:51 -07:00
davidandClaude Opus 5.5 ce7cf08d60 Add the receiver that files error reports as Gitea issues
server/report-receiver/receiver.py takes what report sends to
federated.sh/report, behind Caddy, and files each report as an issue in
the private Federated_Computer/coredesktop-reports repository with the
full log attached. It saves each report before replying and tries Gitea
again later if it's down, limits how many reports one address can send,
and refuses oversized logs, gzip bombs included. Standard library only.

The README has the deployment steps: a Gitea user that can only file
issues there, the systemd unit, and the Caddy route. make test runs its
tests, which send reports with the real report client.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 11:36:43 -07:00
davidandClaude Opus 5.5 1cd56f7a90 report: accept a report ID that ends with a newline
Plain-text replies usually end with one, and the ID check counted it as
part of the ID, so a report that was sent was said to have failed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 11:36:43 -07:00
davidandClaude Opus 5.5 bd82063bbb Offer to send the log to us when an install or update fails
When update or install.sh fails and there's a terminal, ask whether to
send its log to the CoreDesktop team, with the option of reading exactly
what would be sent first. Nothing is sent without a yes, and nothing is
asked without a terminal. The new report command sends a log later
(report, report FILE) or shows what would be sent (report --view).

Before sending, the log is cleaned of terminal codes, and the home
folder, user name, host name, email addresses, IPv4 addresses and
Tailscale names are replaced. CoreDesktop's version, the kernel's, the
failed steps and sibling versions go along with it. The request format
the receiver on federated.sh implements is described at the top of
report.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 11:28:53 -07:00
davidandClaude Opus 5.5 a82bbfc2e1 Reinstall a damaged Neovim plugin instead of only stashing its changes
shellcheck / shellcheck (push) Failing after 15s
Stashing a plugin's mismatched files wasn't enough for LuaSnip: the
interrupted update had also left new files git won't overwrite and a
half-cloned submodule, so lazy.nvim still couldn't check out the new
version, and said nothing. Move such a plugin to
~/.local/state/coredesktop/nvim-plugins/ instead, so Lazy! sync installs
it afresh and any edits to it are kept. A plugin the earlier version of
this step stashed is moved the same way.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 11:08:49 -07:00
davidandClaude Opus 5.5 54f9e12526 Log each install and update, and keep only the recent logs
shellcheck / shellcheck (push) Failing after 17s
Each run's output now goes to ~/.local/state/coredesktop/logs/, so what
failed can be read after the terminal is gone. In a terminal, update runs
itself under script(1), so everything it runs still sees a terminal, then
strips color codes and progress redraws from the log; otherwise it uses
tee. install.sh, usually piped into bash, uses tee, and runs configure
straight on the terminal, outside the log. Both name the log when
something fails. 95-cleanup.sh keeps the newest 10 update logs and 3
install logs.

The sudo keepalive loops no longer share the logged output, so their
sleep can't hold the log open after the run ends.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 11:00:31 -07:00
davidandClaude Opus 5.5 c8b2f8473d Unstick plugins lazy.nvim won't update, and move to Thunderbird ESR
shellcheck / shellcheck (push) Failing after 17s
An interrupted plugin update can leave a plugin's files out of step with
its checkout, and lazy.nvim then refuses to update it, every time. Before
syncing, update now stashes such changes, so they can still be recovered
with git stash pop, and puts the plugin's submodules back.

Flathub retired org.mozilla.Thunderbird in favor of
org.mozilla.thunderbird_esr, so update tried to reinstall the old ID on
every run. Install the new one. flatpak update already moves existing
installs over; a migration carries a skip-packages entry for the old ID
over to the new one.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 10:51:49 -07:00
davidandClaude Opus 5.5 ee7451600b Show sibling projects' versions, and let version update them
shellcheck / shellcheck (push) Failing after 19s
A sibling's version is its latest git tag (v1.4.0, or v1.4.0+3 for commits
after it), or, without tags, its commit's date and short hash, like
CoreDesktop's own. The version shown as available is that of the newest
commit on the default branch, which is what update installs.

sibling list shows each sibling's version. sibling check fetches every
sibling at once and shows which have a newer version, and sibling update
[name...] updates the named siblings or all of them. 71-siblings.sh now
runs sibling update, so update and version share one way of updating.

version lists the installed siblings with any newer version and, when run
in a terminal, asks for each one whether to update it now. version --check
and the update notification still only look at CoreDesktop.

The sibling skill docs describe how to release a version by tagging it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 10:26:51 -07:00
davidandClaude Opus 5.5 318e858021 README: install with wget -qO- https://federated.sh | bash
shellcheck / shellcheck (push) Failing after 21s
federated.sh redirects wget and curl to install.sh on Gitea, and
browsers to the Install page, so the command is short enough to type.
Opening Gitea to copy the long command is no longer a step; link
install.sh for anyone who wants to read it first.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 09:17:56 -07:00
davidandClaude Opus 5.5 cf862ecab0 Leave Wi-Fi to NetworkManager when archinstall turned on iwd as well
shellcheck / shellcheck (push) Failing after 14s
archinstall's "Copy ISO network configuration", which a user who connected
with iwctl may pick, turns on iwd and systemd-networkd. CoreDesktop then
turns on NetworkManager too, and after a restart two services fight over
the Wi-Fi card. system/wifi.sh disables iwd and systemd-networkd, without
stopping them, when NetworkManager is enabled and isn't set to use iwd
itself. install.sh runs it, and a migration runs it on existing machines.
The README tells users to choose NetworkManager in archinstall.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 13:46:32 -07:00
davidandClaude Opus 5.5 e958e20431 Remove texlive from the install, with a migration for existing machines
shellcheck / shellcheck (push) Failing after 16s
Nothing in CoreDesktop uses LaTeX, and the texlive group is 22 packages
and about 3 GB. The migration removes it once, keeping any package from
the group that something else still needs as a dependency.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 13:31:09 -07:00
davidandClaude Opus 5.5 334bf5bbd8 smoketest: 30 runs a baseline's install once more if it fails
shellcheck / shellcheck (push) Failing after 16s
voxtype's build from source fails now and then at link time, with
Vulkan shaders missing: 0c0ddf5 built it in two runs and not the third,
with the same packages. The baseline isn't what's under test, and the
old installers skip what they already installed, so try once more.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 17:33:46 -07:00
davidandClaude Opus 5.5 55a65d332b smoketest: the fingerprint ignores blank lines in .bashrc
shellcheck / shellcheck (push) Failing after 16s
mise.run's installer added a blank line before its activate line, and
migrations/1793453501.sh removes only the activate line, so machines
installed before then keep a harmless blank line a fresh install lacks.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 14:00:59 -07:00
davidandClaude Opus 5.5 b2a16471fd update: hand over cleanly from updates older than 2026-10-19
013acac's update (in use 2026-08-14 to 2026-10-19) copies the new update
over itself with sudo cp while bash is still reading it, so bash reads on
from byte 1484 of the new file: today, the middle of the logo, and the
update dies with a syntax error. Put a line at exactly that byte that
execs the new update, in a here-document a normal run skips. Found by
30-upgrade-from-baseline at ca658dc; the test replays 013acac's update.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 14:00:59 -07:00
davidandClaude Opus 5.5 a72835e866 smoketest: get ca658dc and d8d93a4 installed; fingerprint all of .bashrc
shellcheck / shellcheck (push) Failing after 15s
30's fix-up commit now also adds clang and cmake, without which voxtype
no longer builds from source (later commits install them), and stops
ca658dc's bitwarden.sh failing on its unset LINE under the set -u that
install-kickstart-nvim.sh leaves on.

The fingerprint recorded only the line numbers of .bashrc's coredesktop
lines, so 0c0ddf5's showed a line moved without saying what was added.
Record the whole file, sorted.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 11:50:15 -07:00
davidandClaude Opus 5.5 e2b62a9d13 Migration: remove libayatana-appindicator, which cline-desktop needed
CoreDesktop installed it to build cline-desktop, which cline-desktop-bin
has since replaced, so machines installed before kept it where a fresh
install has none. Found by 30-upgrade-from-baseline at 0c0ddf5.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 11:50:15 -07:00
davidandClaude Opus 5.5 716fe83aa4 update: remove -debug packages whose package is gone
makepkg builds pkg-debug alongside an AUR package, and removing the
package leaves it behind: the migration that dropped asdf-vm left
asdf-vm-debug. Found by 30-upgrade-from-baseline at 0c0ddf5, whose
machine kept it where a fresh install has none.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 11:50:15 -07:00
davidandClaude Opus 5.5 061121226d smoketest: 30 gets the older installers past GNOME's dialog and polkit
shellcheck / shellcheck (push) Failing after 18s
ca658dc installs extensions with plain gext install, which waits for a
GNOME Shell dialog no one clicks; add --filesystem, as HEAD does. ca658dc
and d8d93a4 run flatpak install as the user, which polkit refuses over
SSH; allow it for the install only, with a rule removed afterwards.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 09:04:18 -07:00
davidandClaude Opus 5.5 8e18a6238b remove_packages: remove a package's -debug package too
An AUR package built with makepkg's debug option comes with pkg-debug,
which nothing depends on, so pacman -Rns leaves it behind. voxtype-debug
then conflicts with voxtype-bin-debug, and update fails on machines
installed before voxtype-bin replaced voxtype. Found by
30-upgrade-from-baseline at 0c0ddf5.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 09:04:18 -07:00
davidandClaude Opus 5.5 344cabc59a smoketest: 50 removes packages the archive doesn't have before going back
shellcheck / shellcheck (push) Failing after 14s
clang-libs and llvm-lit were split off clang and llvm after the archive
date, so the old clang and llvm conflicted with their files and the
downgrade failed, skipping the scenario. Remove packages from Arch's repos
that the archive doesn't have yet before downgrading.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 10:49:35 -07:00
davidandClaude Opus 5.5 0950625536 smoketest: install the baselines with herdr-bin for herdr
Every baseline installs herdr from source, which pins zig 0.16, and Arch
now has 0.17, so their installs fail. Install them with herdr-bin (which
provides herdr, and is what HEAD installs) in a commit on top, then put
the clone back at the baseline itself, since update pulls --ff-only.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 10:49:35 -07:00
davidandClaude Opus 5.5 a2468c50f1 smoketest: send gitea.federated.computer/david's URL to the fake upstream too
install.sh at every baseline in smoketest/baselines clones from
https://gitea.federated.computer/david/coredesktop.git, which wasn't in
COREDESKTOP_URLS. So 30-upgrade-from-baseline installed today's real
upstream (via Gitea's redirect) instead of the baseline, and failed when
the old install.sh asked for files that have since gone.

Add a test that every URL install.sh has ever cloned from is in the list.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 10:48:06 -07:00
davidandClaude Opus 5.5 c7c9d0536b Keep only Tiling Shell's preferences in gnome-settings.dconf
shellcheck / shellcheck (push) Failing after 14s
selected-layouts, last-version-name-installed and overridden-settings are
Tiling Shell's own state from the machine the file came from: the layout
of each of its 8 workspaces, the version it last ran, and the GNOME
settings to restore if it's turned off. Loaded on other machines, they
reset users' layouts whenever the file changed and could restore the
wrong GNOME settings. Existing machines keep their current values.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 09:08:27 -07:00
davidandClaude Opus 5.5 906f2b1b47 Don't reset the extensions' settings on every refresh
shellcheck / shellcheck (push) Failing after 15s
gnome-extensions.sh loaded gnome-settings.dconf unconditionally, so each
refresh (install.sh runs it) undid users' changes to those settings,
bypassing apply-gnome-settings.sh's check that the file has changed. That
script, which install.sh runs later, already loads the settings when
needed. The smoketest's 11-refresh caught it: Tiling Shell's
selected-layouts went back to the file's value.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 09:01:39 -07:00
davidandClaude Opus 5.5 101261bd9b update: a failing hook without run_update fails the update
shellcheck / shellcheck (push) Failing after 17s
Since a65f07c ran each hook in a subshell, a hook that does its work as
it's sourced (12-migrations, 15-services, 20-aur, 30-flatpak and others)
had its failure lost: the run_update check after source left the
subshell's status at 0, so update said "Done." and exited 0. The smoketest's
40-failing-migration caught it. update now exits the subshell with the
sourced hook's status.

Also, the smoketest scenarios that check whether a migration ran look for
"Running migration " so install.sh's "Running migrations..." heading
doesn't match (11-refresh failed on it).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 08:39:54 -07:00
davidandClaude Opus 5.5 6524ff9efd smoketest: say once a minute that a command in the VM is still running
run_in_vm prints how long it has run and the log's latest line, so an
hour-long install.sh shows progress without tail -f.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 08:36:01 -07:00
davidandClaude Opus 5.5 7ae6a5c1be smoketest: don't run the pre-push hook when pushing to the VM
shellcheck / shellcheck (push) Failing after 16s
upstream_set pushes the commit under test from the working copy, so
coredesktop-dev's pre-push hook ran make check on every push to the VM.
Inside the smoketest those checks saw VM_GIT_URL and friends, the
smoketest tests pushed to the real VM and failed, and the hook stopped
the push, failing the installed image's build. The push now uses
--no-verify, and the tests clear the smoketest's variables.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 07:31:55 -07:00
davidandClaude Opus 5.5 523c5b9b15 smoketest: write run_in_vm's log as the command runs
So a long command (install.sh takes an hour or more) can be followed with
tail -f; run_in_vm prints the log's path when it starts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 07:28:10 -07:00
davidandClaude Opus 5.5 7e75d9fe27 Revert "coredesktop-dev skill: qemu-hw-display-virtio-vga and doctor's check"
shellcheck / shellcheck (push) Failing after 17s
coredesktop-dev now gives its VMs QEMU's standard VGA, which qemu-base
has, so the extra package and doctor's check are gone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 20:13:13 -07:00
davidandClaude Opus 5.5 f1a95ec48c coredesktop-dev skill: qemu-hw-display-virtio-vga and doctor's check
shellcheck / shellcheck (push) Failing after 16s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 20:04:39 -07:00
david 5ed3df55e3 further checks
shellcheck / shellcheck (push) Failing after 14s
2026-11-04 10:05:50 -07:00
david 2b85af286f testing harness, coredesktop-dev
shellcheck / shellcheck (push) Failing after 17s
2026-11-04 09:39:46 -07:00
david c3ac9f49d0 improve version and mirror updating
shellcheck / shellcheck (push) Failing after 14s
2026-11-04 07:08:44 -07:00
david 7f37a1b9ee coredesktop-dev sibling skill
shellcheck / shellcheck (push) Failing after 16s
2026-11-02 09:11:37 -07:00
david 1d9d759fb1 Turn off Winboat container and do some sandboxing
shellcheck / shellcheck (push) Failing after 16s
2026-11-02 09:05:22 -07:00
david 448c8b43f1 fix agent networking
shellcheck / shellcheck (push) Failing after 17s
2026-11-02 08:57:45 -07:00
davidandClaude Opus 5.5 6bc4fdc880 Install VSCodium only, and remove VS Code
shellcheck / shellcheck (push) Successful in 10s
New machines get VSCodium alone. A migration uninstalls the VS Code
Flatpak once on existing machines; its settings stay in ~/.var/app. The
README says how to install VS Code for extensions only Microsoft's
marketplace has, such as Remote-SSH; update then leaves it alone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 08:28:04 -06:00
davidandClaude Opus 5.5 a102e6fe0b Check the machine before installing, and keep old shells' mise working
shellcheck / shellcheck (push) Successful in 11s
install.sh now stops early, with a clear message, if this isn't 64-bit
Arch, it's run as root, there's no internet, or sudo doesn't work.
system/preflight.sh then asks before going on with too little disk space
or / not on btrfs, and offers to switch another login screen to GDM and
PulseAudio to PipeWire. Keeping another login screen puts GDM in
services-off, so install and update stop failing to enable it; a
migration does the same on existing machines. It says nothing when all
is well, as refresh runs install.sh again.

Intel GPUs also get intel-media-driver for hardware video decoding, with
a migration for existing machines.

The mise migration links ~/.local/bin/mise to /usr/bin/mise instead of
deleting it, so shells opened before the update don't print an error at
every prompt.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 08:25:46 -06:00
david cb66ce9719 fix nvim dependencies
shellcheck / shellcheck (push) Successful in 10s
2026-10-31 08:17:32 -06:00
david 13057fe792 improve configure formatting
shellcheck / shellcheck (push) Successful in 11s
2026-10-31 08:15:11 -06:00
david 6770150b11 fix the fail2ban issues and other things
shellcheck / shellcheck (push) Successful in 11s
2026-10-31 08:10:05 -06:00
david 17c1ba10f7 fix the fail2ban issues and other things 2026-10-31 08:10:02 -06:00
davidandClaude Opus 5.5 c6a6bac84a Merge branch 'main' of https://gitea.federated.computer/Federated_Computer/coredesktop
shellcheck / shellcheck (push) Successful in 13s
Brings in the shellcheck lint and bats tests. Both sides fixed the same
shellcheck warnings; this keeps the remote's versions of 20-aur.sh,
80-gnome-extensions.sh and .shellcheckrc, which silence false positives
per line rather than for the whole repo.

The Gitea workflow now runs make lint, so it checks the same scripts as
the Makefile, and the README points contributors at make check. The test
helper's REPO, used only by the .bats files, is marked for shellcheck,
and the update test expects the pull to be fast-forward only.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 07:25:07 -06:00
david 27115f8245 trim down install, tighten sshd 2026-10-31 07:23:08 -06:00
david 69a01d8977 trim down install, tighten sshd, improve license 2026-10-31 07:22:55 -06:00
davidandClaude Opus 5.5 d9da8208dd Add shellcheck lint and bats tests
make lint runs shellcheck on every tracked bash script, make test runs
the bats suite in tests/, and make check runs both. The tests cover the
update orchestrator (hook isolation, failure reporting, pull and
free-space handling) and utils.sh (migrations, package install and
removal, services, initramfs build check), using stub commands so they
never touch the real system.

Fixes from the first lint run: 20-aur.sh stops if a cd fails rather
than building or deleting in the wrong directory, and
80-gnome-extensions.sh refuses to rm -rf with an empty path. The rest
are false positives, silenced in .shellcheckrc or per line.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 16:15:12 -06:00
david 7e08a048ca more work on configure 2026-10-30 11:45:16 -06:00
david c0df6537ca test core for configure 2026-10-30 11:01:57 -06:00
david 38c03b0b69 Merge branch 'main' of https://gitea.federated.computer/Federated_Computer/coredesktop 2026-10-30 06:48:49 -06:00
david 14d2bd4cd5 change password Core 2026-10-30 06:48:02 -06:00