1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
name: ci
on:
push:
branches:
pull_request:
branches:
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
- run: cargo build --all-targets
# Force single-threaded test execution to keep the heavy real-process
# e2e binaries (e.g. e2e_detached_pair, with real daemons + a SAS
# handshake under a tight deadline) from self-contending under default
# parallelism on the 2-core ubuntu-latest runner. Also reduces the UDS
# round-trip flake seen intermittently on Broken-pipe (os error 32).
# Lib + non-heavy e2e cost is negligible serialized; heavy e2e is where
# the wins are. See feedback/heavy-e2e-subprocess-contention.
- run: cargo test --all-targets -- --test-threads=1
fmt:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt
- run: cargo fmt --all -- --check
clippy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: dtolnay/rust-toolchain@stable
with:
components: clippy
- uses: Swatinem/rust-cache@v2
- run: cargo clippy --all-targets -- -D warnings
demo-detached:
# Runs demo-detached.sh end-to-end: local relay + two daemons + full
# detached pair handshake + signed send/recv. Catches regressions that
# only surface under the real CLI surface (process spawning, FIFO/IO
# buffering, daemon lifecycle).
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
- run: sudo apt-get update && sudo apt-get install -y jq
- run: cargo build --release --bin wire
- run: WIRE=./target/release/wire bash demo-detached.sh
demo-invite:
# Runs demo-invite.sh end-to-end: local relay + paul + willard + one-paste
# invite-URL pair + bidirectional signed send/recv. Catches regressions in
# the v0.4.0 pair_drop hook, daemon-pull cursor persist, and CLI wiring.
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
- run: sudo apt-get update && sudo apt-get install -y jq
- run: cargo build --release --bin wire
- run: WIRE=./target/release/wire bash demo-invite.sh
demo-hotline:
# Runs demo-hotline.sh end-to-end: local relay + 5 agents with vibes +
# full mesh via `wire add` + signed ring-send. Validates the v0.5
# handle directory, .well-known/wire/agent resolver, pair_drop +
# pair_drop_ack flow, profile fields, and 5-way mesh under one daemon.
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
- run: sudo apt-get update && sudo apt-get install -y jq
- run: cargo build --release --bin wire
- run: WIRE=./target/release/wire bash demo-hotline.sh
docs-lint:
# Catch deprecated command phrases drifting back into docs. Per the
# swift-harbor / dthoma1 #145 audit: README + AGENTS + INSTALL had
# several stale shapes (`wire add bob@`, `wire init <nick>`, `wire
# daemon start`, `wire.slancha.ai`, `wire up <nick>@<relay>`) that
# contradicted the canonical v0.12+ surface. Lint blocks regression.
#
# Legacy sections explicitly named "Legacy" or "Legacy flows" are
# allowed to mention deprecated verbs — the lint scopes its grep
# exclusions to those headers (handled inline via `grep -v`).
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- name: deprecated phrases (canonical surface drift)
run: |
set -e
FILES="README.md AGENTS.md INSTALL.md docs/integrations/*.md docs/AGENT_INTEGRATION.md"
fail=0
check() {
local pattern="$1"
local description="$2"
# Exclude lines inside Legacy sections (best-effort: grep -v on
# the line itself contains 'Legacy' marker; deeper context
# exclusion would need a real parser).
hits=$(grep -nE "$pattern" $FILES 2>/dev/null \
| grep -v -iE '(legacy|deprecated|removed|v1\.0 removes)' \
|| true)
if [ -n "$hits" ]; then
echo "::error::Deprecated phrase '$description' found in docs:"
echo "$hits"
fail=1
fi
}
# The shapes swift-harbor's audit (#145) called out:
check 'wire add [a-z][a-z-]*@' 'wire add <peer>@<relay> (use `wire dial`)'
check 'wire init <nick>' 'wire init <nick> (use `wire up`)'
check 'wire daemon start' 'wire daemon start (no subcommand; use `wire daemon`)'
check 'wire up <nick>@' 'wire up <nick>@<relay> (handle is DID-derived; use `wire up @<relay>`)'
check 'wire\.slancha\.ai' 'wire.slancha.ai (use wireup.net)'
check 'relay\.slancha\.ai' 'relay.slancha.ai (use wireup.net)'
if [ "$fail" -ne 0 ]; then
echo ""
echo "Lint failed: deprecated command phrase(s) drifted back into docs."
echo "Fix the lines above or move them under a 'Legacy' header if intentional."
exit 1
fi
echo "docs-lint: clean."
install-smoke:
# Fresh-user first-run path. Builds the binary THIS PR produces, puts it
# on PATH the way an install leaves it, and — from a clean cwd with an
# empty WIRE_HOME — runs the offline out-of-the-box sequence. Catches
# changes that compile + pass tests but break the new-user experience
# (first-run offline identity, --json shape, basic subcommands). Also
# This is the "test-env in CI" smoke; the demos cover deeper e2e flows.
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
- run: sudo apt-get update && sudo apt-get install -y jq
- run: cargo build --release --bin wire
- name: fresh-user smoke (offline, clean WIRE_HOME)
run: |
set -euo pipefail
sudo install -m 0755 target/release/wire /usr/local/bin/wire
export WIRE_HOME="$(mktemp -d)/home" WIRE_QUIET_AUTOSESSION=1
cd "$(mktemp -d)" # clean cwd — no repo, no existing state
wire --version
wire --help >/dev/null
wire whoami --json | jq -e '.initialized == false' # pre-init
wire up --no-local # offline identity, no relay needed
wire whoami --json | jq -e '.did | startswith("did:wire:")'
wire here >/dev/null
echo "install-smoke: fresh-user offline path OK"