<feed xmlns='http://www.w3.org/2005/Atom'>
<title>archsetup/scripts/testing/tests/test_packages.py, branch claude/hungry-franklin-09fffc</title>
<subtitle>Builds a full dev workstation from a bare Arch Linux install.
</subtitle>
<id>https://git.cjennings.net/archsetup/atom?h=claude%2Fhungry-franklin-09fffc</id>
<link rel='self' href='https://git.cjennings.net/archsetup/atom?h=claude%2Fhungry-franklin-09fffc'/>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/archsetup/'/>
<updated>2026-07-02T23:16:52+00:00</updated>
<entry>
<title>feat(vpn): proton CLI replaces the GTK app, tailscale operator at install</title>
<updated>2026-07-02T23:16:52+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-07-02T23:16:52+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/archsetup/commit/?id=158836ff433fdc51416f23d022a68a483b69603b'/>
<id>urn:sha1:158836ff433fdc51416f23d022a68a483b69603b</id>
<content type='text'>
The net panel's Tunnels view drives proton-vpn-cli, and the CLI and GTK app can't run concurrently, so the installer swaps them. tailscaled now enables with --now and the install grants operator to the primary user (brief retry — the daemon takes a moment to accept its socket), so tailscale up/down works without sudo from the panel. VM asserts the vpn stack, the retirement, and the OperatorUser pref (format verified against a live daemon).
</content>
</entry>
<entry>
<title>feat(packages): retire zoom, meetings open in the browser</title>
<updated>2026-07-02T21:50:49+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-07-02T21:50:49+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/archsetup/commit/?id=b253fa0dd22a940d75d9e6c75179a2128168d27a'/>
<id>urn:sha1:b253fa0dd22a940d75d9e6c75179a2128168d27a</id>
<content type='text'>
The dotfiles zoom-web handler rewrites zoommtg:// links to the web client, so the AUR zoom package leaves the install. The retired-package VM assertion now covers blueman and zoom.
</content>
</entry>
<entry>
<title>feat(tooling): provision eask via user-local npm install</title>
<updated>2026-07-02T21:11:05+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-07-02T21:11:05+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/archsetup/commit/?id=b9ff12704cb64e93c8275903dbddd70daf9cd99e'/>
<id>urn:sha1:b9ff12704cb64e93c8275903dbddd70daf9cd99e</id>
<content type='text'>
chime and linear-emacs shell out to eask but nothing installed it. The block runs npm install -g --prefix ~/.local as the user after the node tooling, so eask lands on PATH without root. A stowed .npmrc pins the same prefix in dotfiles. VM asserts both.
</content>
</entry>
<entry>
<title>feat(bluetooth): retire blueman, assert the swap in VM tests</title>
<updated>2026-07-02T19:18:20+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-07-02T19:18:20+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/archsetup/commit/?id=c659ab9b24716736390429a733e45c4ea688c13f'/>
<id>urn:sha1:c659ab9b24716736390429a733e45c4ea688c13f</id>
<content type='text'>
I dropped blueman from the desktop_environment bluetooth loop (bluez + bluez-utils stay) and added the VM assertions: bluetooth stack installed, blueman absent as the retirement regression guard. No new sudoers rule was needed for bt-priv, since the existing blanket grant already covers systemctl restart bluetooth.
</content>
</entry>
<entry>
<title>test(archsetup): port full shell validation sweep to Testinfra (P2)</title>
<updated>2026-06-25T05:12:35+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-25T05:12:35+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/archsetup/commit/?id=e40aa46044a321b7c9dec557716888a98de17dbe'/>
<id>urn:sha1:e40aa46044a321b7c9dec557716888a98de17dbe</id>
<content type='text'>
Port all ~26 post-install checks from validation.sh to pytest/Testinfra,
reaching parity before the cutover. Adds test_users, test_packages,
test_services, test_desktop, test_boot, test_keyring, and test_archsetup
(88 tests after parametrizing groups, services, timers, tools, and configs),
plus shared conftest fixtures for ZFS/NVMe/compositor/networking gating.

The shell sweep's three outcomes map cleanly: hard failures become assertions,
advisory warnings and unmet preconditions (headless compositor, slirp
networking, optional services, non-ZFS/non-NVMe hosts) become skips.

One correctness fix vs the shell sweep: check awww, not swww — archsetup
installs awww (swww's successor) and `pacman -Q swww` no longer matches.

Verified on the host: py_compile clean, pytest --collect-only green (88 tests).
The sweep against a real VM is verified by the make test run that follows.
</content>
</entry>
</feed>
