Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,22 @@
# Changelog

## 1.3.0-beta1 - 2026-08-04

First beta of the Command Timeline release. The feature content is identical
to 1.3.0-alpha4, which passed local field testing; this release advances the
channel from `alpha` to `beta`. The beta is published as a GitHub prerelease
and is listed on the winTerm website next to the stable download. GitHub
Latest and WinGet continue to point at v1.2.0 until a stable 1.3.0.

### Changed

- Advanced the channel to `beta`: application version `1.3.0-beta1`,
package/file version `1.3.0.4`, PowerShell module `1.3.0` with prerelease
suffix `beta1`.
- Updated the README to cover the Command Timeline and automatic PowerShell
shell integration, and to present the stable and beta download channels.


## 1.3.0-alpha4 - 2026-08-04

Fourth alpha prerelease: fixes for the three alpha3 field reports. Like the
Expand Down
31 changes: 24 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,18 @@
[![Windows CI](https://img.shields.io/github/actions/workflow/status/HelloThisWorld/winTerm/winterm-validation.yml?branch=main&label=Windows%20CI)](https://github.com/HelloThisWorld/winTerm/actions/workflows/winterm-validation.yml)
[![Latest release](https://img.shields.io/github/v/release/HelloThisWorld/winTerm?display_name=tag&label=release)](https://github.com/HelloThisWorld/winTerm/releases/latest)

## Download the latest winTerm release
## Download winTerm

[**Open the latest release and download winTerm for x64**](https://github.com/HelloThisWorld/winTerm/releases/latest)
[**Open the latest stable release and download winTerm for x64**](https://github.com/HelloThisWorld/winTerm/releases/latest)

The latest Release page provides the Setup EXE, Portable ZIP, release notes,
and checksums together.
The latest stable Release page provides the Setup EXE, Portable ZIP, release
notes, and checksums together.

A **beta** channel is also available for early access to the Command
Timeline:
[v1.3.0-beta1](https://github.com/HelloThisWorld/winTerm/releases/tag/v1.3.0-beta1)
is published as a GitHub prerelease with the same asset layout. Betas are for
testing; the stable release above stays the recommended download.

The installer is unsigned, so Windows may display Unknown Publisher or a
SmartScreen warning. Download only from the official release above and verify
Expand All @@ -29,7 +35,8 @@ application downloads are:
- `winTerm-<version>-setup-x64.exe` — current-user or all-users installation;
- `winTerm-<version>-portable-x64.zip` — extract and run without installation.

The current source version is `1.2.0`. See the
The current source version is `1.3.0-beta1`;
the latest stable release is `1.2.0`. See the
[latest official Release](https://github.com/HelloThisWorld/winTerm/releases/latest)
for the complete published asset list and checksums.

Expand All @@ -43,6 +50,16 @@ See [installation guidance](docs/user/installation.md) and the

## Core features

- a per-pane **Command Timeline** (`Ctrl+Tab`, or the thin handle on the
terminal's left edge): an in-memory list of the commands that pane has run,
built from OSC 133 shell integration only, with load-without-executing onto
the input line, literal case-insensitive filtering, copy command/output,
jump to output, and trustworthy ✓/✕/Running status that never guesses;
- automatic PowerShell shell integration: a bare `powershell.exe` or
`pwsh.exe` profile imports the packaged `winTerm.Shell` module at startup
(per-profile setting `"shellIntegration.autoInject"`, default on), so
command marks work out of the box; customized commandlines are never
rewritten, and `cmd.exe` is never guessed at;
- Top, Bottom, Left, and Right splits relative to the focused pane, retaining
profile selection and transactional rollback;
- border-drag pane resizing with continuous updates, minimum-size constraints,
Expand Down Expand Up @@ -87,8 +104,8 @@ Use PowerShell 7 and the Microsoft Terminal toolchain described in
.\scripts\winterm\build.ps1 -Configuration Release -Platform x64 -IncludeTests
.\scripts\winterm\test.ps1 -Suite Relevant -Configuration Release -Platform x64
.\scripts\winterm\build-unpackaged.ps1 -Configuration Release -Platform x64
.\scripts\winterm\build-installer.ps1 -Version 1.2.0 -Platform x64
.\scripts\winterm\build-portable.ps1 -Version 1.2.0 -Platform x64
.\scripts\winterm\build-installer.ps1 -Version 1.3.0-beta1 -Platform x64
.\scripts\winterm\build-portable.ps1 -Version 1.3.0-beta1 -Platform x64
```

The unpackaged generator uses an unsigned MSIX only as an upstream build
Expand Down
34 changes: 17 additions & 17 deletions docs/current-progress.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,24 +4,25 @@ Last updated: 2026-08-04

## Repository state

- Branch: `release/v1.3.0-alpha4`
- Base branch: `main` at `49ee5eb3` (alpha3 field-report fixes, pull
request #36)
- Branch: `release/v1.3.0-beta1`
- Base branch: `main` at `c089caeb` (1.3.0-alpha4 release metadata, pull
request #37)
- Microsoft Terminal upstream revision:
`1cea42d433253d95c4487a3037db48197b5e72f4`
- Application version: `1.3.0-alpha4`
- Package/file version: `1.3.0.3`
- PowerShell module version: `1.3.0` with prerelease suffix `alpha4`
- Release channel: `alpha`
- Release tag: `v1.3.0-alpha4`
- Application version: `1.3.0-beta1`
- Package/file version: `1.3.0.4`
- PowerShell module version: `1.3.0` with prerelease suffix `beta1`
- Release channel: `beta`
- Release tag: `v1.3.0-beta1`
- Current public Latest: `v1.2.0`, the stable Visual Progress release
- Supported target: Windows 11 x64

`v1.3.0-alpha4` follows `v1.3.0-alpha3` as a GitHub **prerelease** for local
testing, carrying the three alpha3 field-report fixes. 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 deliberately not
listed on the winTerm website and is skipped by the WinGet workflow.
`v1.3.0-beta1` is the first beta of the Command Timeline release, with
feature content identical to `v1.3.0-alpha4`, which passed local field
testing. The release workflow marks any non-stable channel with
`--prerelease` and `--latest=false`, so `/releases/latest` keeps resolving to
v1.2.0. Unlike the alphas, the beta is listed on the winTerm website next to
the stable v1.2.0 download; it is still skipped by the WinGet workflow.

## Command Timeline status

Expand Down Expand Up @@ -106,10 +107,9 @@ through pull request #32:

## Next steps

1. Install `v1.3.0-alpha4` locally and re-test the three fixes.
2. Cut `v1.3.0-beta1` on channel `beta` once alpha4 passes local testing. The
beta may be listed on the winTerm website alongside the stable v1.2.0
download.
1. Update the winTerm website: dual stable/beta download columns, refreshed
sanitized screenshots, the Tools navigation dropdown, and the logo link.
2. Collect beta feedback.
3. Promote to a stable `v1.3.0` only after beta testing, which is the point at
which Latest, WinGet, and the website stable slot move.

Expand Down
163 changes: 163 additions & 0 deletions docs/releases/1.3.0-beta1.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,163 @@
# winTerm 1.3.0-beta1

**This is a beta prerelease.** The current stable release remains
[v1.2.0](https://github.com/HelloThisWorld/winTerm/releases/tag/v1.2.0), and
`/releases/latest` continues to point there. The beta is listed on the winTerm
website next to the stable download and is published as a GitHub prerelease;
it is not submitted to WinGet.

winTerm 1.3.0-beta1 delivers the **Command Timeline**. Its feature content is
identical to 1.3.0-alpha4, which passed local field testing across four alpha
rounds; this release advances the channel to beta.

## What is new since v1.2.0: Command Timeline

The Command Timeline is a per-pane, in-memory list of the commands that pane
has run. Open it with `Ctrl+Tab`, or with the thin auto-hiding handle on the
left edge of the terminal; click the terminal, press `Escape`, or press
`Ctrl+Tab` again to close it.

- **Per-pane history.** Each pane keeps its own list, built from OSC 133
shell integration only. winTerm never guesses where a prompt or output
begins, and `cmd.exe` — which does not report command boundaries — shows
`Command timeline unavailable` rather than untrustworthy results.
- **Works out of the box.** A profile whose commandline is a bare
`powershell.exe` or `pwsh.exe` (optionally with `-NoLogo`/`-NoExit`)
automatically imports the packaged `winTerm.Shell` integration module at
startup. Any customized commandline launches unchanged; the per-profile
setting `"shellIntegration.autoInject": false` turns the rewrite off.
- **Load without executing.** `Enter` or a single click puts the selected
command on the input line and stops there. No carriage return is ever sent,
the Windows clipboard is never read, and input broadcast never forwards the
load to another pane.
- **Filtering.** Press `/` or `Tab` and type to narrow the list. Matching is
a plain, case-insensitive substring match over command text only — no
wildcards, no regular expressions, no fuzzy matching, and command output is
never searched.
- **Copy and jump.** Right-click an entry to copy the command, copy its
output, or scroll to where its output begins. Output is read from the
terminal buffer only at that moment and is never cached.
- **Trustworthy status.** A command shows ● Running while it executes and
resolves to ✓ Succeeded or ✕ Failed when the shell reports its exit code.
`Unknown` appears only when the shell genuinely did not report a result,
and explains itself on hover. Status is never conveyed by color alone.
- **Readable rows.** Hover any row for the full command text; the selection
moves without rebuilding rows, so the list stays steady under the arrow
keys.

## Keyboard

| Shortcut | Behavior |
| --- | --- |
| `Ctrl+Tab` | Toggle the Command Timeline for the focused pane |
| `Ctrl+T` | Next tab |
| `Ctrl+Shift+T` | Previous tab |
| `Ctrl+Alt+T` | Open new tab |

While the Timeline is open:

| Key | Behavior |
| --- | --- |
| `/` or `Tab` | Move focus to the filter box |
| `Up` / `Down` | Move the selection by one command |
| `Left` / `Right` | Select the first / last command on the current page |
| `Enter` | Load the selected command; never runs it |
| `Space` | Scroll the terminal to that command's output |
| `Ctrl+C` | Copy the selected command text |
| `Escape` | Clear the filter, or close the Timeline if the filter is empty |

Your own key bindings take precedence over every default above. Keys the
Timeline consumes are not sent to the shell, and filter text never reaches
the shell.

## Settings

```json
{
"commandTimeline.enabled": true,
"commandTimeline.historyLimit": 500
}
```

Per profile:

```json
{
"shellIntegration.autoInject": true
}
```

- **Show command timeline** defaults on. Turning it off hides the handle,
closes an open overlay, and stops `Ctrl+Tab` from opening it.
- **Commands remembered per pane** defaults to 500 and accepts 50 through
5000. An out-of-range value is clamped rather than failing the settings
load.

An existing settings file needs no migration.

## Changes accumulated through the alpha series

- alpha2: auto-injected shell integration, the auto-hiding handle,
terminal-click light dismiss, and the recognition-engine fixes for stuck
progress bars.
- alpha3: correct FinalTerm mark emission (no stray characters, exact command
capture), no progress bar at an idle prompt, no phantom Timeline row, no
selection jitter, and silent degradation when antivirus blocks an optional
module component.
- alpha4: the antivirus write-then-execute false positive removed at its
source, ✓/✕ results restored through the Enter-keypress lifecycle
notification, and full-command tooltips.

## Privacy

- Command text lives only in memory, only in the pane that ran it, and only
while that pane is open. Nothing is written to disk; there is no command
history file or database.
- Command output is never cached, indexed, or searched.
- Filter text is never saved and never leaves the pane.
- No telemetry is written, and no command, output, path, or filter text is
logged.
- The clipboard is written only by an explicit copy action, and is never
read.

See the [privacy policy](https://github.com/HelloThisWorld/winTerm/blob/main/PRIVACY.md).

## Unchanged in this release

Workspace schema (2), docking model (1), shell protocol (1), theme schema
(1), update manifest schema (1), package identity, and signing policy are all
unchanged from v1.2.0. Visual Progress behavior is unchanged apart from the
recognition fixes above.

## Known limitations

- The Timeline requires OSC 133 shell integration; it stays unavailable under
`cmd.exe`.
- A multi-line command is refused when the shell has not enabled bracketed
paste, because unbracketed line breaks would be read as pressing Enter.
- Loading a command longer than 1024 characters asks for a confirming
`Enter`.
- Command history does not survive closing a pane, and is intentionally never
persisted.

## Installation

The Setup EXE supports current-user and all-users installation; the Portable
ZIP can be extracted to a writable directory and run without installation.
Installing the beta over v1.2.0 or an alpha is supported; the file version is
`1.3.0.4`. Package identity stays separate from Microsoft Terminal, so it
does not disturb an existing Windows Terminal installation.

Publisher: `helloThisWorld`. Tag: `v1.3.0-beta1`.

## Signing

The winTerm 1.3.0-beta1 Setup EXE is not Authenticode-signed. Windows may
display Unknown Publisher or a SmartScreen warning. Download only from the
official GitHub Release and verify the file against `SHA256SUMS.txt` before
running it.

## Policies

- [Code signing policy](https://github.com/HelloThisWorld/winTerm/blob/main/CODE_SIGNING_POLICY.md)
- [Privacy policy](https://github.com/HelloThisWorld/winTerm/blob/main/PRIVACY.md)
4 changes: 2 additions & 2 deletions scripts/winterm/package-shell-assets.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,8 @@ foreach ($relativePath in $sourceAssets)

$version = Get-Content -LiteralPath (Join-Path $repositoryRoot 'shell\shared\version.json') -Raw | ConvertFrom-Json
if ($version.moduleVersion -ne '1.3.0' -or
$version.modulePrerelease -ne 'alpha4' -or
$version.applicationVersion -ne '1.3.0-alpha4' -or
$version.modulePrerelease -ne 'beta1' -or
$version.applicationVersion -ne '1.3.0-beta1' -or
$version.protocolVersion -ne 1)
{
throw 'The winTerm Shell asset version metadata is invalid.'
Expand Down
36 changes: 18 additions & 18 deletions scripts/winterm/test-visual-progress.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -1378,12 +1378,12 @@ try

$version = $source.VersionMetadata | ConvertFrom-Json
$expectedVersionValues = [ordered]@{
applicationVersion = '1.3.0-alpha4'
packageVersion = '1.3.0.3'
applicationVersion = '1.3.0-beta1'
packageVersion = '1.3.0.4'
moduleVersion = '1.3.0'
modulePrerelease = 'alpha4'
channel = 'alpha'
tag = 'v1.3.0-alpha4'
modulePrerelease = 'beta1'
channel = 'beta'
tag = 'v1.3.0-beta1'
workspaceSchemaVersion = 2
dockingModelVersion = 1
shellProtocolVersion = 1
Expand All @@ -1398,39 +1398,39 @@ try
}
}
$shellVersion = $source.ShellVersion | ConvertFrom-Json
if ($shellVersion.applicationVersion -ne '1.3.0-alpha4' -or $shellVersion.moduleVersion -ne '1.3.0' -or $shellVersion.protocolVersion -ne 1)
if ($shellVersion.applicationVersion -ne '1.3.0-beta1' -or $shellVersion.moduleVersion -ne '1.3.0' -or $shellVersion.protocolVersion -ne 1)
{
throw 'Shell version metadata does not match winTerm release 1.3.0-alpha4 with protocol version 1.'
throw 'Shell version metadata does not match winTerm release 1.3.0-beta1 with protocol version 1.'
}
foreach ($surface in @(
@{ Content = $source.ReleaseMetadata; Value = 'ApplicationVersion{ L"1.3.0-alpha4" }'; Description = 'About release metadata' },
@{ Content = $source.PackageManifest; Value = 'Version="1.3.0.3"'; Description = 'MSIX package manifest' },
@{ Content = $source.HostResource; Value = 'FILEVERSION 1,3,0,3'; Description = 'Terminal host file version' },
@{ Content = $source.HostResource; Value = '"ProductVersion", "1.3.0-alpha4\0"'; Description = 'Terminal host display version' },
@{ Content = $source.ShimResource; Value = 'FILEVERSION 1,3,0,3'; Description = 'Shim file version' },
@{ Content = $source.ShimResource; Value = '"ProductVersion", "1.3.0-alpha4\0"'; Description = 'Shim display version' },
@{ Content = $source.ReleaseMetadata; Value = 'ApplicationVersion{ L"1.3.0-beta1" }'; Description = 'About release metadata' },
@{ Content = $source.PackageManifest; Value = 'Version="1.3.0.4"'; Description = 'MSIX package manifest' },
@{ Content = $source.HostResource; Value = 'FILEVERSION 1,3,0,4'; Description = 'Terminal host file version' },
@{ Content = $source.HostResource; Value = '"ProductVersion", "1.3.0-beta1\0"'; Description = 'Terminal host display version' },
@{ Content = $source.ShimResource; Value = 'FILEVERSION 1,3,0,4'; Description = 'Shim file version' },
@{ Content = $source.ShimResource; Value = '"ProductVersion", "1.3.0-beta1\0"'; Description = 'Shim display version' },
@{ Content = $source.CustomProps; Value = '<VersionMajor>1</VersionMajor>'; Description = 'Executable major version' },
@{ Content = $source.CustomProps; Value = '<VersionMinor>3</VersionMinor>'; Description = 'Executable minor version' },
@{ Content = $source.ShellModuleManifest; Value = "ModuleVersion = '1.3.0'"; Description = 'PowerShell module manifest' },
@{ Content = $source.ShellModule; Value = "`$script:WinTermModuleVersion = '1.3.0'"; Description = 'PowerShell module runtime' },
@{ Content = $source.PackageShellAssets; Value = "'shell\shared\version.json'"; Description = 'Canonical shell version metadata packaging' },
@{ Content = $source.WorkspaceSerializer; Value = '"1.3.0-alpha4"'; Description = 'Workspace application-version fallback' }
@{ Content = $source.WorkspaceSerializer; Value = '"1.3.0-beta1"'; Description = 'Workspace application-version fallback' }
))
{
Assert-Contains $surface.Content $surface.Value $surface.Description
}
foreach ($required in @(
"applicationVersion -eq '1.3.0-alpha4'",
"packageVersion -eq '1.3.0.3'",
"applicationVersion -eq '1.3.0-beta1'",
"packageVersion -eq '1.3.0.4'",
"moduleVersion -eq '1.3.0'",
"tag -eq 'v1.3.0-alpha4'",
"tag -eq 'v1.3.0-beta1'",
"Workspace Schema version remains 2",
"Docking Model version remains 1",
"Shell Protocol version remains 1",
"Theme Schema remains at version 1"
))
{
Assert-Contains $source.VerifyVersion $required 'Authoritative v1.3.0-alpha4 version validation surface'
Assert-Contains $source.VerifyVersion $required 'Authoritative v1.3.0-beta1 version validation surface'
}

$testBinary = Join-Path $root "bin\$Platform\$Configuration\UnitTests_SettingsModel\SettingsModel.Unit.Tests.dll"
Expand Down
2 changes: 1 addition & 1 deletion scripts/winterm/test.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -293,7 +293,7 @@ function Test-ShellExperienceFoundations

$manifest = Import-PowerShellDataFile -LiteralPath $moduleManifest
if ($manifest.ModuleVersion -ne '1.3.0' -or
$manifest.PrivateData.PSData.Prerelease -ne 'alpha4' -or
$manifest.PrivateData.PSData.Prerelease -ne 'beta1' -or
$manifest.PowerShellVersion -ne '5.1')
{
throw 'The winTerm PowerShell module manifest does not declare the supported version boundary.'
Expand Down
Loading