mirror of
https://github.com/wiremock/WireMock.Net.git
synced 2026-07-20 03:31:28 +02:00
105 lines
3.3 KiB
Bash
105 lines
3.3 KiB
Bash
#!/bin/bash
|
|
# sync-mesh.sh — Materialize remote squad state locally
|
|
#
|
|
# Reads mesh.json, fetches remote squads into local directories.
|
|
# Run before agent reads. No daemon. No service. ~40 lines.
|
|
#
|
|
# Usage: ./sync-mesh.sh [path-to-mesh.json]
|
|
# ./sync-mesh.sh --init [path-to-mesh.json]
|
|
# Requires: jq (https://github.com/jqlang/jq), git, curl
|
|
|
|
set -euo pipefail
|
|
|
|
# Handle --init mode
|
|
if [ "${1:-}" = "--init" ]; then
|
|
MESH_JSON="${2:-mesh.json}"
|
|
|
|
if [ ! -f "$MESH_JSON" ]; then
|
|
echo "❌ $MESH_JSON not found"
|
|
exit 1
|
|
fi
|
|
|
|
echo "🚀 Initializing mesh state repository..."
|
|
squads=$(jq -r '.squads | keys[]' "$MESH_JSON")
|
|
|
|
# Create squad directories with placeholder SUMMARY.md
|
|
for squad in $squads; do
|
|
if [ ! -d "$squad" ]; then
|
|
mkdir -p "$squad"
|
|
echo " ✓ Created $squad/"
|
|
else
|
|
echo " • $squad/ exists (skipped)"
|
|
fi
|
|
|
|
if [ ! -f "$squad/SUMMARY.md" ]; then
|
|
echo -e "# $squad\n\n_No state published yet._" > "$squad/SUMMARY.md"
|
|
echo " ✓ Created $squad/SUMMARY.md"
|
|
else
|
|
echo " • $squad/SUMMARY.md exists (skipped)"
|
|
fi
|
|
done
|
|
|
|
# Generate root README.md
|
|
if [ ! -f "README.md" ]; then
|
|
{
|
|
echo "# Squad Mesh State Repository"
|
|
echo ""
|
|
echo "This repository tracks published state from participating squads."
|
|
echo ""
|
|
echo "## Participating Squads"
|
|
echo ""
|
|
for squad in $squads; do
|
|
zone=$(jq -r ".squads.\"$squad\".zone" "$MESH_JSON")
|
|
echo "- **$squad** (Zone: $zone)"
|
|
done
|
|
echo ""
|
|
echo "Each squad directory contains a \`SUMMARY.md\` with their latest published state."
|
|
echo "State is synchronized using \`sync-mesh.sh\` or \`sync-mesh.ps1\`."
|
|
} > README.md
|
|
echo " ✓ Created README.md"
|
|
else
|
|
echo " • README.md exists (skipped)"
|
|
fi
|
|
|
|
echo ""
|
|
echo "✅ Mesh state repository initialized"
|
|
exit 0
|
|
fi
|
|
|
|
MESH_JSON="${1:-mesh.json}"
|
|
|
|
# Zone 2: Remote-trusted — git clone/pull
|
|
for squad in $(jq -r '.squads | to_entries[] | select(.value.zone == "remote-trusted") | .key' "$MESH_JSON"); do
|
|
source=$(jq -r ".squads.\"$squad\".source" "$MESH_JSON")
|
|
ref=$(jq -r ".squads.\"$squad\".ref // \"main\"" "$MESH_JSON")
|
|
target=$(jq -r ".squads.\"$squad\".sync_to" "$MESH_JSON")
|
|
|
|
if [ -d "$target/.git" ]; then
|
|
git -C "$target" pull --rebase --quiet 2>/dev/null \
|
|
|| echo "⚠ $squad: pull failed (using stale)"
|
|
else
|
|
mkdir -p "$(dirname "$target")"
|
|
git clone --quiet --depth 1 --branch "$ref" "$source" "$target" 2>/dev/null \
|
|
|| echo "⚠ $squad: clone failed (unavailable)"
|
|
fi
|
|
done
|
|
|
|
# Zone 3: Remote-opaque — fetch published contracts
|
|
for squad in $(jq -r '.squads | to_entries[] | select(.value.zone == "remote-opaque") | .key' "$MESH_JSON"); do
|
|
source=$(jq -r ".squads.\"$squad\".source" "$MESH_JSON")
|
|
target=$(jq -r ".squads.\"$squad\".sync_to" "$MESH_JSON")
|
|
auth=$(jq -r ".squads.\"$squad\".auth // \"\"" "$MESH_JSON")
|
|
|
|
mkdir -p "$target"
|
|
auth_flag=""
|
|
if [ "$auth" = "bearer" ]; then
|
|
token_var="$(echo "${squad}" | tr '[:lower:]-' '[:upper:]_')_TOKEN"
|
|
[ -n "${!token_var:-}" ] && auth_flag="--header \"Authorization: Bearer ${!token_var}\""
|
|
fi
|
|
|
|
eval curl --silent --fail $auth_flag "$source" -o "$target/SUMMARY.md" 2>/dev/null \
|
|
|| echo "# ${squad} — unavailable ($(date))" > "$target/SUMMARY.md"
|
|
done
|
|
|
|
echo "✓ Mesh sync complete"
|