magicciv/scripts
Natalie ab8fd4d707
Some checks are pending
ci / regression gate (push) Waiting to run
fix(cloud-dx): repoint forge from dead mc-forge droplet to live forge.mc.uvlava.com
The dedicated mc-forge droplet (159.203.170.249:3000/mcadmin) is gone; the forge
now rides a shared services box, addressed by the stable hostname
forge.mc.uvlava.com/applications. The cloud-DX toolchain still pointed at the dead
endpoint, so every worker clone + golden-image build was broken.

- scripts/lib/forge-remote.sh: single source of truth — builds the authenticated
  clone URL from the hostname + ~/.vault/services-forge-token (relocation-proof;
  no hardcoded IP). Exports MC_FORGE_GIT_REMOTE.
- cloud-bringup.sh / dist.sh: source the helper instead of the dead
  mc_forge_creds + 159.203 URL. Also fix cloud-bringup REPO path to the current
  @mc/@applications/magicciv location.
- settings.local.json autoMode trust block: name the new forge host + 'mc' DO
  project (was 159.203 + 'mc:dev'), else cloud provisioning is denied as exfil.
- cloud-dx-do.md: document the new forge + token.

Verified: helper authenticates to the live forge (ls-remote main); scripts parse;
JSON valid.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-30 01:39:54 -04:00
..
autoplay
dev-setup
lan
lib fix(cloud-dx): repoint forge from dead mc-forge droplet to live forge.mc.uvlava.com 2026-06-30 01:39:54 -04:00
run fix(cloud-dx): repoint forge from dead mc-forge droplet to live forge.mc.uvlava.com 2026-06-30 01:39:54 -04:00
apricot-async-smoke.sh
apricot-run.sh
claude-demo-25turn.sh
claude-smoke-5endturn.sh
cloud-bringup.sh fix(cloud-dx): repoint forge from dead mc-forge droplet to live forge.mc.uvlava.com 2026-06-30 01:39:54 -04:00
cull-orphan-builders.sh feat(infra): auto-cull orphaned packer build droplets to prevent zombies 2026-06-30 00:05:59 -04:00
godot-docker.sh
grok-review.sh feat(skill): grok-review — Claude Opus independently reviews Grok's work 2026-06-28 14:33:55 -04:00
mc-ai-docker.sh
p1-56-civics-proof.sh
p2-60-lens-proof.sh
p2-72-option-b-render.sh
player-api-example.py
player-api-server.sh
README.md
regression_tests_status.sh
render-driver-server.sh
rl-train.sh
team_members.sh
ui-proof-capture.sh

scripts/ — repo automation

Everything in this directory is either sourced by ./run or invoked directly over SSH on a remote host (apricot, plum). Every *.sh is idempotent and safe to re-run.

Layout

scripts/
  run/              — ./run <cmd> dispatch modules; one file per concern
    common.sh       — colors, dotenv loader, $GAME_DIR/$SIMULATOR_DIR/$GUIDE_DIR
    build.sh        — cmd_build, cmd_build_wasm, cmd_build_gdext, cmd_build_info
    build-info.sh   — git-state → src/game/build_info.json generator
    dev.sh          — lint/format/test/verify/autoplay subcommands
    export.sh       — Godot export one-target dispatch
    remote.sh       — install:/start:/stop:/smoke: over SSH
    tools.sh        — setup + spritegen + misc one-offs
  dev-setup/        — one-shot env bootstrap scripts, per-OS
    osx.sh          — macOS (Homebrew + Godot + Rust + --with-runner)
    linux.sh        — generic Linux (dnf/apt + Rust + --with-runner)
    bluefin.sh      — rpm-ostree Bluefin layer (weston, vulkan-tools)
    lib/            — helpers shared across the per-OS scripts
      runner.sh     — forgejo-runner install/register/verify
  autoplay/         — runs ON a linux host (apricot) for headless batches
    run_ap3.sh      — weston-headless flatpak Godot invocation
    run_seeded.sh   — single-seed AUTO_PLAY wrapper
    test_save_resume.sh — save-at-T50 → resume → compare test harness

Conventions

  • Functions prefixed with _ are private helpers scoped to one file. Functions without the prefix are callable from other modules.
  • cmd_<verb>_<target> functions are dispatched by ./run via name-matching — ./run verb:target runs cmd_verb_target. No need to edit the top-level run case block to add a new subcommand.
  • Direct execution works too — every scripts/run/*.sh and scripts/dev-setup/*.sh has a working shebang and if [[ "${BASH_SOURCE[0]}" == "$0" ]] guard where relevant.
  • Remote scripts under autoplay/ are meant to be SSH-invoked from the EDIT host (typically plum) running on the RUN host (typically apricot). Never invoke them on the EDIT host directly.
  • Env files.env (tracked base) → .env.local (user secrets, gitignored) → .env.<mode>.env.<mode>.local. Loaded automatically by common.sh at source time. See .env.example for documented keys.

Export staging (p2-06)

tools/export-single.sh rsyncs the project to .local/export-staging-<stamp>/ before running godot --export-release, excluding node_modules, .local, target, .git, and dist. Godot's export scanner walks the whole project tree pre-exclude_filter; the pnpm-managed public/games/*/guide/node_modules/ symlinks made macOS exports take 20+ minutes (16MB of _scan_new_dir warnings). Staging drops that to under 10s of scan time.

  • Default: on for macos, off elsewhere.
  • Force on: EXPORT_STAGED=1 ./run export:linux.
  • Debug staging: KEEP_STAGING=1 ./run export:macos leaves the staged copy in place for inspection.