name: ci
on:
push:
branches: [main]
pull_request:
branches: [main]
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
- 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-invite:
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-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:
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:
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` creates the local identity but also tries to
# claim its DID-derived handle on the shared relay — that claim can
# 409 if the random persona is already taken (non-fatal). The real
# check is the local identity, so tolerate a nonzero exit and assert
# via whoami.
wire up --no-local || true
wire whoami --json | jq -e '.did | startswith("did:wire:")'
wire here >/dev/null
echo "install-smoke: fresh-user offline path OK"
- name: nuke smoke (dry-run changes nothing; --force resets; re-up works)
run: |
set -euo pipefail
export WIRE_HOME="$(mktemp -d)/home" WIRE_QUIET_AUTOSESSION=1
wire up --no-local || true
wire whoami --json | jq -e '.did | startswith("did:wire:")' # identity created
wire nuke --dry-run # lists, must change nothing
wire whoami --json | jq -e '.did | startswith("did:wire:")' # dry-run kept it
wire nuke --force --json | jq -e 'has("removed_paths")'
wire whoami --json | jq -e '.initialized == false' # state wiped
wire up --no-local || true # fresh again
wire whoami --json | jq -e '.did | startswith("did:wire:")'
echo "install-smoke: nuke + re-up OK"
install-smoke-windows:
runs-on: windows-latest
steps:
- uses: actions/checkout@v5
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
- run: cargo build --release --bin wire
- name: fresh-user + nuke smoke (PowerShell)
shell: pwsh
run: |
$ErrorActionPreference = "Stop"
$PSNativeCommandUseErrorActionPreference = $true # native non-zero exit → throw
$wire = ".\target\release\wire.exe"
$env:WIRE_HOME = Join-Path $env:RUNNER_TEMP ("wh-" + [guid]::NewGuid().ToString("N"))
$env:WIRE_QUIET_AUTOSESSION = "1"
& $wire --version
& $wire --help | Out-Null
$pre = (& $wire whoami --json | ConvertFrom-Json)
if ($pre.initialized -ne $false) { throw "expected initialized:false pre-init" }
# `wire up --no-local` creates the local identity but also tries to
# claim its handle on the shared relay; that claim can 409 (handle
# already taken) which is non-fatal. Tolerate a nonzero exit and
# assert the real outcome (local DID) via whoami.
try { & $wire up --no-local } catch { Write-Host "wire up claim non-fatal: $_" }
$post = (& $wire whoami --json | ConvertFrom-Json)
if (-not $post.did.StartsWith("did:wire:")) { throw "expected a did:wire: DID" }
& $wire here | Out-Null
& $wire nuke --dry-run
$afterDry = (& $wire whoami --json | ConvertFrom-Json)
if (-not $afterDry.did.StartsWith("did:wire:")) { throw "dry-run must not wipe state" }
& $wire nuke --force --json | ConvertFrom-Json | Out-Null
$afterNuke = (& $wire whoami --json | ConvertFrom-Json)
if ($afterNuke.initialized -ne $false) { throw "nuke --force should wipe state" }
try { & $wire up --no-local } catch { Write-Host "wire up claim non-fatal: $_" }
$fresh = (& $wire whoami --json | ConvertFrom-Json)
if (-not $fresh.did.StartsWith("did:wire:")) { throw "re-up should recreate identity" }
Write-Host "install-smoke-windows: fresh-user + nuke OK"