#!/bin/sh # dev bootstrap: # - create accounts (alice, bob, charlie, david) # - write verified committer email fixtures for Deliberi # - write OWNER_DID to /shared/owner-did (for knot/spindle) # - create system label definitions under SYSTEM_DID set -eu . /scripts/lib.sh USERS="alice bob charlie david" OWNER_USER="${OWNER_USER:-alice}" SYSTEM_USER="${SYSTEM_USER:-alice}" SHARED_DIR="${SHARED_DIR:-/shared}" VERIFIED_EMAILS_FILE="${SHARED_DIR}/verified-emails.jsonl" VERIFIED_EMAILS_TMP="${VERIFIED_EMAILS_FILE}.tmp" TRANQUIL_PASSWORD="${TRANQUIL_PASSWORD:-Tangled-Dev9}" mkdir -p "$SHARED_DIR" : > "$VERIFIED_EMAILS_TMP" ACCOUNTS_FILE="${SHARED_DIR}/accounts.tsv" sh /scripts/add-accounts.sh $USERS > "$ACCOUNTS_FILE" cat "$ACCOUNTS_FILE" >&2 OWNER_DID="" SYSTEM_DID="" while IFS="$(printf '\t')" read -r u did; do [ -n "$u" ] || continue jq -cn \ --arg did "$did" \ --arg email "${u}@${PDS_HOSTNAME}" \ '{did: $did, email: $email}' >> "$VERIFIED_EMAILS_TMP" if [ "$u" = "$OWNER_USER" ]; then OWNER_DID="$did" fi if [ "$u" = "$SYSTEM_USER" ]; then SYSTEM_DID="$did" fi done < "$ACCOUNTS_FILE" [ -n "$OWNER_DID" ] || { printf 'OWNER_USER %s not in USERS list\n' "$OWNER_USER" >&2; exit 1; } [ -n "$SYSTEM_DID" ] || { printf 'SYSTEM_USER %s not in USERS list\n' "$SYSTEM_USER" >&2; exit 1; } mv "$VERIFIED_EMAILS_TMP" "$VERIFIED_EMAILS_FILE" printf '[emails] wrote verified committer fixtures for %s\n' "$USERS" >&2 printf '%s' "$OWNER_DID" > "${SHARED_DIR}/owner-did" printf '[owner] %s → %s/owner-did\n' "$OWNER_USER" "$SHARED_DIR" >&2 printf '%s' "$SYSTEM_DID" > "${SHARED_DIR}/system-did" printf '[system] %s → %s/system-did\n' "$SYSTEM_USER" "$SHARED_DIR" >&2 # tranquil-pds account helper: same shape as add-accounts.sh, but against # tranquil's own URL/hostname, password, and no invite code. ensure_tranquil_account() { username="$1" handle="${username}.${TRANQUIL_HOSTNAME}" email="${username}@${TRANQUIL_HOSTNAME}" did=$(curl -fsS "${TRANQUIL_URL}/xrpc/com.atproto.identity.resolveHandle?handle=${handle}" \ | jq -er '.did' 2>/dev/null) || did="" if [ -n "$did" ]; then printf '[skip] %s = %s\n' "$handle" "$did" >&2 printf '%s\n' "$did" return 0 fi result=$(curl -fsS \ -H "Content-Type: application/json" \ -d "{\"email\":\"${email}\",\"handle\":\"${handle}\",\"password\":\"${TRANQUIL_PASSWORD}\"}" \ "${TRANQUIL_URL}/xrpc/com.atproto.server.createAccount") did=$(printf '%s\n' "$result" | jq -er '.did') printf '[create] %s = %s (password: %s)\n' "$handle" "$did" "$TRANQUIL_PASSWORD" >&2 printf '%s\n' "$did" } # label definitions (under SYSTEM_DID) put_record "at://$SYSTEM_DID/sh.tangled.label.definition/wontfix" "$(cat </dev/null put_record "at://$SYSTEM_DID/sh.tangled.label.definition/good-first-issue" "$(cat </dev/null put_record "at://$SYSTEM_DID/sh.tangled.label.definition/duplicate" "$(cat </dev/null put_record "at://$SYSTEM_DID/sh.tangled.label.definition/documentation" "$(cat </dev/null put_record "at://$SYSTEM_DID/sh.tangled.label.definition/assignee" "$(cat </dev/null # shared env values for appview LABEL_GFI=at://${SYSTEM_DID}/sh.tangled.label.definition/good-first-issue LABEL_DEFAULTS=$LABEL_GFI LABEL_DEFAULTS=$LABEL_DEFAULTS,at://${SYSTEM_DID}/sh.tangled.label.definition/assignee LABEL_DEFAULTS=$LABEL_DEFAULTS,at://${SYSTEM_DID}/sh.tangled.label.definition/documentation LABEL_DEFAULTS=$LABEL_DEFAULTS,at://${SYSTEM_DID}/sh.tangled.label.definition/duplicate LABEL_DEFAULTS=$LABEL_DEFAULTS,at://${SYSTEM_DID}/sh.tangled.label.definition/wontfix printf '%s' "$LABEL_GFI" > "${SHARED_DIR}/label-gfi" printf '%s' "$LABEL_DEFAULTS" > "${SHARED_DIR}/label-defaults" printf '[env] wrote label-defaults, label-gfi\n' >&2 # service definitions (under OWNER_DID) put_record "at://$OWNER_DID/sh.tangled.knot/$KNOT_HOSTNAME" "{\"createdAt\": \"${CREATED_AT}\"}" >/dev/null put_record "at://$OWNER_DID/sh.tangled.spindle/$SPINDLE_HOSTNAME" "{\"createdAt\": \"${CREATED_AT}\"}" >/dev/null # tranquil-pds: basic account for org/delegation testing if [ -n "${TRANQUIL_URL:-}" ]; then ensure_tranquil_account troy >/dev/null fi printf 'done.\n' >&2