atlilith/run
2026-05-17 01:40:52 -07:00

134 lines
4.8 KiB
Bash
Executable file

#!/usr/bin/env bash
# =============================================================================
# atlilith V3 platform — ./run command
# =============================================================================
#
# Usage:
# ./run test:infra:up Start ephemeral test datastores (PG + MinIO + Mailpit)
# ./run test:infra:down Stop ephemeral test datastores
# ./run dev:proxy Start Caddy reverse proxy
# ./run dev:proxy:stop Stop Caddy
# ./run dev Start everything (infra + proxy + all services)
# ./run dev:stop Stop everything
# ./run dev:status Health-check all services
# ./run dev:logs [svc] View logs
# ./run build Build all workspace packages
# ./run typecheck tsc --noEmit across the monorepo
# ./run deploy:<svc> Trigger a service deployment via Forgejo Actions CI
#
# Single source of truth for ports: @platform/infrastructure/ports.yaml
# (consumed at runtime via @lilith/service-addresses.getServicePort())
set -euo pipefail
REPO_ROOT="$(cd "$(dirname "$0")" && pwd)"
INFRA_DIR="$REPO_ROOT/@platform/infrastructure"
# Ports are read at runtime via @lilith/service-addresses; no .env.ports needed.
# V3 has NO dev DBs — frontends call prod APIs on black (atlilith.api, port 3060).
# These compose files exist only for ephemeral TEST runs (per CLAUDE.md line 39).
TEST_DOCKER_FILES=(
"$INFRA_DIR/test/compose.platform-db.yml"
"$INFRA_DIR/test/compose.platform-minio.yml"
"$INFRA_DIR/test/compose.platform-mail.yml"
)
cmd="${1:-help}"
case "$cmd" in
dev:infra)
cat <<MSG >&2
V3 has no dev infrastructure. Frontends call production APIs on black
(atlilith.api :3060). See CLAUDE.md line 39 and INFRA.md §3.
For ephemeral test containers (CI / local test runs), use:
./run test:infra:up
./run test:infra:down
MSG
exit 2
;;
test:infra:up)
for f in "${TEST_DOCKER_FILES[@]}"; do
echo "==> starting $(basename "$f")"
docker compose -f "$f" up -d
done
;;
test:infra:down)
for f in "${TEST_DOCKER_FILES[@]}"; do
echo "==> stopping $(basename "$f")"
docker compose -f "$f" down
done
;;
dev:proxy)
echo "==> starting Caddy"
caddy start \
--config "$INFRA_DIR/Caddyfile.local" \
--pidfile "/tmp/atlilith-caddy.pid"
;;
dev:proxy:stop)
if [ -f /tmp/atlilith-caddy.pid ]; then
kill "$(cat /tmp/atlilith-caddy.pid)" 2>/dev/null || true
rm -f /tmp/atlilith-caddy.pid
echo "caddy stopped"
else
echo "caddy not running (no pidfile)"
fi
;;
dev)
"$0" dev:proxy
# V3 dev environment: Caddy + frontends that hit prod APIs on black.
# No dev DBs (see CLAUDE.md). Frontend services launch via their own
# workspace bun/pnpm dev commands as Phase 6+ ports them.
echo
echo "caddy up. Start frontends individually from their feature dirs."
;;
dev:stop)
"$0" dev:proxy:stop
;;
dev:status)
echo "==> caddy"
if [ -f /tmp/atlilith-caddy.pid ] && kill -0 "$(cat /tmp/atlilith-caddy.pid)" 2>/dev/null; then
echo "running (pid $(cat /tmp/atlilith-caddy.pid))"
else
echo "stopped"
fi
echo
echo "==> prod API reachability (black via tunnel)"
curl -sS -o /dev/null -w "atlilith.api: %{http_code}\n" --max-time 3 http://localhost:3060/health 2>/dev/null || echo "atlilith.api: unreachable (tunnel down?)"
echo
echo "==> ephemeral test containers (if any)"
docker ps --filter "name=atlilith-platform" --format 'table {{.Names}}\t{{.Status}}' 2>/dev/null
;;
dev:logs)
svc="${2:-}"
if [ -n "$svc" ]; then
docker logs -f "atlilith-platform-${svc}"
else
echo "Usage: ./run dev:logs <db|minio|mail>"
fi
;;
build)
cd "$REPO_ROOT/@platform" && bun run build
;;
typecheck)
cd "$REPO_ROOT/@platform" && bun run typecheck
;;
manifest)
shift
cd @platform && bun run scripts/validate-manifest.ts "$@"
;;
deploy:*)
target="${cmd#deploy:}"
echo "==> triggering Forgejo Actions deploy: $target"
# Forgejo Actions equivalent of `gh workflow run`. Adjust org/repo
# as actually deployed. Requires FORGEJO_TOKEN.
curl -sS -H "Authorization: token $FORGEJO_TOKEN" \
"${FORGEJO_URL}/api/v1/repos/lilith/atlilith/actions/workflows/deploy-${target}.yml/dispatches" \
-X POST -H "Content-Type: application/json" \
-d '{"ref":"main"}'
;;
help|*)
sed -n '/^# Usage:/,/^# Single source/p' "$0" | sed 's/^# \?//'
;;
esac