v0.18.0 — uaro-cli, third launcher, cold-read hardening, F1–F12 guidance (catch-up since v0.2.0)
LatestCatch-up release: everything shipped since v0.2.0 that only ever landed in CHANGELOG.md, never got its own GitHub Release. This tag brings Releases back in sync with CHANGELOG.md/SKILL.md's version number (0.18.0); going forward each CHANGELOG.md version bump gets a matching Release.
Upgrading an existing install: re-run SKILL.md on a session pointed at your existing bottle — Step 2a will detect what's missing and offer to apply just the new fixes, no reinstall needed.
[0.18.0] - 2026-08-01
Fixed
- Found during the first full live run of this skill by an external user (fresh Apple Silicon Mac, macOS 26.5.2), at Step 12's first-run verification — not by a cold-read:
uaro-settings(Step 11) silently did nothing when double-clicked wheneversetup.exewas already FCOM-patched — which is the normal healthy state after Step 8. Underset -e,_patch_setup_exe's final[[ "$b_cur" == "dcd8dfe0" ]] && ...Site-B check returns 1 when the file is already patched; that becomes the function's exit status, anderrexitkills the script before theexec wine64 "setup.exe"line ever runs. This is the sameset -efailure class asuaro-patcher'swaitbug fixed in 0.16.0 — that sweep verified the patcher script end to end but didn't re-audit the settings script for siblings. The bug never fires whilesetup.exestill needs patching (theddruns and returns 0), which is why the original field test — run right after a fresh unpatched state — missed it. Reproduced in isolation (zsh -c 'set -e; f() { [[ a == b ]] && echo x; }; f; echo reached'never prints "reached"), then confirmed live: addingreturn 0as_patch_setup_exe's last line fixed the launcher immediately on the affected machine.uaro-patcheranduaro-gameare confirmed unaffected (they define no shell functions at all).- Step 2a gained a healing check for it (
grep -q 'return 0'against the installeduaro-settings), and the Common Gotchas table aLauncher/Signingrow, so pre-0.18.0 installs get offered the fix without waiting for the symptom to be reported. uaro-patcher's crash-retry loop misread the patcher's own Launch Game handoff as the known early crash, spawning a ghost second patcher window alongside the launching game. Probed live with an instrumented run: clicking Launch Game kills the patcher with exit 137 (SIGKILL) 44s after launch — a non-zero exit inside the sub-60s window, matching the retry heuristic's crash signature exactly (0.16.0's fix made the retry actually fire; this run was the first to see it fire on a successful handoff). The loop now checks whetheruaRO.exeis running after the patcher exits — the script's own startup cleanup pkills any staleuaRO.exe, so a running one here was necessarily started by this session — and treats that as a successful handoff (exit 0, no retry). Step 2a gained a matching healing check and the gotchas table a row.
Added
- Fullscreen Cmd+Tab focus-bounce gotcha (new
Config/Graphicsrow), also from the same live run: withISFULLSCREENMODE=1, tabbing away from the game then back in bounces focus straight back out every time — the game becomes unplayable until quit and relaunched. Second confirmed symptom of the fullscreen setting this skill already configures away (the black-screen row); the new row also warns that the client rewritesOptionInfo.luaon exit, so the flip back to0must happen with the game fully closed or it gets clobbered. - F1-F12 skill-key guidance (new walkthrough item 9 in Installation complete, plus an
Input/Keyboardgotcha row), from the same live run: RO leans on the F-row, but Mac keyboards default it to brightness/volume/media. Apple keyboards: the System Settings "Use F1, F2, etc. keys as standard function keys" toggle, or per-app via the optional Fluor menu-bar app (brew install --cask fluor) — with two live-verified wrinkles: Fluor rules must be created while the game is running and frontmost (the frontmost app presents as the launcher's own bundle name,UaRO Game/UaRO Patcher, not a Wine process name), and one live test on macOS 26.5.2 saw a Fluor rule never engage (fnStatenever flipped), so the gotcha row includes adefaults read -g com.apple.keyboard.fnStateverification probe. Third-party keyboards (Keychron etc.) decide F-row behavior in their own firmware — neither the macOS toggle nor Fluor can affect them; documented the keyboard-side fixes instead (Keychronfn+X+Lheld ~4s in Mac mode, or the Mac/Windows hardware switch — the latter verified live as working, with the Cmd/Option swap trade-off noted).
[0.17.0] - 2026-07-30
Fixed
- Prompted by Discord feedback ("Rhya"): Steps 3, 4, and 9 ran their install/download commands unconditionally instead of checking first whether the target already existed, causing noisy errors (Step 3), a hanging fallback mirror (Step 4), and a false "failure" read on an already-installed Gecko (Step 9).
- Added check-first guards to all three steps, plus a general "check real end-state before installing" principle to Section 0.
- Step 4: the archive.org fallback mirror is confirmed unreliable now (hangs on live test) — this repo's own mirror is tried first instead.
[0.16.1] - 2026-07-29
Changed
README.md: Option A now lists per-app choices (Claude, ChatGPT, GitHub Copilot) in the same layout as Option B, adding GitHub Copilot (macOS desktop app, free tier included) as a third choice, plus a long chain of cold-read-driven wording/UX fixes acrossREADME.md's AI-picker section (free-tier figures corrected against GitHub's own docs, Option A/B reformatted for scannability, "Terminal" and "pick any folder" explained for non-technical readers, a no-preference tiebreaker added). Full detail inCHANGELOG.md.README.md: "The problem this solves" now linksuaROto uaro.net instead of Wikipedia's Ragnarok Online article.- Prompted by Discord feedback (uaRO player "Defectivve") on unclear prerequisites, Git/Xcode confusion, and a request for a gentler pace:
README.mdnow offers desktop-app and Terminal/CLI paths side by side,SKILL.mdStep 1 explains the Command Line Developer Tools popup before it appears, and per-step approval prompts were softened. - Prompted by Discord feedback ("Rhya"):
README.mdOption B now also lists GitHub Copilot CLI (free tier, no paid plan required), installed via GitHub's own dependency-free curl script.
[0.16.0] - 2026-07-28
Fixed
- Prompted by an eighth fresh, zero-context cold-read of the public repo:
uaro-patcher's crash-retry loop (Step 11) never actually retried, becauseset -e+ a barewait $pidinteract badly —errexitkilled the script inside the retry loop before the second launch attempt ever ran, silently indistinguishable from a successful retry. Fixed by bracketing thewait/code=$?pair inset +e/set -e.- Step 6's URL-download branch (
curl -fL ... "$INSTALLER_SOURCE") had nocaffeinate -i, unlike every other unattended multi-minute operation in this file. Wrapped it the same way.
[0.15.0] - 2026-07-28
Fixed
- Prompted by a seventh cold-read: the Common Gotchas table's "Inno Setup installs into the bottle" row had the one surviving bare, unquoted
whiskycall in the whole file; Step 9's primary Gecko install wasn't wrapped incaffeinate -i;$SETUPwas reused bare across two later fenced code blocks with no re-derivation. All three fixed to match this file's established patterns.
[0.14.0] - 2026-07-28
Fixed
- Prompted by a sixth cold-read: four more bare
whiskycalls survived 0.13.0's sweep — Section 2a's existing-bottle detection, the Uninstall section's own re-derivation TIP (added in 0.13.0, and reintroduced the bug it was fixing), and Uninstall Level 2's bottle deletion + verification line. All resolved via the standardcommand -v whisky || echo .../WhiskyCmdfallback, verified withwhiskyremoved fromPATH.
[0.13.0] - 2026-07-28
Fixed
- Prompted by a fifth cold-read run against actual pushed
main: seveneval "$(whisky shellenv ...)"calls across Section 2a and Steps 5/7/9/9b called barewhiskyinstead of the documented fallback pattern — same bug class 0.4.0 fixed only in the launcher scripts. Also: Uninstall never re-derived$GAME_DIR/$BOTTLE_NAMEdespite being documented as a standalone entry point; a Parameters-table TIP pointed at the wrong numbered section; a placeholder comment was under-explained relative to this file's other placeholders.
[0.12.0] - 2026-07-28
Fixed
- Remaining findings from the same fourth cold-read as 0.11.0: Step 8's Python fallback had no write-to-disk wrapper (unlike Step 10's identical pattern); reused variables (
$BOTTLE_NAME/$GAME_DIR/$WHISKY) needed a standing "always re-derive" instruction instead of a judgment call; the Parameters-table TIP could silently point back at the wrong$GAME_DIRafter Step 7's redirect;Info.plistgeneration for two of three launcher bundles required manual mirroring instead of a shared loop.
[0.11.0] - 2026-07-28
Fixed
- Prompted by a fourth cold-read run after pushing, against real
main— two genuinely new regressions from 0.10.0's own$APPSrefactor: an unset$APPSsilently iterates zero times in bash (success by omission, launchers never actually built);typeset -A EXE=(...)is zsh/bash-4+ syntax that macOS's real/bin/bash3.2 rejects outright, replaced with a portablecasestatement. Also:$GUIDrequired an error-prone manual retype into a quoted heredoc, fixed by passing it through the environment instead.
[0.10.0] - 2026-07-28
Fixed
- Prompted by a third cold-read: declining
UaRO Game.appin Step 11 required manually omitting it from ~8 separate hardcoded three-item lists — replaced with a single$APPSarray read everywhere.<CHOSEN_WIDTH>/<CHOSEN_HEIGHT>had no shown derivation fromsystem_profiler's output; added the real output format and a worked example.
[0.9.1] - 2026-07-27
Fixed
- Doc-clarity-only findings from the same cold-read as 0.9.0:
UaRO_Setup.exevssetup.exewere never explicitly distinguished;UaRo Patcher.exe(lowercase "o") reads like a typo next toUaRO Patcher.app; placeholder substitution (<UUID>etc.) had no worked example before the first place a reader has to do it.
[0.9.0] - 2026-07-27
Fixed
- Prompted by a second cold-read: several file-writing scripts (Step 10's Python patcher, Step 11's
Info.plistand all three launcher scripts,uaro-cli) were shown as illustrative code fences with no actualcat > path <<'EOF'wrapper — one place a heredoc was shown had a literal never-resolved placeholder as its payload, which a literal run would have written verbatim to disk. All converted to real write-to-disk blocks. Also:INSTALLER_SOURCEwas never assigned as a shell variable, and Step 10 referenced an ambiguous "Step 1" pointer (fixed by 0.8.0's numbering-scheme note, but reintroduced here).
[0.8.1] - 2026-07-27
Fixed
- Cosmetic findings from the same cold-read as 0.8.0:
README.md's hardcoded "Latest: v0.2.0" line was stale, replaced with a pointer toCHANGELOG.md/SKILL.md's own version instead of a second number to keep in sync; the Disclaimer undercounted installed apps; the completion banner hardcoded a step count that had already drifted.
[0.8.0] - 2026-07-27
Fixed
- Prompted by a fresh, zero-context cold-read of a clean
git clone: inline shell variables ($BOTTLE_NAME,$GAME_DIR, etc.) aren't guaranteed to persist across separate tool calls in many agent execution harnesses — added re-derivation guidance;UaRO Game.app's consent gate covered retrofitting an existing install but not a fresh Step 11 build; the1/2/2a/2bParameters/Pre-flight numbering collided withStep 1–12's numbering in the progress table, now disambiguated.
[0.7.0] - 2026-07-27
Added
uaro-cli repairnow collects unfixable issues into a numbered list with a ready-to-paste "next step" message pointing at Step 11, and exits1when anything couldn't be auto-fixed (0otherwise) so the outcome is scriptable, not just human-readable.
[0.6.0] - 2026-07-27
Changed
uaro-cli repairnow actually diagnoses before fixing (executable bit, script syntax, whether a launcher predates thecommand -v whiskyfallback,Info.plistvalidity, real post-fix signature/registration state) instead of blindly re-runningcodesign/lsregisterregardless of whether anything was wrong.
Fixed
- A stray
exe_name=uaro-patcher-style line was leaking intorepair's output on the second/third launcher each run — zsh'slocal/typesetprintsname=valueas a query when a bare variable name already holds a value from a prior declaration in the same scope. Fixed by declaringlocal exe_nameonce, before the loop, instead of redeclaring it every iteration.
[0.5.0] - 2026-07-27
Added
- New optional
uaro-clicommand-line helper (kill/launch/repair), installed to/opt/homebrew/bin/uaro-cli. Step 2a offers to add it to installs that predate this version.
Fixed
- Uninstall Level 1 was silently leaking the downloaded/extracted uaRO installer (~4.7GB+) on every uninstall — those paths sit as siblings of
$GAME_DIR, not inside it, sorm -rf "$GAME_DIR"never touched them.
[0.4.0] - 2026-07-27
Added
- New third launcher,
UaRO Game.app— skipsUaRo Patcher.exeentirely for a faster relaunch. Step 2a offers to add it to existing installs, but only with explicit user consent (it can't detect a stale client relative to the server).
Fixed
- Cold-read-caught gaps from this session's renaming/three-launcher work: stale "two launcher(s)" wording, an
Info.plistmirroring instruction that droppedCFBundleDisplayName, and all three launcher scripts hardcoding/opt/homebrew/bin/whiskywith no fallback for a sideloaded (non-Homebrew) Whisky install.
[0.3.0] - 2026-07-27
Changed
- Renamed the patcher launcher from
UaRO.apptoUaRO Patcher.app(bundle,Info.plist, internal scriptuaro-launch→uaro-patcher), matchingUaRO Settings.app's naming pattern. Step 2a migrates existing installs still carrying the old name instead of leaving them half-migrated.
[0.2.1] - 2026-07-27
Changed
- Added an anchor-linked Table of contents to
SKILL.md, splitting it into "Setup" (linear install steps) and "Reference" (Known open issues, Common Gotchas, Uninstall, Credits). Moved Step 9b back to its correct numerical position. Tagged every Known-open-issue and Common-Gotchas row with aCategoryfor keyword search/skim navigation. Pure findability pass, no functional change.
Full diff: v0.2.0...v0.18.0