Repository navigation
Fix tab close, Debug startup crash, Iseberg empty-line completion and first-tab startup - #58
Merged
Marc-André Moreau (mamoreau-devolutions) merged 6 commits intoOct 21, 2026
Conversation
Resolve-ZigPath took any zig on PATH, so a newer system Zig (e.g. 0.17.0) was used for Ghostty, which only accepts the pinned version. Only accept a PATH zig whose version matches the pin; otherwise fall back to the pinned download under artifacts/tools. Debug builds also crashed at startup because developer tools were attached twice: WithDeveloperTools() in Program.BuildAvaloniaApp and AttachDeveloperTools() in App.Initialize. Drop the duplicate in App. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
On empty or whitespace-only input, CommandCompletion.CompleteInput returns
ReplacementIndex/ReplacementLength of -1. ManagedPowerShellSession passed
that through, so Ctrl+Space in an empty script editor failed with
"start ('-1') must be a non-negative value" when building the editor's
replacement span.
Map a negative replacement range to an empty span at the cursor in one
helper shared by the normal, nested-prompt and paused-debugger completion
paths, and add a regression test covering the engine and script editor.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#56 made the tab header's drag handlers observe handled pointer events so dragging works on a Button. The press on the nested close X then also bubbled to the header, whose BeginTabDrag captured the pointer away from the close button, so it never raised Click and tabs could not be closed with the mouse. Skip drag tracking when the press starts on a nested button, and add a regression test that clicks a tab's close button with real pointer input. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Opening the first Iseberg tab started two pwsh processes one after the other: PowerShellInstallation.Find ran pwsh only to read $PSHOME, its version, .NET runtime and architecture, and then the session started the bridge pwsh. The probe cost 0.5-1.3 s on every first tab. The bridge bootstrap now prints that description on one stdout line before importing the module, and PowerShellSession validates it while the module loads. An installation too old to load the net8.0 module still fails with the version it found instead of a pipe timeout. The error messages are unchanged; PowerShellInstallation moves to Iseberg.Core, and PowerShellIseRuntime is removed. Measured from tab request to ready (Debug build, warm): 1.70 s -> 1.23 s. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…n-8d1445 # Conflicts: # native/Zig.ps1 # src/Devolutions.Terminal.Ise/Iseberg.Core/PowerShellSession.cs
Marc-André Moreau (mamoreau-devolutions)
deployed
to
publish-dry-run
October 21, 2026 18:34 — with
GitHub Actions
Active
Marc-André Moreau (mamoreau-devolutions)
deployed
to
publish-dry-run
October 21, 2026 18:34 — with
GitHub Actions
Active
Marc-André Moreau (mamoreau-devolutions)
deployed
to
publish-dry-run
October 21, 2026 18:34 — with
GitHub Actions
Active
Marc-André Moreau (mamoreau-devolutions)
deployed
to
publish-dry-run
October 21, 2026 18:34 — with
GitHub Actions
Active
…load The tab close regression test used PowerShellIseTestHarness.WaitForAsync, but the harness is excluded when EnablePowerShellIse is false, so the managed Linux CI build failed with CS0103. Move the dispatcher polling helper into DispatcherWait, which is always compiled, and have the Iseberg harness delegate to it. The macOS Iseberg job also failed when GitHub returned a 5xx page while downloading the pinned test PowerShell. Retry that download. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Marc-André Moreau (mamoreau-devolutions)
deployed
to
publish-dry-run
October 21, 2026 18:43 — with
GitHub Actions
Active
Marc-André Moreau (mamoreau-devolutions)
deployed
to
publish-dry-run
October 21, 2026 18:43 — with
GitHub Actions
Active
Marc-André Moreau (mamoreau-devolutions)
deployed
to
publish-dry-run
October 21, 2026 18:45 — with
GitHub Actions
Active
Marc-André Moreau (mamoreau-devolutions)
deployed
to
publish-dry-run
October 21, 2026 18:45 — with
GitHub Actions
Active
Marc-André Moreau (mamoreau-devolutions)
merged commit Oct 21, 2026
737cb9e
into
master
46 checks passed
Marc-André Moreau (mamoreau-devolutions)
deleted the
claude/build-and-run-8d1445
branch
October 21, 2026 18:59
This branch was successfully deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Four fixes found while building and running DT locally: tabs could not be closed with the mouse, Debug builds crashed at startup, Iseberg completion failed on an empty line, and the first Iseberg tab started two cold
pwshprocesses back to back.Tab close button did nothing (regression from #56)
#56 made the tab header's drag handlers observe handled pointer events so tab dragging works on a
Button. The press on the nested close X then also bubbled to the header, whoseBeginTabDragcaptured the pointer away from the close button, so it never raisedClick. Clicking X only activated the tab.BeginTabDragnow ignores presses that start on a nested button. Dragging from the header still works.Debug builds crashed at startup
Debug builds attached Avalonia developer tools twice:
WithDeveloperTools()inProgram.BuildAvaloniaAppandAttachDeveloperTools()inApp.Initialize(added in #52). The second call threwInvalidOperationException: Developer tools have already been attached. The duplicate inApp.Initializeis removed. Release builds were not affected.Iseberg completion on an empty line showed "Operation failed"
On empty or whitespace-only input,
CommandCompletion.CompleteInputreturnsReplacementIndex/ReplacementLengthof-1.ManagedPowerShellSessionpassed that through, and building the editor's replacement span threwstart ('-1') must be a non-negative value. A negative range is now mapped to an empty span at the cursor, in one helper shared by the normal, nested-prompt and paused-debugger completion paths.First Iseberg tab: one
pwshinstead of twoOpening the first Iseberg tab ran
PowerShellInstallation.Find, which startedpwshonly to read$PSHOME, its version, .NET runtime and architecture, and then the session started the bridgepwsh. The bridge bootstrap now prints that description on one stdout line before importing the module, andPowerShellSessionvalidates it while the module loads, so it is off the critical path.PowerShellInstallationmoves toIseberg.Core;PowerShellIseRuntimeis removed.Merged with
master(#57). #57 already includes an equivalent fix for a newer Zig on PATH, so this branch takes its version ofnative/Zig.ps1.Test plan
WindowActionRegistrationTests.ClickingTabCloseButtonClosesTheTabdrives the close button with real headless pointer input. It fails without the fix ("Click raised: False") and passes with it. Also checked by real mouse clicks in the running app.IsebergNativeContinuationTests.CompletionWithNothingToReplaceAnchorsEmptySpanAtCaretcovers the engine and the script editor on""and" ". It fails without the fix (-1).PortableIseInstallationTestscases: realpwshreport output parses and validates; malformed reports are rejected; a fakepwshreporting 7.3 fails in about 0.25 s with "found 7.3.0" (it times out on the old code); apwshthat exits without reporting, and a missing executable, keep the existing messages.master, on Windows (Release, 0 warnings): App.Tests 606/606, Settings.Tests 206/206, UI.Tests 670/670. Linux and macOS were not run locally; the fake-pwshtests include a POSIX shell variant.🤖 Generated with Claude Code