aboutsummaryrefslogtreecommitdiff
path: root/scripts/tests/agent-page.bats
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-07-13 18:30:48 -0500
committerCraig Jennings <c@cjennings.net>2026-07-13 18:30:48 -0500
commit49be354ff18d6739e478ee4f5ab46de6cb9e4f81 (patch)
tree80bffd6f32c39c2f98a0cd8dea86aba766b8d43b /scripts/tests/agent-page.bats
parent0de6e09a4a6014270b0a8b77cfac7661b8cdf5dd (diff)
downloadrulesets-49be354ff18d6739e478ee4f5ab46de6cb9e4f81.tar.gz
rulesets-49be354ff18d6739e478ee4f5ab46de6cb9e4f81.zip
feat(pager): add agent-page, the runtime-neutral phone pager
The Signal pager reconcile found one pager identity, registered in velox's signal-cli, reachable from other machines only by hand-rolled ssh. agent-page wraps that: direct signal-cli on velox, ssh relay over the tailnet from everywhere else, a desktop-fallback hint when the relay fails, and the UUID target baked in so nobody pages the unregistered phone number again. Four bats tests stub ssh/uname/signal-cli to verify command construction; the real path was verified with a live phone push today. protocols.org's Paging Craig section now teaches both channels (notify for the desk, agent-page for the phone) and demotes signal-mcp to a velox-local nicety; page-me.org, work-the-backlog, and the INDEX carry the same two-channel story. Every project inherits on its next startup sync and make install.
Diffstat (limited to 'scripts/tests/agent-page.bats')
-rw-r--r--scripts/tests/agent-page.bats68
1 files changed, 68 insertions, 0 deletions
diff --git a/scripts/tests/agent-page.bats b/scripts/tests/agent-page.bats
new file mode 100644
index 0000000..071e4b9
--- /dev/null
+++ b/scripts/tests/agent-page.bats
@@ -0,0 +1,68 @@
+#!/usr/bin/env bats
+# agent-page — the runtime-neutral phone pager. Pages Craig over Signal from
+# any machine on the tailnet: runs signal-cli directly on velox (where the
+# pager identity lives), ssh-relays to velox from everywhere else. These tests
+# stub ssh/uname/signal-cli on PATH to verify command construction without a
+# network or a phone.
+
+setup() {
+ REPO_ROOT="$(cd "$(dirname "$BATS_TEST_FILENAME")/../.." && pwd)"
+ PAGE="$REPO_ROOT/claude-templates/bin/agent-page"
+ STUBS="$(mktemp -d)"
+ LOG="$STUBS/calls.log"
+ cat > "$STUBS/ssh" <<EOF
+#!/bin/bash
+echo "ssh \$*" >> "$LOG"
+exit 0
+EOF
+ cat > "$STUBS/signal-cli" <<EOF
+#!/bin/bash
+echo "signal-cli \$*" >> "$LOG"
+exit 0
+EOF
+ chmod +x "$STUBS/ssh" "$STUBS/signal-cli"
+}
+
+teardown() {
+ rm -rf "$STUBS"
+}
+
+@test "no message exits 2 with usage" {
+ run bash "$PAGE"
+ [ "$status" -eq 2 ]
+ [[ "$output" == *"usage"* ]]
+}
+
+@test "relays through ssh to velox with the pager account and Craig's UUID" {
+ PATH="$STUBS:$PATH" run bash "$PAGE" build finished
+ [ "$status" -eq 0 ]
+ grep -q "^ssh .*velox" "$LOG"
+ grep -q "15045173983" "$LOG"
+ grep -q "b1b5601e-6126-47f8-afaa-0a59f5188fde" "$LOG"
+ # printf %q escapes the space, so the relayed message reads build\ finished.
+ grep -qF 'build\ finished' "$LOG"
+}
+
+@test "on velox itself, calls signal-cli directly (no ssh)" {
+ cat > "$STUBS/uname" <<'EOF'
+#!/bin/bash
+[ "$1" = "-n" ] && { echo velox; exit 0; }
+exec /usr/bin/uname "$@"
+EOF
+ chmod +x "$STUBS/uname"
+ PATH="$STUBS:$PATH" run bash "$PAGE" hello
+ [ "$status" -eq 0 ]
+ grep -q "^signal-cli " "$LOG"
+ ! grep -q "^ssh " "$LOG"
+}
+
+@test "a failed relay reports the desktop fallback and propagates failure" {
+ cat > "$STUBS/ssh" <<'EOF'
+#!/bin/bash
+exit 255
+EOF
+ chmod +x "$STUBS/ssh"
+ PATH="$STUBS:$PATH" run bash "$PAGE" urgent thing
+ [ "$status" -ne 0 ]
+ [[ "$output" == *"notify"* ]]
+}