From 4a005f5847bc165f96f627fb31a58dbb7f4570d4 Mon Sep 17 00:00:00 2001 From: renatoathaydes Date: Fri, 23 Oct 2026 11:57:49 +0200 Subject: [PATCH 1/3] Run UI CI on pull requests that change the desktop app The paths filter was `desktop/`, which matches no file, so the workflow never ran on a pull request. Match everything under desktop/, and the workflow itself, as the other workflows do. Co-Authored-By: Claude Opus 5.5 --- .github/workflows/ui-ci.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ui-ci.yaml b/.github/workflows/ui-ci.yaml index 3d6cc8d6a..2be22a7f2 100644 --- a/.github/workflows/ui-ci.yaml +++ b/.github/workflows/ui-ci.yaml @@ -7,7 +7,8 @@ on: - main - release-* paths: - - desktop/ + - desktop/** + - .github/workflows/ui-ci.yaml jobs: check: From 9ba39abc8883df17fe9e6ce9528f3a58a9ec8a68 Mon Sep 17 00:00:00 2001 From: renatoathaydes Date: Fri, 23 Oct 2026 12:00:40 +0200 Subject: [PATCH 2/3] Fix the desktop app's lint errors - ESLint ignores eslint.config.js, which the TypeScript project that the typed parser uses doesn't include, so it failed to parse it. - react-refresh/only-export-components is off for the entry points and the router module, which export no components. - Remove an unused import from src/client/command.ts. These 5 errors were there at the fork point, so AGENTS.md no longer mentions them. Co-Authored-By: Claude Opus 5.5 --- AGENTS.md | 1 - desktop/eslint.config.js | 12 +++++++++++- desktop/src/client/command.ts | 16 +++++++++++----- 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index c87c944a0..168e5546c 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -98,7 +98,6 @@ cd src-tauri && cargo +stable check - There are no Windows e2e tests: GitHub's Windows runners can't run Linux containers. `windows-tests.yaml` only builds the CLI and runs the unit tests on Windows. - **Desktop quirks:** - - `yarn lint:ci` has 5 errors that already existed at the fork point. - The default `cargo` may be too old for the v4 `Cargo.lock`; use `cargo +stable`. - `cargo check` needs `desktop/dist/` and the sidecar `desktop/src-tauri/bin/devpod-cli-` to exist; empty placeholders are enough (both are gitignored). diff --git a/desktop/eslint.config.js b/desktop/eslint.config.js index f22e3481d..5586d1fc6 100644 --- a/desktop/eslint.config.js +++ b/desktop/eslint.config.js @@ -20,7 +20,9 @@ const compat = new FlatCompat({ export default [ { - ignores: ["dist/**/*", "src-tauri/**/*", "public/**/*", "src/gen/**/*"], + // eslint.config.js is JavaScript, which the TypeScript project (parserOptions.project) doesn't + // include, so the TypeScript parser can't lint it. + ignores: ["dist/**/*", "src-tauri/**/*", "public/**/*", "src/gen/**/*", "eslint.config.js"], }, ...fixupConfigRules( compat.extends( @@ -111,4 +113,12 @@ export default [ ], }, }, + { + // The entry points and the router module export no components, so when they change Vite reloads + // the page instead of refreshing components in place, which is fine for them. + files: ["src/main.tsx", "src/routes.tsx", "update-window/src/main.tsx"], + rules: { + "react-refresh/only-export-components": "off", + }, + }, ] diff --git a/desktop/src/client/command.ts b/desktop/src/client/command.ts index 9ab2e87ff..08a32d7cc 100644 --- a/desktop/src/client/command.ts +++ b/desktop/src/client/command.ts @@ -5,10 +5,14 @@ import { Command as ShellCommand, } from "@tauri-apps/plugin-shell" import { debug, ErrorTypeCancelled, isError, Result, ResultError, Return, sleep } from "../lib" -import { DEVPOD_BINARY, DEVPOD_FLAG_OPTION, DEVPOD_UI_ENV_VAR, DEVPOD_ADDITIONAL_ENV_VARS } from "./constants" +import { + DEVPOD_BINARY, + DEVPOD_FLAG_OPTION, + DEVPOD_UI_ENV_VAR, + DEVPOD_ADDITIONAL_ENV_VARS, +} from "./constants" import { TStreamEvent } from "./types" import { TAURI_SERVER_URL } from "./tauriClient" -import * as log from "@tauri-apps/plugin-log" import { invoke } from "@tauri-apps/api/core" export type TStreamEventListenerFn = (event: TStreamEvent) => void @@ -89,7 +93,9 @@ export class Command implements TCommand> { if (this.isFlatpak) { this.extraEnvVars["FLATPAK_ID"] = "sh.loft.devpod" this.extraEnvVars[DEVPOD_ADDITIONAL_ENV_VARS] = recordToCSV(this.extraEnvVars) - this.sidecarCommand = ShellCommand.sidecar(DEVPOD_BINARY, this.args, { env: this.extraEnvVars }) + this.sidecarCommand = ShellCommand.sidecar(DEVPOD_BINARY, this.args, { + env: this.extraEnvVars, + }) } } const rawResult = await this.sidecarCommand.execute() @@ -247,5 +253,5 @@ export function serializeRawOptions( function recordToCSV(record: Record): string { return Object.entries(record) .map(([key, value]) => `${key}=${value}`) - .join(','); -} \ No newline at end of file + .join(",") +} From 083f1201960cb853f237300f6d1f899304f9cd09 Mon Sep 17 00:00:00 2001 From: renatoathaydes Date: Fri, 23 Oct 2026 12:00:40 +0200 Subject: [PATCH 3/3] Format the desktop app with Prettier Nine files weren't formatted, so `yarn format:check` failed. Only whitespace and parentheses change. Co-Authored-By: Claude Opus 5.5 --- desktop/src/App/OSSApp.tsx | 2 +- desktop/src/App/constants.ts | 2 +- desktop/src/client/client.ts | 2 +- desktop/src/components/IDEGroup/IDEGroup.tsx | 1 - desktop/src/components/Terminal/Terminal.tsx | 6 +++--- desktop/src/icons/Curity.tsx | 5 +---- desktop/src/icons/Stop.tsx | 4 +--- desktop/src/lib/modals/useResetWorkspaceModal.tsx | 5 +++-- 8 files changed, 11 insertions(+), 16 deletions(-) diff --git a/desktop/src/App/OSSApp.tsx b/desktop/src/App/OSSApp.tsx index e67651a4a..e30e94322 100644 --- a/desktop/src/App/OSSApp.tsx +++ b/desktop/src/App/OSSApp.tsx @@ -63,7 +63,7 @@ export function OSSApp() { {showTitleBar && } - + diff --git a/desktop/src/App/constants.ts b/desktop/src/App/constants.ts index 084a78420..43c5689e6 100644 --- a/desktop/src/App/constants.ts +++ b/desktop/src/App/constants.ts @@ -2,4 +2,4 @@ import { BoxProps } from "@chakra-ui/react" import { isLinux, isMacOS, isWindows } from "../lib" export const showTitleBar = isMacOS || isLinux || isWindows -export const titleBarSafeArea: BoxProps["height"] = showTitleBar ? isWindows ? "6" : "12" : 0 +export const titleBarSafeArea: BoxProps["height"] = showTitleBar ? (isWindows ? "6" : "12") : 0 diff --git a/desktop/src/client/client.ts b/desktop/src/client/client.ts index 5cde1ec18..3cf16f32e 100644 --- a/desktop/src/client/client.ts +++ b/desktop/src/client/client.ts @@ -284,7 +284,7 @@ class Client { // we're in a flatpak, we need to check in other paths. const isFlatpak = await this.getEnv("FLATPAK_ID") if (isFlatpak) { - this.log("debug", "Running in flatpak, checking ~/.local/bin on the host"); + this.log("debug", "Running in flatpak, checking ~/.local/bin on the host") const home_dir = await this.getEnv("HOME") // this will throw if doesn't exist const exists = await invoke("file_exists", { diff --git a/desktop/src/components/IDEGroup/IDEGroup.tsx b/desktop/src/components/IDEGroup/IDEGroup.tsx index 25bbc943f..4c72569be 100644 --- a/desktop/src/components/IDEGroup/IDEGroup.tsx +++ b/desktop/src/components/IDEGroup/IDEGroup.tsx @@ -74,7 +74,6 @@ function IDEItem({ }) { const menuHoverColor = useColorModeValue("gray.100", "gray.700") - const onClick = useCallback(() => { onItemClick(ide.name) }, [onItemClick, ide]) diff --git a/desktop/src/components/Terminal/Terminal.tsx b/desktop/src/components/Terminal/Terminal.tsx index 3f964fd02..d6747467f 100644 --- a/desktop/src/components/Terminal/Terminal.tsx +++ b/desktop/src/components/Terminal/Terminal.tsx @@ -73,9 +73,9 @@ export const Terminal = forwardRef(function T( }) terminalRef.current = terminal - terminal.attachCustomKeyEventHandler(event => { - return !(event.type === "keydown" && event.key === "c" && event.ctrlKey); - }); + terminal.attachCustomKeyEventHandler((event) => { + return !(event.type === "keydown" && event.key === "c" && event.ctrlKey) + }) const loadAddon = ( AddonClass: new () => T, diff --git a/desktop/src/icons/Curity.tsx b/desktop/src/icons/Curity.tsx index 7d48ffa98..fbda8d43a 100644 --- a/desktop/src/icons/Curity.tsx +++ b/desktop/src/icons/Curity.tsx @@ -11,10 +11,7 @@ export const Curity = createIcon({ d="m53.06 26.79-.56.57a15.93 15.93 0 0 1-10.93 5 10 10 0 0 1-10.34-10.4c0-6 4.24-10.39 10.09-10.39a16.67 16.67 0 0 1 10.22 4l.56.49 5.61-5.86-.63-.54a25.78 25.78 0 0 0-16.36-5.91 18.44 18.44 0 0 0-15.37 7.68H15l-.6 5.09h8.5a17.9 17.9 0 0 0-.59 2.86H9.61L9 24.46h13.31a18.56 18.56 0 0 0 .57 2.86H3.77l-.61 5.09H25.3c3.29 4.74 8.9 7.68 15.67 7.68a25.41 25.41 0 0 0 17.19-6.93l.59-.56Z" transform="translate(-3.16 -3.75)" />, - , + , - ), + path: , }) diff --git a/desktop/src/lib/modals/useResetWorkspaceModal.tsx b/desktop/src/lib/modals/useResetWorkspaceModal.tsx index 10f7451fb..f7a458c6d 100644 --- a/desktop/src/lib/modals/useResetWorkspaceModal.tsx +++ b/desktop/src/lib/modals/useResetWorkspaceModal.tsx @@ -28,8 +28,9 @@ export function useResetWorkspaceModal( Resetting the workspace will erase all state saved in the docker container overlay and DELETE ALL UNCOMMITTED CODE. This means you might need to reinstall or reconfigure - certain applications. You can also just recreate the pod with rebuild without wiping all state. With reset, you will start with a fresh clone of the repository. Are you sure - you want to reset {workspaceName}? + certain applications. You can also just recreate the pod with rebuild without wiping all + state. With reset, you will start with a fresh clone of the repository. Are you sure you + want to reset {workspaceName}?