diff --git a/cmuxTests/GhosttyConfigTests.swift b/cmuxTests/GhosttyConfigTests.swift index 53f988aa..53119273 100644 --- a/cmuxTests/GhosttyConfigTests.swift +++ b/cmuxTests/GhosttyConfigTests.swift @@ -939,52 +939,6 @@ final class RecentlyClosedBrowserStackTests: XCTestCase { } } -final class TabManagerNotificationOrderingSourceTests: XCTestCase { - func testGhosttyDidSetTitleObserverDoesNotHopThroughTask() throws { - let projectRoot = findProjectRoot() - let tabManagerURL = projectRoot.appendingPathComponent("Sources/TabManager.swift") - let source = try String(contentsOf: tabManagerURL, encoding: .utf8) - - guard let titleObserverStart = source.range(of: "forName: .ghosttyDidSetTitle"), - let focusObserverStart = source.range( - of: "forName: .ghosttyDidFocusSurface", - range: titleObserverStart.upperBound.. URL { - var dir = URL(fileURLWithPath: #file).deletingLastPathComponent().deletingLastPathComponent() - for _ in 0..<10 { - let marker = dir.appendingPathComponent("GhosttyTabs.xcodeproj") - if FileManager.default.fileExists(atPath: marker.path) { - return dir - } - dir = dir.deletingLastPathComponent() - } - return URL(fileURLWithPath: FileManager.default.currentDirectoryPath) - } -} - final class SocketControlSettingsTests: XCTestCase { func testMigrateModeSupportsExpandedSocketModes() { XCTAssertEqual(SocketControlSettings.migrateMode("off"), .off) diff --git a/cmuxTests/UpdatePillReleaseVisibilityTests.swift b/cmuxTests/UpdatePillReleaseVisibilityTests.swift index 099237ef..96826edf 100644 --- a/cmuxTests/UpdatePillReleaseVisibilityTests.swift +++ b/cmuxTests/UpdatePillReleaseVisibilityTests.swift @@ -8,163 +8,6 @@ import AppKit @testable import cmux #endif -/// Regression test: ensures UpdatePill is never gated behind #if DEBUG in production code paths. -/// This prevents accidentally hiding the update UI in Release builds. -final class UpdatePillReleaseVisibilityTests: XCTestCase { - - /// Source files that must show UpdatePill without #if DEBUG guards. - private let filesToCheck = [ - "Sources/Update/UpdateTitlebarAccessory.swift", - "Sources/ContentView.swift", - ] - - func testUpdatePillNotGatedBehindDebug() throws { - let projectRoot = findProjectRoot() - - for relativePath in filesToCheck { - let url = projectRoot.appendingPathComponent(relativePath) - let source = try String(contentsOf: url, encoding: .utf8) - let lines = source.components(separatedBy: .newlines) - - // Track #if DEBUG nesting depth. - var debugDepth = 0 - - for (index, line) in lines.enumerated() { - let trimmed = line.trimmingCharacters(in: .whitespaces) - - if trimmed == "#if DEBUG" || trimmed.hasPrefix("#if DEBUG ") { - debugDepth += 1 - } else if trimmed == "#endif" && debugDepth > 0 { - debugDepth -= 1 - } else if trimmed == "#else" && debugDepth > 0 { - // #else inside #if DEBUG means we're in the non-debug branch — that's fine. - // But UpdatePill in the #if DEBUG branch (before #else) is the problem. - // We handle this by only flagging UpdatePill when debugDepth > 0 and we haven't - // hit #else yet. For simplicity, treat #else as flipping out of the guarded section. - debugDepth -= 1 - } - - if debugDepth > 0 && trimmed.contains("UpdatePill") { - XCTFail( - """ - \(relativePath):\(index + 1) — UpdatePill is inside #if DEBUG. \ - This hides the update UI in Release builds. Remove the #if DEBUG guard \ - or move UpdatePill to the #else branch. - """ - ) - } - } - } - } - - private func findProjectRoot() -> URL { - // Walk up from the test bundle to find the project root (contains GhosttyTabs.xcodeproj). - var dir = URL(fileURLWithPath: #file).deletingLastPathComponent().deletingLastPathComponent() - for _ in 0..<10 { - let marker = dir.appendingPathComponent("GhosttyTabs.xcodeproj") - if FileManager.default.fileExists(atPath: marker.path) { - return dir - } - dir = dir.deletingLastPathComponent() - } - // Fallback: assume CWD is project root. - return URL(fileURLWithPath: FileManager.default.currentDirectoryPath) - } -} - -/// Regression test: ensure WKWebView can load HTTP development URLs (e.g. *.localtest.me). -final class AppTransportSecurityTests: XCTestCase { - func testInfoPlistAllowsArbitraryLoadsInWebContent() throws { - let projectRoot = findProjectRoot() - let infoPlistURL = projectRoot.appendingPathComponent("Resources/Info.plist") - let data = try Data(contentsOf: infoPlistURL) - var format = PropertyListSerialization.PropertyListFormat.xml - let plist = try XCTUnwrap( - PropertyListSerialization.propertyList(from: data, options: [], format: &format) as? [String: Any] - ) - let ats = try XCTUnwrap(plist["NSAppTransportSecurity"] as? [String: Any]) - XCTAssertEqual( - ats["NSAllowsArbitraryLoadsInWebContent"] as? Bool, - true, - "Resources/Info.plist must allow HTTP loads in WKWebView for local dev hostnames." - ) - } - - private func findProjectRoot() -> URL { - var dir = URL(fileURLWithPath: #file).deletingLastPathComponent().deletingLastPathComponent() - for _ in 0..<10 { - let marker = dir.appendingPathComponent("GhosttyTabs.xcodeproj") - if FileManager.default.fileExists(atPath: marker.path) { - return dir - } - dir = dir.deletingLastPathComponent() - } - return URL(fileURLWithPath: FileManager.default.currentDirectoryPath) - } -} - -final class AppBrowserURLSchemeTests: XCTestCase { - func testInfoPlistRegistersHTTPAndHTTPSAsHandledSchemes() throws { - let projectRoot = findProjectRoot() - let infoPlistURL = projectRoot.appendingPathComponent("Resources/Info.plist") - let data = try Data(contentsOf: infoPlistURL) - var format = PropertyListSerialization.PropertyListFormat.xml - let plist = try XCTUnwrap( - PropertyListSerialization.propertyList(from: data, options: [], format: &format) as? [String: Any] - ) - let urlTypes = try XCTUnwrap(plist["CFBundleURLTypes"] as? [[String: Any]]) - - let schemes = Set( - urlTypes - .flatMap { $0["CFBundleURLSchemes"] as? [String] ?? [] } - .map { $0.lowercased() } - ) - - XCTAssertTrue( - schemes.contains("http"), - "Resources/Info.plist must register the http URL scheme so macOS can treat cmux as a browser candidate." - ) - XCTAssertTrue( - schemes.contains("https"), - "Resources/Info.plist must register the https URL scheme so macOS can treat cmux as a browser candidate." - ) - - let browserURLTypes = urlTypes.filter { urlType in - let urlSchemes = Set((urlType["CFBundleURLSchemes"] as? [String] ?? []).map { $0.lowercased() }) - return !urlSchemes.isDisjoint(with: ["http", "https"]) - } - XCTAssertFalse( - browserURLTypes.isEmpty, - "Resources/Info.plist must include a browser URL type entry for http and https." - ) - - for urlType in browserURLTypes { - XCTAssertEqual( - urlType["CFBundleTypeRole"] as? String, - "Viewer", - "Browser URL schemes should be declared with the Viewer role." - ) - XCTAssertEqual( - urlType["LSHandlerRank"] as? String, - "Default", - "Browser URL schemes should advertise a default-handler rank." - ) - } - } - - private func findProjectRoot() -> URL { - var dir = URL(fileURLWithPath: #file).deletingLastPathComponent().deletingLastPathComponent() - for _ in 0..<10 { - let marker = dir.appendingPathComponent("GhosttyTabs.xcodeproj") - if FileManager.default.fileExists(atPath: marker.path) { - return dir - } - dir = dir.deletingLastPathComponent() - } - return URL(fileURLWithPath: FileManager.default.currentDirectoryPath) - } -} - final class BrowserInsecureHTTPSettingsTests: XCTestCase { func testDefaultAllowlistPatternsArePresent() { XCTAssertEqual( @@ -334,45 +177,3 @@ final class TitlebarControlsHoverPolicyTests: XCTestCase { XCTAssertFalse(titlebarControlsShouldTrackButtonHover(config: TitlebarControlsStyle.softButtons.config)) } } - -/// Regression test: ensure new terminal windows are born in full-size content mode so -/// titlebar/content offsets are correct before the first resize. -final class MainWindowLayoutStyleTests: XCTestCase { - func testCreateMainWindowUsesFullSizeContentViewStyleMask() throws { - let projectRoot = findProjectRoot() - let appDelegateURL = projectRoot.appendingPathComponent("Sources/AppDelegate.swift") - let source = try String(contentsOf: appDelegateURL, encoding: .utf8) - - guard let start = source.range(of: "func createMainWindow("), - let end = source.range(of: "@objc func checkForUpdates", range: start.upperBound.. URL { - var dir = URL(fileURLWithPath: #file).deletingLastPathComponent().deletingLastPathComponent() - for _ in 0..<10 { - let marker = dir.appendingPathComponent("GhosttyTabs.xcodeproj") - if FileManager.default.fileExists(atPath: marker.path) { - return dir - } - dir = dir.deletingLastPathComponent() - } - return URL(fileURLWithPath: FileManager.default.currentDirectoryPath) - } -} diff --git a/tests/test_browser_chrome_contrast_regression.py b/tests/test_browser_chrome_contrast_regression.py deleted file mode 100644 index a2552f2f..00000000 --- a/tests/test_browser_chrome_contrast_regression.py +++ /dev/null @@ -1,126 +0,0 @@ -#!/usr/bin/env python3 -"""Static regression guards for browser chrome contrast in mixed theme setups.""" - -from __future__ import annotations - -import subprocess -from pathlib import Path - - -def repo_root() -> Path: - result = subprocess.run( - ["git", "rev-parse", "--show-toplevel"], - capture_output=True, - text=True, - ) - if result.returncode == 0: - return Path(result.stdout.strip()) - return Path(__file__).resolve().parents[1] - - -def extract_block(source: str, signature: str) -> str: - start = source.find(signature) - if start < 0: - raise ValueError(f"Missing signature: {signature}") - - brace_start = source.find("{", start) - if brace_start < 0: - raise ValueError(f"Missing opening brace for: {signature}") - - depth = 0 - for idx in range(brace_start, len(source)): - char = source[idx] - if char == "{": - depth += 1 - elif char == "}": - depth -= 1 - if depth == 0: - return source[brace_start : idx + 1] - - raise ValueError(f"Unbalanced braces for: {signature}") - - -def main() -> int: - root = repo_root() - view_path = root / "Sources" / "Panels" / "BrowserPanelView.swift" - source = view_path.read_text(encoding="utf-8") - failures: list[str] = [] - - try: - browser_panel_view_block = extract_block(source, "struct BrowserPanelView: View") - except ValueError as error: - failures.append(str(error)) - browser_panel_view_block = "" - - try: - resolver_block = extract_block(source, "func resolvedBrowserChromeColorScheme(") - except ValueError as error: - failures.append(str(error)) - resolver_block = "" - - if resolver_block: - if "backgroundColor.isLightColor ? .light : .dark" not in resolver_block: - failures.append( - "resolvedBrowserChromeColorScheme must map luminance to a light/dark ColorScheme" - ) - - try: - chrome_scheme_block = extract_block( - browser_panel_view_block, - "private var browserChromeColorScheme: ColorScheme", - ) - except ValueError as error: - failures.append(str(error)) - chrome_scheme_block = "" - - if chrome_scheme_block and "resolvedBrowserChromeColorScheme(" not in chrome_scheme_block: - failures.append("browserChromeColorScheme must use resolvedBrowserChromeColorScheme") - - try: - omnibar_background_block = extract_block( - browser_panel_view_block, - "private var omnibarPillBackgroundColor: NSColor", - ) - except ValueError as error: - failures.append(str(error)) - omnibar_background_block = "" - - if omnibar_background_block and "for: browserChromeColorScheme" not in omnibar_background_block: - failures.append("omnibar pill background must use browserChromeColorScheme") - - try: - address_bar_block = extract_block( - browser_panel_view_block, - "private var addressBar: some View", - ) - except ValueError as error: - failures.append(str(error)) - address_bar_block = "" - - if address_bar_block and ".environment(\\.colorScheme, browserChromeColorScheme)" not in address_bar_block: - failures.append("addressBar must apply browserChromeColorScheme via environment") - - try: - body_block = extract_block(browser_panel_view_block, "var body: some View") - except ValueError as error: - failures.append(str(error)) - body_block = "" - - if body_block: - if "OmnibarSuggestionsView(" not in body_block: - failures.append("Expected OmnibarSuggestionsView block in BrowserPanelView body") - elif ".environment(\\.colorScheme, browserChromeColorScheme)" not in body_block: - failures.append("Omnibar suggestions must apply browserChromeColorScheme via environment") - - if failures: - print("FAIL: browser chrome contrast regression guards failed") - for failure in failures: - print(f" - {failure}") - return 1 - - print("PASS: browser chrome contrast regression guards are in place") - return 0 - - -if __name__ == "__main__": - raise SystemExit(main()) diff --git a/tests/test_browser_console_errors_cli_output_regression.py b/tests/test_browser_console_errors_cli_output_regression.py deleted file mode 100644 index 40561356..00000000 --- a/tests/test_browser_console_errors_cli_output_regression.py +++ /dev/null @@ -1,86 +0,0 @@ -#!/usr/bin/env python3 -"""Static regression guard for browser console/errors CLI output formatting. - -Ensures non-JSON `browser console list` and `browser errors list` do not fall -back to unconditional `OK` when logs exist. -""" - -from __future__ import annotations - -import subprocess -from pathlib import Path - - -def repo_root() -> Path: - result = subprocess.run( - ["git", "rev-parse", "--show-toplevel"], - capture_output=True, - text=True, - ) - if result.returncode == 0: - return Path(result.stdout.strip()) - return Path(__file__).resolve().parents[1] - - -def extract_block(source: str, signature: str) -> str: - start = source.find(signature) - if start < 0: - raise ValueError(f"Missing signature: {signature}") - brace_start = source.find("{", start) - if brace_start < 0: - raise ValueError(f"Missing opening brace for: {signature}") - depth = 0 - for idx in range(brace_start, len(source)): - char = source[idx] - if char == "{": - depth += 1 - elif char == "}": - depth -= 1 - if depth == 0: - return source[brace_start : idx + 1] - raise ValueError(f"Unbalanced braces for: {signature}") - - -def main() -> int: - root = repo_root() - failures: list[str] = [] - - cli_path = root / "CLI" / "cmux.swift" - cli_source = cli_path.read_text(encoding="utf-8") - browser_block = extract_block(cli_source, "private func runBrowserCommand(") - - if "func displayBrowserLogItems(_ value: Any?) -> String?" not in browser_block: - failures.append("runBrowserCommand() is missing displayBrowserLogItems() helper") - else: - helper_block = extract_block(browser_block, "func displayBrowserLogItems(_ value: Any?) -> String?") - if "return \"[\\(level)] \\(text)\"" not in helper_block: - failures.append("displayBrowserLogItems() no longer renders level-prefixed log lines") - if "return \"[error] \\(message)\"" not in helper_block: - failures.append("displayBrowserLogItems() no longer renders concise JS error messages") - if "return displayBrowserValue(dict)" not in helper_block: - failures.append("displayBrowserLogItems() no longer falls back to structured formatting") - - console_block = extract_block(browser_block, 'if subcommand == "console"') - if 'displayBrowserLogItems(payload["entries"])' not in console_block: - failures.append("browser console path no longer formats entries for non-JSON output") - if 'output(payload, fallback: "OK")' in console_block: - failures.append("browser console path regressed to unconditional OK output") - - errors_block = extract_block(browser_block, 'if subcommand == "errors"') - if 'displayBrowserLogItems(payload["errors"])' not in errors_block: - failures.append("browser errors path no longer formats errors for non-JSON output") - if 'output(payload, fallback: "OK")' in errors_block: - failures.append("browser errors path regressed to unconditional OK output") - - if failures: - print("FAIL: browser console/errors CLI output regression guard failed") - for item in failures: - print(f" - {item}") - return 1 - - print("PASS: browser console/errors CLI output regression guard is in place") - return 0 - - -if __name__ == "__main__": - raise SystemExit(main()) diff --git a/tests/test_browser_devtools_portal_regressions.py b/tests/test_browser_devtools_portal_regressions.py deleted file mode 100644 index 6ec27096..00000000 --- a/tests/test_browser_devtools_portal_regressions.py +++ /dev/null @@ -1,92 +0,0 @@ -#!/usr/bin/env python3 -"""Static regression checks for browser DevTools/portal review fixes. - -Guards two follow-up fixes: -1) DevTools toggle path must retry restore when inspector show is transiently ignored. -2) Browser portal visibility must propagate even if host is temporarily off-window. -""" - -from __future__ import annotations - -import re -import subprocess -from pathlib import Path - - -def repo_root() -> Path: - result = subprocess.run( - ["git", "rev-parse", "--show-toplevel"], - capture_output=True, - text=True, - ) - if result.returncode == 0: - return Path(result.stdout.strip()) - return Path(__file__).resolve().parents[1] - - -def extract_block(source: str, signature: str) -> str: - start = source.find(signature) - if start < 0: - raise ValueError(f"Missing signature: {signature}") - brace_start = source.find("{", start) - if brace_start < 0: - raise ValueError(f"Missing opening brace for: {signature}") - depth = 0 - for idx in range(brace_start, len(source)): - char = source[idx] - if char == "{": - depth += 1 - elif char == "}": - depth -= 1 - if depth == 0: - return source[brace_start : idx + 1] - raise ValueError(f"Unbalanced braces for: {signature}") - - -def main() -> int: - root = repo_root() - failures: list[str] = [] - - panel_path = root / "Sources" / "Panels" / "BrowserPanel.swift" - panel_source = panel_path.read_text(encoding="utf-8") - toggle_block = extract_block(panel_source, "func toggleDeveloperTools() -> Bool") - if "visibleAfterToggle" not in toggle_block: - failures.append("toggleDeveloperTools() no longer re-checks inspector visibility") - if "scheduleDeveloperToolsRestoreRetry()" not in toggle_block: - failures.append("toggleDeveloperTools() no longer schedules a DevTools restore retry") - - view_path = root / "Sources" / "Panels" / "BrowserPanelView.swift" - view_source = view_path.read_text(encoding="utf-8") - portal_update_block = extract_block(view_source, "private func updateUsingWindowPortal(") - if "BrowserWindowPortalRegistry.updateEntryVisibility(" not in portal_update_block: - failures.append("BrowserPanelView.updateUsingWindowPortal() is missing deferred portal visibility propagation") - if "zPriority: coordinator.desiredPortalZPriority" not in portal_update_block: - failures.append("BrowserPanelView deferred portal update no longer propagates zPriority") - - portal_path = root / "Sources" / "BrowserWindowPortal.swift" - portal_source = portal_path.read_text(encoding="utf-8") - if not re.search( - r"func\s+updateEntryVisibility\s*\(\s*forWebViewId\s+webViewId:\s*ObjectIdentifier,\s*visibleInUI:\s*Bool,\s*zPriority:\s*Int\s*\)", - portal_source, - flags=re.MULTILINE, - ): - failures.append("WindowBrowserPortal is missing updateEntryVisibility(forWebViewId:visibleInUI:zPriority:)") - if not re.search( - r"static\s+func\s+updateEntryVisibility\s*\(\s*for\s+webView:\s*WKWebView,\s*visibleInUI:\s*Bool,\s*zPriority:\s*Int\s*\)", - portal_source, - flags=re.MULTILINE, - ): - failures.append("BrowserWindowPortalRegistry is missing updateEntryVisibility(for:visibleInUI:zPriority:)") - - if failures: - print("FAIL: browser devtools/portal regression guards failed") - for item in failures: - print(f" - {item}") - return 1 - - print("PASS: browser devtools/portal regression guards are in place") - return 0 - - -if __name__ == "__main__": - raise SystemExit(main()) diff --git a/tests/test_browser_eval_async_wrapper_regression.py b/tests/test_browser_eval_async_wrapper_regression.py deleted file mode 100644 index 4d31948c..00000000 --- a/tests/test_browser_eval_async_wrapper_regression.py +++ /dev/null @@ -1,128 +0,0 @@ -#!/usr/bin/env python3 -"""Static regression guard for browser eval async wrapping + telemetry injection.""" - -from __future__ import annotations - -import subprocess -from pathlib import Path - - -def repo_root() -> Path: - result = subprocess.run( - ["git", "rev-parse", "--show-toplevel"], - capture_output=True, - text=True, - ) - if result.returncode == 0: - return Path(result.stdout.strip()) - return Path(__file__).resolve().parents[1] - - -def extract_block(source: str, signature: str) -> str: - start = source.find(signature) - if start < 0: - raise ValueError(f"Missing signature: {signature}") - brace_start = source.find("{", start) - if brace_start < 0: - raise ValueError(f"Missing opening brace for: {signature}") - depth = 0 - for idx in range(brace_start, len(source)): - char = source[idx] - if char == "{": - depth += 1 - elif char == "}": - depth -= 1 - if depth == 0: - return source[brace_start : idx + 1] - raise ValueError(f"Unbalanced braces for: {signature}") - - -def extract_span(source: str, start_marker: str, end_marker: str) -> str: - start = source.find(start_marker) - if start < 0: - raise ValueError(f"Missing start marker: {start_marker}") - end = source.find(end_marker, start) - if end < 0: - raise ValueError(f"Missing end marker: {end_marker}") - return source[start:end] - - -def main() -> int: - root = repo_root() - failures: list[str] = [] - - terminal_path = root / "Sources" / "TerminalController.swift" - panel_path = root / "Sources" / "Panels" / "BrowserPanel.swift" - terminal_source = terminal_path.read_text(encoding="utf-8") - panel_source = panel_path.read_text(encoding="utf-8") - - if "preferAsync: Bool = false" not in terminal_source: - failures.append("v2RunJavaScript() no longer exposes preferAsync toggle") - run_js_block = extract_block(terminal_source, "private func v2RunJavaScript(") - if "callAsyncJavaScript" not in run_js_block: - failures.append("v2RunJavaScript() no longer uses callAsyncJavaScript for async JS") - - run_browser_js_block = extract_block(terminal_source, "private func v2RunBrowserJavaScript(") - required_wrapper_tokens = [ - "let asyncFunctionBody =", - "__cmuxMaybeAwait", - "__cmux_t", - "__cmux_v", - "return await __cmuxEvalInFrame();", - "preferAsync: true", - ] - for token in required_wrapper_tokens: - if token not in run_browser_js_block: - failures.append(f"v2RunBrowserJavaScript() missing async eval wrapper token: {token}") - - if "v2BrowserUndefinedSentinel" not in terminal_source: - failures.append("TerminalController is missing undefined sentinel handling") - if "v2BrowserEvalEnvelopeTypeUndefined" not in terminal_source: - failures.append("TerminalController is missing undefined envelope decode constant") - - hook_block = extract_block(terminal_source, "private func v2BrowserEnsureTelemetryHooks(") - if "BrowserPanel.telemetryHookBootstrapScriptSource" not in hook_block: - failures.append("v2BrowserEnsureTelemetryHooks() no longer uses shared BrowserPanel telemetry source") - - if "static let telemetryHookBootstrapScriptSource" not in panel_source: - failures.append("BrowserPanel is missing telemetryHookBootstrapScriptSource") - if "static let dialogTelemetryHookBootstrapScriptSource" not in panel_source: - failures.append("BrowserPanel is missing dialogTelemetryHookBootstrapScriptSource") - - base_script_span = extract_span( - panel_source, - "static let telemetryHookBootstrapScriptSource =", - "static let dialogTelemetryHookBootstrapScriptSource =", - ) - if "window.alert = function(message)" in base_script_span: - failures.append("Document-start telemetry script should not override alert dialogs") - if "window.confirm = function(message)" in base_script_span: - failures.append("Document-start telemetry script should not override confirm dialogs") - if "window.prompt = function(message, defaultValue)" in base_script_span: - failures.append("Document-start telemetry script should not override prompt dialogs") - - panel_init_block = extract_block( - panel_source, - "init(workspaceId: UUID, initialURL: URL? = nil, bypassInsecureHTTPHostOnce: String? = nil)", - ) - required_init_tokens = [ - "config.userContentController.addUserScript(", - "source: Self.telemetryHookBootstrapScriptSource", - "injectionTime: .atDocumentStart", - ] - for token in required_init_tokens: - if token not in panel_init_block: - failures.append(f"BrowserPanel init() missing telemetry user-script token: {token}") - - if failures: - print("FAIL: browser eval async wrapper / telemetry injection regression guard failed") - for item in failures: - print(f" - {item}") - return 1 - - print("PASS: browser eval async wrapper / telemetry injection regression guard is in place") - return 0 - - -if __name__ == "__main__": - raise SystemExit(main()) diff --git a/tests/test_browser_eval_cli_output_regression.py b/tests/test_browser_eval_cli_output_regression.py deleted file mode 100644 index 6c2e83da..00000000 --- a/tests/test_browser_eval_cli_output_regression.py +++ /dev/null @@ -1,89 +0,0 @@ -#!/usr/bin/env python3 -"""Static regression guard for browser eval CLI output formatting. - -Ensures `cmux browser eval