uwarp-space 2026-02-20
SysOp REST API added, 199+ new unit tests, core models migrated to attrs, and xterm upgraded to v6
563 files · 19,302+ · 2,491-

SysOp management REST API

3 files changed
  • router.py SysOp Management REST API on port 2106
  • test_system.py 51-line system test for sysop API
  • conftest.py Sysop test fixtures
  • Added SysOp Management REST API on port 2106 (feat: add SysOp Management REST API) interface behavioral
    1 file
    • router.py
  • Merged as PR #5 from sysop-api branch interface behavioral
    1 file
    • router.py
  • Added tests/sysop/test_system.py (51 lines) qualify internal
    1 file
    • test_system.py

TW2002 parity — command and UI

10 files changed
  • movement.py Autopilot from Move command: typing destination auto-routes the ship
  • info.py Planet help menu: ? and ! show planhelp.txt box-drawn menu
  • purchases.py Shipyard B/S/E/R sub-menu with correct prompt text
  • bank.py Bank fund transfer: target name, amount, Y/N confirm flow
  • police.py Police Claim/Post Reward matching TW2002 UI format
  • tavern.py Tavern key-based menu (A/B/C/E/G/T/U/;/Q); CinePlex AttenDroid host, 5 TW2002 movies
  • trading.py Port entry menu: Attack/Trade/Quit choices; port trading parity fixes
  • deploy.py Cloaking device logout prompt (TW2002 parity)
  • display.py G/K table format and beacon character limit
  • terminal.html Pregame settings screen expanded; single-keypress menu navigation
  • Autopilot from Move command: typing a destination now automatically routes the ship specify behavioral
    1 file
    • movement.py
  • Planet help menu: ? and ! show planhelp.txt box-drawn menu decouple behavioral
    1 file
    • info.py
  • Shipyard B/S/E/R sub-menu with correct prompt text remediate behavioral
    1 file
    • purchases.py
  • Port entry menu: Attack/Trade/Quit choices with proper offer prompt spacing decouple behavioral
    1 file
    • trading.py
  • Police Claim/Post Reward matching TW2002 UI format decouple errata
    1 file
    • police.py
  • Bank fund transfer: target name, amount, Y/N confirm flow decouple internal
    1 file
    • bank.py
  • Cloaking device logout prompt (TW2002 parity) decouple behavioral
    1 file
    • deploy.py
  • G/K table format, beacon character limit, Tavern key-based menu (A/B/C/E/G/T/U/;/Q) margin errata
    2 files
    • display.py
    • tavern.py
  • CinePlex AttenDroid host, 5 TW2002 movies, updated tests qualify internal
    1 file
    • tavern.py
  • Corp menu C.E.O. capitalization fix remediate internal
    1 file
    • registry.py
  • Ether probe path traversal, genesis XP/ownership, planet production table decouple internal
    1 file
    • resources.py
  • Pregame settings screen expanded to match TW2002 format; single-keypress menu navigation baseline errata
    1 file
    • terminal.html
  • Port trading parity: correct class extraction, skip-buying logic, prompt format remediate errata
    1 file
    • trading.py

Core models migrated to attrs

5 files changed
  • player.py Player model migrated from dataclasses to attrs
  • planet.py Planet model migrated to attrs
  • sector.py Sector model migrated to attrs
  • context.py Engine context state migrated to attrs
  • locking.py Locking state migrated to attrs
  • Migrated core models and engine state from dataclasses to attrs for better validation and frozen records decouple internal
    3 files
    • player.py
    • planet.py
    • sector.py
  • Minor import ordering and f-string cleanup accompanying the migration deprecate errata
    2 files
    • player.py
    • context.py

199+ new unit tests

12 files changed
  • test_planet_rules.py 45 tests for planet rules
  • test_hardware_shipyard.py 89 tests for hardware, shipyard, corporation, and encounter rules
  • test_banking.py 58 tests for ranks, banking, bounty, and robbery rules
  • test_ticks.py 66 tests for game maintenance tick functions
  • test_movement_deploy.py 31 tests for movement and deploy rules
  • test_combat.py 25 tests for combat rules
  • test_core_models.py 28 tests for core gameplay models
  • test_trading_stats.py 23 tests for trade action and commodity validation helpers
  • test_trading_formulas.py 39 tests for combat probability and trade pricing formulas
  • test_stats.py 21 tests for metrics calculator and data provider
  • test_encounter.py 18 tests for entity locking system (EntityKey and LockManager)
  • test_alien_races.py 105-line rework of alien races sysop tests
  • 45 tests for planet rules qualify internal
    1 file
    • test_planet_rules.py
  • 89 tests for hardware, shipyard, corporation, and encounter rules qualify internal
    1 file
    • test_hardware_shipyard.py
  • 58 tests for ranks, banking, bounty, and robbery rules qualify internal
    2 files
    • test_banking.py
    • test_bounty_robbery.py
  • 66 tests for game maintenance tick functions qualify internal
    1 file
    • test_ticks.py
  • 31 tests for movement and deploy rules qualify internal
    1 file
    • test_movement_deploy.py
  • 25 tests for combat rules qualify internal
    1 file
    • test_combat.py
  • 28 tests for core gameplay models qualify internal
    1 file
    • test_core_models.py
  • 23 tests for trade action and commodity validation helpers qualify internal
    1 file
    • test_trading_stats.py
  • 39 tests for combat probability and trade pricing formulas qualify internal
    1 file
    • test_trading_formulas.py
  • 21 tests for metrics calculator and data provider qualify internal
    1 file
    • test_stats.py
  • 18 tests for entity locking system (EntityKey and LockManager) qualify internal
    1 file
    • test_encounter.py
  • 23 tests for shared engine command helpers qualify behavioral
    1 file
    • test_alien_races.py
  • 28 tests for decay tick functions (bust, radiation, cloaking, alien) qualify internal
    1 file
    • test_ticks.py
  • 23 tests for console configuration and hardware catalog helpers qualify internal
    1 file
    • test_hardware_shipyard.py
  • 41 tests for NPC helpers, theme utilities, and TriCront slot machine qualify internal
    2 files
    • test_tricront_helpers.py
    • test_theme_utils.py
  • 44 tests for stats, targeting, and index sync qualify internal
    2 files
    • test_stats.py
    • test_targeting.py
  • 19 tests for GameState helper functions qualify internal
    1 file
    • test_core_models.py
  • 14 tests for maintenance tick helpers qualify internal
    1 file
    • test_ticks.py
  • 12 tests for ship capture and psychic probe rules qualify internal
    1 file
    • test_capture_psychic.py
  • 10 tests for psychic probe rules qualify internal
    1 file
    • test_psychic.py
  • 11 tests for ANSI color conversion utilities qualify internal
    1 file
    • test_ticks.py
  • 6 tests for MOTD loading qualify internal
    1 file
    • test_motd.py

xterm v6 upgrade and mobile terminal

2 files changed
  • terminal.js xterm upgraded to v6; mobile font scaling and touch fixes
  • terminal.html visualViewport used for keyboard height tracking; pull-to-refresh suppressed

Test infrastructure fixes

3 files changed
  • test_ssh_transport.py Stale asyncio module-level mark removed
  • test_multi_session.py test_21_messages_rest_endpoint made self-contained for xdist
  • test_file_locking_stress.py Moved from test_data/ to tests/fixtures/
  • Replaced invalid LogAction.CANCEL/BACKUP with valid enum values remediate internal
    1 file
    • test_multi_session.py
  • Made test_21_messages_rest_endpoint self-contained for xdist decouple internal
    1 file
    • test_multi_session.py
  • Removed stale asyncio module-level mark from test_ssh_transport decouple internal
    1 file
    • test_ssh_transport.py
  • Replaced deprecated datetime.utcnow(), fixed test return-value warnings qualify behavioral
    1 file
    • test_multi_session_e2e.py
  • Moved test fixtures from test_data/ to tests/fixtures/ qualify internal
    1 file
    • test_file_locking_stress.py
  • Fixed stale test markers and warp slot count bug from attrs migration qualify internal
    1 file
    • test_ssh_transport.py

Binary data and QA

2 files changed
  • game_state.py Sector warp slots off-by-one in sqlite.py (6→7); QA report updated
  • _loader_dat.py Data loader fixes
  • Sector warp slots off-by-one in sqlite.py (6→7) decouple internal
    1 file
    • game_state.py
  • Comprehensive QA report updates marking resolved MAJOR issues remediate internal
    1 file
    • qa-comparison-report.md