fix: address the four alpha1 field reports - #32
Merged
Conversation
Local testing of v1.3.0-alpha1 reported four issues. This change fixes all
four ahead of the 1.3.0 beta.
1. The Command Timeline handle covered terminal content. The floating 28x48
button is now a 6-pixel strip flush against the terminal's left edge, in
the manner of an auto-hiding scrollbar. It widens to 20 pixels and shows
its chevron on pointer hover, keyboard focus, or while the overlay is
open, driven by _updateCommandTimelineHandleVisual.
2. Clicking the terminal area while the overlay was open did not close it.
A pointer press on the terminal grid now light-dismisses the overlay and
still continues into the terminal as normal input. Presses on the overlay
itself never reach that handler, so overlay interaction is unaffected.
3. A dir listing left the Visual Progress bar animating indefinitely. Three
recognition defects compounded:
- _matchGradle claimed ownership from a bare product-name mention (for
example a ".gradle" directory entry) and, once claimed, rematched every
later record through an unconditional stage fallback, refreshing the
bar forever. Each record now needs build-tool evidence of its own: a
status meter with a real value, a wrapper download, or a task line.
- A still-running built-in provider bar was never structurally cleared
when its stream moved on; only Generic was. The engine now tolerates
one ordinary record and publishes a structural clear on the second
consecutive ordinary record. Success and Error results still persist,
and progress-shaped records that keep a live claim do not advance the
count.
- _findIntegerFraction read slashed dates such as 2025/10/13 as 76%
completed/total meters. A digit/digit/digit chain is now rejected.
4. Typed commands never appeared in the Command Timeline because nothing
ever imported the packaged winTerm.Shell module: the launcher contract in
docs/powershell-integration.md had no launcher. Connection creation now
rewrites a bare powershell.exe or pwsh.exe profile commandline (only
-NoLogo and -NoExit are tolerated) to append -NoExit -Command with a
fragment that sets WINTERM_SESSION_ID and WINTERM_INTEGRATION_VERSION and
imports the packaged manifest with -ErrorAction SilentlyContinue. The
eligibility rules live in src/winterm/Shell/AutoIntegration.h; anything
not positively recognized launches unchanged, execution policy is never
altered, quote characters in the manifest path or session id refuse the
rewrite, and an already-rewritten commandline reused by a restarted
connection is not rewritten twice. The new per-profile setting
"shellIntegration.autoInject" (default true) disables the rewrite.
Guards in test-command-timeline.ps1 now assert the auto-hiding handle and
the light-dismiss path. New unit tests cover the listing false positives,
the structural clear, terminal-state persistence, and the auto-integration
eligibility rules including its refusal cases.
No persistent history, no output cache, no heuristic prompt detection, no
telemetry. Workspace schema, docking model, shell protocol, theme schema,
update manifest schema, package identity, and signing policy are unchanged.
12 tasks
HelloThisWorld
added a commit
that referenced
this pull request
Aug 4, 2026
Promotes the four alpha1 field-report fixes, already on main through pull request #32, to a second installable alpha. This commit only moves the release metadata. - Set application version 1.3.0-alpha2, PowerShell module prerelease suffix alpha2, and tag v1.3.0-alpha2. The channel stays alpha, and the module version stays 1.3.0. - Advance the package/file version to 1.3.0.1 so the alpha2 binaries are distinguishable from alpha1 in the FILEVERSION and PRODUCTVERSION numeric fields. The MSIX manifest and all three Win32 resource scripts move with it, and the display ProductVersion strings carry 1.3.0-alpha2. - Update the version literals pinned by verify-version.ps1, verify-branding.ps1, test-visual-progress.ps1, test.ps1, and package-shell-assets.ps1. - Add the 1.3.0-alpha2 release notes with a "Changes since alpha1" section covering the four fixes and the unsigned Setup EXE disclosure, and retitle the changelog's unreleased section. The release workflow marks any non-stable channel with --prerelease and --latest=false, so /releases/latest keeps resolving to v1.2.0, the alpha is not listed on the winTerm website, and the WinGet workflow skips it. Workspace schema, docking model, shell protocol, theme schema, update manifest schema, package identity, and signing policy are unchanged.
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
Fixes the four issues reported from local v1.3.0-alpha1 testing, ahead of
the 1.3.0 beta. Version metadata is unchanged; this is a source-only fix PR.
dirleft the progress bar animating foreverwinTerm.Shellmodule, so OSC 133 marks work out of the boxDetailed changes
3 — Visual Progress stuck bar (
src/winterm/VisualProgress/ProgressRecognition.h)_matchGradleclaimed ownership from a bare product-name mention — adirlisting entry such as
.gradle— and, once claimed, rematched every laterrecord through an unconditional stage fallback, so prompts and echoes kept
refreshing an indeterminate bar forever. Each record now needs build-tool
evidence of its own: a status meter with a real value (
75% EXECUTING), awrapper download, or a
> Taskline. The existing fixtures for all threestill classify as Gradle.
its stream moved on (only
Genericwas). The engine now tolerates oneordinary record — so an informational line inside a live meter stream does
not blank the bar — and publishes a structural clear on the second
consecutive ordinary record. Success/Error results still persist, and
progress-shaped records that deliberately keep a live claim do not advance
the count.
_findIntegerFractionread slashed dates (2025/10/13→10/13→ 76 %) ascompleted/total meters, so every short-date
dirline flashed a determinatebar. A
digit/digit/digitchain is now rejected; realN/Mmeters areunaffected.
One existing test expectation changed accordingly: in
RecognitionPreservesHighConfidenceOwnershipAndClearsGeneric, the stale wgetshape after ownership expiry now yields the structural clear publication
(provider
None, hidden, not visible) instead of leaving the dangling wget barrunning — which was this same bug class.
4 — Shell integration out of the box
docs/powershell-integration.mddocumented a launcher contract, but nothing inthe product ever performed it, so a fresh install had no OSC 133 marks and the
Timeline stayed empty. Now:
src/winterm/Shell/AutoIntegration.h(new, header-only, unit-tested):recognizes only
powershell.exe/pwsh.exeby basename; tolerates only-NoLogoand-NoExit; refuses-Command,-File,-EncodedCommand,-NoProfile,-ExecutionPolicy, and every other customization; refusesquote characters in the manifest path or session id; refuses an
already-rewritten commandline (restarted connections reuse theirs).
TerminalPage::_CreateConnectionFromSettingsappends-NoExit -Command "&{ $env:WINTERM_SESSION_ID='…'; $env:WINTERM_INTEGRATION_VERSION='1'; Import-Module -Name '…' -ErrorAction SilentlyContinue }"when the packaged manifest exists next to the executable. Execution policy is
never altered; an import failure leaves a working shell without integration.
"shellIntegration.autoInject"(defaulttrue),plumbed through
MTSMSettings.h/Profile.idland documented inprofiles.schema.json.With the module imported, the module emits
133;A,9;9,133;B,133;D,and the inherited
autoMarkPromptsbehavior supplies the command-executedtransition — the exact supported path the Timeline was built against.
1 + 2 — TermControl
TermControl.xaml: handle isWidth="6",Margin="0", flush left, roundedon the right only, icon collapsed at rest.
_updateCommandTimelineHandleVisual()centralizes the expand/collapse rule;pointer enter/exit and focus handlers drive it, and open/close pass through
it. Automation name, tooltip, and glyph behavior are unchanged.
_PointerPressedHandlercloses an open overlay when the press is not overit, then continues normal terminal input handling.
test-command-timeline.ps1guards updated: the auto-hiding handle markup andthe light-dismiss condition are now asserted; the stale
Margin="8,0,0,0"assertion is gone.
Validation performed
Environment: Windows 11 Pro 26100, MSVC 14.44.35207, Windows SDK 10.0.26100.0.
Compiled tests — ran, passed
WinTermVisualProgress+WinTermShell+WinTermCommandTimeline)Total=44, Passed=44, Failed=0CommandTimelineTests(Control)Total=43, Passed=43, Failed=0New tests:
RecognitionIgnoresProductMentionsInListings,RecognitionClearsStaleRunningProviderAfterOrdinaryRecords,AutoIntegrationRewritesBarePowerShellCommandlines,AutoIntegrationRefusesCustomizedOrUnsafeInput.Builds — ran, clean
SettingsModel.UnitTestsx64 ReleaseControl.UnitTestsx64 Release (includesMicrosoft.Terminal.Control.Libwith the TermControl changes)TerminalAppLibx64 Release (includesTerminalPage.cpp)Repository gates — ran, passed
test-command-timeline.ps1,test-visual-progress.ps1,test-privacy.ps1,verify-version.ps1,test-release-workflow.ps1,test-ci-classification.ps1,test.ps1 -Suite Smoke -Configuration Release -Platform x64.Static —
git diff --checkclean; clang-format clean over the changedranges (
TermControldifferences verified to be EOL-representation only).Not run, with reason —
test-shell-integration.ps1 -Shell All: blocked bylocal antivirus/AMSI on
Compatibility.ps1, a file untouched by this PR andbyte-identical to
main. It runs in the release workflow's gates.No screenshot was needed or created.
winterm-siteis untouched.Checklist
CHANGELOG.md.Development-Changes.mdledger has been pushed with the final source SHA, link, summary, and checkpoint/release.winterm-siteasset, or no screenshot was added.winterm.exe, and Microsoft Terminal coexistence remain isolated.Source ↔ Wiki mapping
f3697b801de69cBoundary
No persistent history, no output cache, no output search, no heuristic prompt
detection, no telemetry. Workspace schema (2), docking model (1), shell
protocol (1), theme schema (1), update manifest schema (1), package identity,
and signing policy are unchanged. Version metadata is unchanged. No
winterm-sitechange.Next step after this merges: local re-test of the four fixes, then cut
v1.3.0-beta1on channelbetawith the winTerm website's stable/betadownload columns.