## Release v0.51.236 — Release HD (stage-q7) First Phase 3 (deep-review) release — picked by the 3-factor framework (contributor × impact × mitigated-risk): high-impact (#1952 native Windows support), backend-only (no screenshots), well-mitigated risk (POSIX path provably unchanged), from a contributor active this session (@rodboev, #3446/#3486 shipped earlier today). ### Added | PR | Author | Fix | |----|--------|-----| | #1952 | @rodboev | Native Windows support for `bootstrap.py` + the embedded terminal: POSIX-only `fcntl`/`termios`/`select` guarded behind `_TERMINAL_SUPPORTED`; terminal entry points raise `NotImplementedError`/no-op on Windows; bootstrap Windows block → warning; auto-install errors clearly on native Windows (WSL unaffected); foreground uses `Popen`+exit on Windows instead of `os.execv`. **POSIX behavior unchanged on every path.** | ### Absorbed on the way in (fix-it-ourselves, reviewed fresh) - `subprocess.CREATE_NEW_PROCESS_GROUP` → `getattr(subprocess, ..., 0)` — the constant is Windows-only, so a win32-simulating test `AttributeError`'d on Linux. Mirrors the `SO_EXCLUSIVEADDRUSE` getattr guard. - Fixed 2 over-reaching tests in `test_windows_native_support.py` — one was launching a **real installer subprocess** via an unstubbed `subprocess.run` (now stubbed; harness 2.8s vs 80s); removed unused imports. - Updated `test_onboarding_static.py` — it asserted the OLD "Native Windows is not supported" hard-block string this PR intentionally replaces; now asserts the new experimental-warning + auto-install guard. - Help-text accuracy: `--foreground` help now describes the Windows Popen path (Opus nit). ### Gate results - **Full pytest suite**: 7478 passed, 9 skipped, 3 xpassed, **0 failed** - **ruff forward gate**: CLEAN - **browser-smoke gate**: CLEAN (gate hardened mid-release to auto-detect the cached chromium revision) - **Codex (regression)**: SAFE TO SHIP (simulated `sys.platform=win32`, verified POSIX modules not imported + all terminal guards complete + POSIX foreground still uses execv) - **Opus (correctness)**: SAFE TO SHIP (POSIX path provably unchanged, all fcntl/termios/select guarded, Popen+exit correct; noted inherent-Windows trade-offs that aren't PR bugs) Note: the Windows *runtime* path can't be executed on the Linux CI box; it was reviewed statically by both reviewers + the contributor's 209-line test (win32 simulated via monkeypatch). Linux/POSIX no-regression is fully verified. Closes #1952. Co-authored-by: rodboev <rodboev@users.noreply.github.com>
63 lines
2.1 KiB
Python
63 lines
2.1 KiB
Python
import pathlib
|
|
|
|
|
|
REPO = pathlib.Path(__file__).parent.parent
|
|
|
|
|
|
def read(path):
|
|
return (REPO / path).read_text(encoding="utf-8")
|
|
|
|
|
|
def test_index_contains_onboarding_overlay_markup():
|
|
html = read("static/index.html")
|
|
assert 'id="onboardingOverlay"' in html
|
|
assert 'id="onboardingBody"' in html
|
|
assert 'id="onboardingNextBtn"' in html
|
|
assert 'src="static/onboarding.js?v=__WEBUI_VERSION__"' in html
|
|
|
|
|
|
def test_onboarding_css_rules_exist():
|
|
css = read("static/style.css")
|
|
for selector in (
|
|
".onboarding-overlay",
|
|
".onboarding-card",
|
|
".onboarding-step",
|
|
".onboarding-status.warn",
|
|
):
|
|
assert selector in css
|
|
|
|
|
|
def test_onboarding_js_exposes_bootstrap_hooks():
|
|
js = read("static/onboarding.js")
|
|
assert "async function loadOnboardingWizard()" in js
|
|
assert "async function nextOnboardingStep()" in js
|
|
assert "api('/api/onboarding/status')" in js
|
|
assert "api('/api/onboarding/setup'" in js
|
|
assert "api('/api/onboarding/complete'" in js
|
|
|
|
|
|
def test_onboarding_uses_i18n_helpers():
|
|
html = read("static/index.html")
|
|
js = read("static/onboarding.js")
|
|
i18n = read("static/i18n.js")
|
|
assert 'data-i18n="onboarding_title"' in html
|
|
assert 'data-i18n="onboarding_continue"' in html
|
|
assert "t('onboarding_step_system_title')" in js
|
|
assert "t('onboarding_step_setup_title')" in js
|
|
assert "t('onboarding_complete')" in js
|
|
assert "onboarding_title: 'Welcome to Hermes Web UI'" in i18n
|
|
assert "onboarding_title: 'Bienvenido a Hermes Web UI'" in i18n
|
|
|
|
|
|
def test_bootstrap_script_contains_official_installer_and_windows_guard():
|
|
src = read("bootstrap.py")
|
|
assert (
|
|
"https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh"
|
|
in src
|
|
)
|
|
# Native Windows is now experimental-supported (#1952), not hard-blocked:
|
|
# ensure_supported_platform() warns instead of raising, but auto-install
|
|
# (which shells out to /bin/bash) still guards native Windows explicitly.
|
|
assert "Native Windows bootstrap is experimental" in src
|
|
assert "Auto-install is not supported on native Windows" in src
|