aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xarchsetup10
-rw-r--r--docs/post-install-checklist.org13
-rwxr-xr-xscripts/cmail-setup-finish.sh56
-rw-r--r--todo.org6
4 files changed, 54 insertions, 31 deletions
diff --git a/archsetup b/archsetup
index 32a3ad4..18024c5 100755
--- a/archsetup
+++ b/archsetup
@@ -3892,10 +3892,12 @@ outro() {
printf "\n"
printf "If you use Proton Mail Bridge for cmail triage, finish the setup\n"
printf "after reboot:\n"
- printf " 1. Clone claude-templates to ~/projects/claude-templates if missing.\n"
- printf " 2. Run 'protonmail-bridge --cli', log in, then quit.\n"
- printf " 3. Run ~/code/archsetup/scripts/cmail-setup-finish.sh\n"
- printf " 4. First mail sync: mbsync cmail && mu index\n"
+ printf " 1. Run 'protonmail-bridge --cli', log in, then quit.\n"
+ printf " 2. Run ~/code/archsetup/scripts/cmail-setup-finish.sh\n"
+ printf " 3. First mail sync: mbsync cmail && mu index\n"
+ printf "\n"
+ printf "Sending mail also needs cmail-action, which rulesets owns:\n"
+ printf "clone it to ~/code/rulesets and run 'make install'.\n"
printf "\n"
printf "Please reboot before working with your new workstation.\n\n"
diff --git a/docs/post-install-checklist.org b/docs/post-install-checklist.org
index f0545a7..8c48938 100644
--- a/docs/post-install-checklist.org
+++ b/docs/post-install-checklist.org
@@ -97,7 +97,12 @@ needs doing.
The installer's completion message carries the steps; recorded here too so
the checklist is complete:
-1. Clone claude-templates to =~/projects/claude-templates= if missing.
-2. Run =protonmail-bridge --cli=, log in, then quit.
-3. Run =~/code/archsetup/scripts/cmail-setup-finish.sh=.
-4. First mail sync: =mbsync cmail && mu index=.
+1. Run =protonmail-bridge --cli=, log in, then quit.
+2. Run =~/code/archsetup/scripts/cmail-setup-finish.sh=.
+3. First mail sync: =mbsync cmail && mu index=.
+
+Sending mail also needs =cmail-action= on PATH, which rulesets owns: clone it
+to =~/code/rulesets= and run =make install=. That is not a prerequisite for the
+steps above — the setup script warns and carries on — but =mbsync= is the first
+thing that wants it. An agent session runs =make install= at startup, so on a
+machine that runs them the link appears on its own.
diff --git a/scripts/cmail-setup-finish.sh b/scripts/cmail-setup-finish.sh
index 949023f..8c27eda 100755
--- a/scripts/cmail-setup-finish.sh
+++ b/scripts/cmail-setup-finish.sh
@@ -1,32 +1,37 @@
#!/usr/bin/env bash
# SPDX-License-Identifier: GPL-3.0-or-later
-# cmail-setup-finish.sh — finish Proton Mail Bridge + cmail-action setup after
-# Bridge first-run. Idempotent; safe to re-run after a Bridge cert rotation or
-# a claude-templates re-clone.
+# cmail-setup-finish.sh — finish Proton Mail Bridge setup after Bridge
+# first-run. Idempotent; safe to re-run after a Bridge cert rotation.
#
# Pre-reqs (the script aborts if any are missing):
# - protonmail-bridge installed (archsetup handles it)
# - You have run 'protonmail-bridge --cli', logged in, and quit at least once
# (the script looks for state at ~/.config/protonmail/bridge-v3/)
-# - claude-templates cloned at ~/projects/claude-templates
# - dotfiles stowed (~/.config/.cmailpass.gpg present)
#
+# Not a pre-req, but checked and warned about: cmail-action on PATH. rulesets'
+# `make install` links it, and session start runs that, so on a machine that
+# runs agent sessions it arrives without anyone asking. On one that doesn't,
+# it needs the command by hand. The script never invokes it either way.
+#
# What it does:
# 1. Decrypts ~/.config/.cmailpass.gpg → ~/.config/.cmailpass (mode 0600)
# 2. Copies Bridge's self-signed cert → ~/.config/protonbridge.pem
-# 3. Symlinks ~/projects/claude-templates/.ai/scripts/cmail-action.py
-# → ~/.local/bin/cmail-action
-# 4. Removes the leftover ~/.config/autostart/Proton Mail Bridge.desktop
+# 3. Removes the leftover ~/.config/autostart/Proton Mail Bridge.desktop
# stub (it double-launches Bridge alongside the systemd user service
# and throws an "orphan instance" dialog every login)
-# 5. Installs a wait-for-dns drop-in so Bridge doesn't spam
+# 4. Installs a wait-for-dns drop-in so Bridge doesn't spam
# name-resolution errors during the early-boot DNS race
-# 6. Enables + starts the protonmail-bridge user service
-# 7. Verifies Bridge is listening on 127.0.0.1:1143 / :1025
+# 5. Enables + starts the protonmail-bridge user service
+# 6. Verifies Bridge is listening on 127.0.0.1:1143 / :1025
+#
+# It no longer installs cmail-action. That moved to rulesets
+# (claude-templates/bin/), whose `make install` owns the symlink.
set -euo pipefail
err() { printf 'error: %s\n' "$*" >&2; exit 1; }
+warn() { printf 'warning: %s\n' "$*" >&2; }
info() { printf '==> %s\n' "$*"; }
ok() { printf ' %s\n' "$*"; }
@@ -47,9 +52,20 @@ bridge_state="$HOME/.config/protonmail/bridge-v3"
[ -d "$bridge_state" ] \
|| err "Bridge has no state at $bridge_state — run 'protonmail-bridge --cli' and log in first"
-cmail_action_src="$HOME/projects/claude-templates/.ai/scripts/cmail-action.py"
-[ -f "$cmail_action_src" ] \
- || err "cmail-action.py not found at $cmail_action_src — clone claude-templates first"
+# cmail-action is no longer this script's to install. It lives in rulesets at
+# claude-templates/bin/, and rulesets' `make install` links everything there
+# into ~/.local/bin. Session start runs that, so on a machine that runs agent
+# sessions the symlink arrives on its own; on one that doesn't, it needs the
+# command below.
+#
+# A warning rather than an abort, because this script never invokes the tool.
+# Its job is to leave Bridge working, and it can finish that whether or not a
+# mail client has been linked yet. Aborting here would make Bridge setup
+# depend on rulesets being cloned and installed first, an ordering neither
+# repo otherwise needs, and would strand a fresh machine with Bridge ready and
+# the script refusing to configure it.
+command -v cmail-action >/dev/null 2>&1 \
+ || warn "cmail-action not on PATH — run 'make -C ~/code/rulesets install' before sending mail"
cmailpass_enc="$HOME/.config/.cmailpass.gpg"
[ -f "$cmailpass_enc" ] \
@@ -69,13 +85,7 @@ cert_dst="$HOME/.config/protonbridge.pem"
cp "$cert_src" "$cert_dst"
ok "copied $cert_src → $cert_dst"
-# 4. Symlink cmail-action
-info "symlinking cmail-action"
-mkdir -p "$HOME/.local/bin"
-ln -sf "$cmail_action_src" "$HOME/.local/bin/cmail-action"
-ok "linked $HOME/.local/bin/cmail-action → $cmail_action_src"
-
-# 5. Remove leftover XDG autostart stub
+# 4. Remove leftover XDG autostart stub
# The systemd --user service is the canonical launcher. The autostart .desktop
# starts a second Bridge instance that can't get the lock and pops up an
# "orphan instance" dialog every login.
@@ -88,7 +98,7 @@ else
ok "no autostart stub present"
fi
-# 6. Install wait-for-dns drop-in
+# 5. Install wait-for-dns drop-in
# User-instance systemd doesn't carry network-online.target / nss-lookup.target,
# so the packaged unit's After=network.target doesn't imply DNS readiness.
# Bridge starts before the resolver is up and its first API calls all fail
@@ -107,7 +117,7 @@ ok "wrote $dropin_file"
systemctl --user daemon-reload
ok "reloaded systemd user units"
-# 7. Enable + start systemd user service
+# 6. Enable + start systemd user service
info "enabling protonmail-bridge user service"
was_active=0
systemctl --user is-active --quiet protonmail-bridge.service && was_active=1
@@ -119,7 +129,7 @@ else
ok "service active"
fi
-# 8. Verify
+# 7. Verify
info "verifying Bridge is listening"
listening="$(ss -ltn 2>/dev/null || true)"
missing=""
diff --git a/todo.org b/todo.org
index 28872f8..d9a8eae 100644
--- a/todo.org
+++ b/todo.org
@@ -3913,6 +3913,12 @@ From the roam inbox (Craig, claimed 2026-07-23): velox needs bringing up to date
Resolved 2026-07-23 by a full sweep over tailscale. The touchpad module was already gone — velox's running waybar (started 01:05, after the reboot) and its tracked config both carry zero =custom/touchpad= entries; what Craig saw was the pre-restow waybar process from before the reboot, and the reboot cleared it. Sweep results: both machines at dotfiles f9b6404 (all three hyprland lock/exit fixes live on velox, config errors clean, =allow_session_lock_restore= reads true); stow restow clean, only the expected skip-worktree files; rulesets pulled to 50fc7ca and =make install= run (agent-text verified working by invoking it — an earlier "MISSING" reading was a PATH artifact of the non-interactive ssh shell, not a real gap); desktop-settings tick timer active; mpvpaper, power-profiles-daemon, gtk4-layer-shell, webkit2gtk all present.
Genuine remaining differences, all per-machine installs rather than sync failures: =cmail-action=, =gcalcli=, and =playwright= aren't installed on velox, and =obsbot-wb-guard.service= isn't enabled there (the OBSBOT lives on ratio). None block anything; file separately if velox should send mail or drive browser tests.
+*** 2026-08-20 Thu @ 09:53:04 -0700 One of those three closed itself; two still stand
+=cmail-action= is on both daily drivers now, and nothing did it deliberately. It moved into rulesets at =claude-templates/bin/=, and rulesets' =make install= links that whole directory into =~/.local/bin= at every session start — so velox picked it up on its own. Verified here: the symlink was written 05:44 this morning by this session's own startup, and the tool runs.
+
+=gcalcli= and =playwright= are still absent on velox, which stays correct until I say velox should send calendar invites or drive browser tests. =obsbot-wb-guard= is still right to be off here; the camera is on ratio.
+
+Leaving the paragraph above as written rather than striking it (rulesets suggested striking). It is the resolution note of a task closed 2026-07-23 and it was accurate that day. Editing a closed record to match today makes it a worse record, and the useful correction is this dated entry, not a redaction.
** DONE [#C] Weather tooltip sunrise and sunset :feature:waybar:weather:quick:solo:
CLOSED: [2026-07-23 Thu]
Shipped 2026-07-23 as dotfiles =de62e9d=. The two rows sit directly below Humidity in the current-conditions block, rendered in the footer's 12-hour format (=%-I:%M %p=) so the tooltip reads one way throughout.