Repository navigation
Conversation
- Fit Lab server: Host/Origin loopback guard (same rules as Content Studio) on GET/HEAD/POST, no directory listings under /data/ and /builds/, manifest and build-state errors returned as JSON, UTF-8 reads. - builds.py: clear ValueError when an item's part is missing from the mapping. - Client staging (client_import.stage, equipment.stage_equipment): check required client files before creating output; remove a partially written output folder on failure so retries work. - rebuild.py: remove staging/<id> when a patch merge fails; the Fit Lab render index ignores patch-only jobs so they never show as the newest render. - UTF-8 encoding for JSON read_text/write_text in fit-lab and uo-content; files closed with `with` in tools/vd. - Rename franchise-named outfit-lab demos to generic overalls and sci-fi plate armor (scripts, tests, launchers, docs, workspace folders). - docs/handoff.md: drop commercial pack names; add ROADMAP.md, CODE_OF_CONDUCT, SECURITY, issue templates (bug, feature, parity gap) and README badges and help-wanted section; ignore /.playwright-mcp/. - Tests for the Fit Lab host guard, directory listing, staging cleanup, failed rebuild cleanup and patch-job exclusion. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 135344efb3
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| @@ -0,0 +1,9 @@ | |||
| @echo off | |||
There was a problem hiding this comment.
Preserve CRLF in the new batch launchers
Both newly added launcher blobs use LF-only line endings, despite the project rule requiring .bat launchers to use CRLF. In source/archive checkouts without Git line-ending conversion, this violates the launcher format contract and can break Windows tooling that expects conventional batch-file endings; resave both this file and plate-armor-lab.bat with CRLF (or enforce it through .gitattributes).
AGENTS.md reference: AGENTS.md:L3-L7
Useful? React with 👍 / 👎.
Change
tools/fit-lab/run.py): the handler moved intomake_handler()(testable; argparse now undermain()). Every GET/HEAD/POST is checked with the same Host/Origin rule as Content Studio (127.0.0.1:<port>/localhost:<port>, optional matching Origin) and gets 403 otherwise.list_directoryreturns 404, so/data/,/builds/and web folders are never listed./api/build,/api/rendersand/api/mappingnow run inside thetry, so a missing or badmanifest.jsonreturns a JSON error. Manifest reads use UTF-8.ValueErrornaming the part, item and mapping instead of a bareStopIteration.client_import.stage()checksanim.mul/anim.idx, andequipment.stage_equipment()checks those plusart.mul,artidx.mulandtiledata.mul, before anything is created. If staging fails after the output folder exists (it always comes from this call, becausestage()refuses an existing folder), that folder is removed so a retry with the same output works.rebuild.pyremovesstaging/<id>(the copy step is now inside thetryas well). The Fit LabRenderIndexskips patch-only jobs (blocksinjob.json, which only patch jobs carry), so a patch can't be listed as the newest render for an item.encoding='utf-8'on the JSONread_text/write_textcalls intools/fit-lab/*.py,tools/uo-content/pipeline.py,rebuild.py,equipment.pyandclient_import.py.withblocks intools/vd/vdtool.pyandtools/vd/mul2vd.py..gitignore:/.playwright-mcp/.build_mario.pytobuild_overalls.py,test_mario.pytotest_overalls.py, andbuild/review/test_spartan.pyto*_plate_armor.py. Launchers are nowoveralls-lab.batandplate-armor-lab.bat, and both call_shared/common.bat. Workspace output folders are nowoveralls-labandplate-armor-lab. Wording is now "plumber-style overalls" and "sci-fi plate armor", and the "Halo energy sword" labels (also inbuild_tracksuit.py) became generic.git grep -iE "mario|spartan|master chief"returns nothing.bug_report.yml,feature_request.yml,parity_gap.yml(action id, direction, slot, item, expected/actual, screenshot, with a reminder not to attach original client art) plusconfig.yml(blank issues off; Discussions and wiki links).<!-- hero-gif -->placeholder, a "Help wanted: toward UO parity" section linking ROADMAP.md, the wiki and CONTRIBUTING.md, and links to CODE_OF_CONDUCT/SECURITY.tests/unit/test_fit_lab_server.pycovers a good Host passing, foreign Host/port/Origin getting 403 on GET and POST, no directory listings, and a JSON error for a missing manifest.tests/unit/test_client_staging.pycovers each missing client file failing before any output folder exists, partial output being removed after a late failure (and the retry then succeeding), and a failed rebuild merge leaving no staging folder.test_fit_lab_renders.pygains a test that patch jobs are excluded.Verification
python -m pytest -q: 118 passed, 1 skipped (client-dependent), 3 subtests passedcd games\ultima-online\outfit-lab; python -m unittest -q: 15 tests OK (the existing ResourceWarning fromoutfit-lab/vd.pyis unchanged)python tools/agents/run.py --check: agent routers up to datepython tools/fit-lab/run.py serve --helpstill worksNot run: headless Blender builds and a live browser session against the lab. The server changes are covered by real HTTP requests in the unit tests, but no Blender render was made.
Risks and remaining work
127.0.0.1:<port>/localhost:<port>. A webview host that loads the lab under another host name would need to be added to that rule.fit_lightsaberand so on) are still in the outfit-lab code. They were outside this sweep.🤖 Generated with Claude Code