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
8 changes: 7 additions & 1 deletion .github/workflows/winget.yml
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,13 @@ jobs:

validate:
name: Generate and validate manifests from a public Release
if: github.event_name == 'release' || github.event_name == 'workflow_dispatch'
# WinGet distributes stable versions only. A prerelease Release (alpha or
# beta) must never generate a WinGet manifest, so it is skipped here rather
# than failing later on a version string WinGet cannot express. A manual
# dispatch still works for republishing an existing stable Release.
if: >-
(github.event_name == 'release' && !github.event.release.prerelease)
|| github.event_name == 'workflow_dispatch'
runs-on: windows-2022
timeout-minutes: 30
steps:
Expand Down
37 changes: 37 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,42 @@
# Changelog

## 1.3.0-alpha1 - 2026-08-04

First public prerelease of the Command Timeline. This is an alpha for local
testing, not a stable release: GitHub Latest and the winTerm website continue
to point at v1.2.0, and this version is not submitted to WinGet.

### Added

- Promoted the Command Timeline to a testable prerelease, combining engineering
checkpoints v1.2.1 through v1.2.4: the pane-owned OSC 133 index, the overlay
and deterministic navigation, load/copy/jump entry actions, and pane-local
search with the two public settings.
- Published `commandTimeline.enabled` (default `true`) and
`commandTimeline.historyLimit` (default `500`, range 50–5000) under
Settings → Appearance → Command timeline.

### Changed

- Advanced the release channel to `alpha` with application version
`1.3.0-alpha1`, package/file version `1.3.0.0`, and PowerShell module version
`1.3.0` plus prerelease suffix `alpha1`. The release workflow marks any
non-stable channel as a GitHub prerelease with `--latest=false`, so the
public Latest download remains v1.2.0.
- Relaxed `verify-version.ps1` from a stable-only gate to a channel-aware one.
It now accepts `stable`, `alpha`, and `beta`, and additionally enforces that
the channel, the module prerelease suffix, and the application-version suffix
agree, that the package version stays four-part numeric, and that the module
version stays numeric.
- Added a prerelease guard to the WinGet workflow so an alpha or beta Release
never generates a WinGet manifest.

### Checkpoint status

- Workspace schema, docking model, shell protocol, theme schema, update
manifest schema, package identity, and signing policy are unchanged from
v1.2.0. The Setup EXE remains unsigned; see the release notes.

## 1.2.4 - 2026-08-04

### Added
Expand Down
2 changes: 1 addition & 1 deletion custom.props
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<XesUseOneStoreVersioning>true</XesUseOneStoreVersioning>
<XesBaseYearForStoreVersion>2026</XesBaseYearForStoreVersion>
<VersionMajor>1</VersionMajor>
<VersionMinor>2</VersionMinor>
<VersionMinor>3</VersionMinor>
<VersionInfoProductName Condition="'$(WindowsTerminalBranding)'=='WinTerm'">winTerm</VersionInfoProductName>
<VersionInfoProductName Condition="'$(VersionInfoProductName)'==''">Windows Terminal</VersionInfoProductName>
<VersionInfoCulture>1033</VersionInfoCulture>
Expand Down
107 changes: 51 additions & 56 deletions docs/current-progress.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,68 +4,63 @@ Last updated: 2026-08-04

## Repository state

- Branch: `feature/command-timeline-v1.3.0-phase4`
- Base branch: `main`. Command Timeline Phase 3 (tag `v1.2.3`) was squash-merged
to `main` as `5fd2172` through pull request #29.
- Branch: `release/v1.3.0-alpha1`
- Base branch: `main` at `ac760eab` (Command Timeline Phase 4, pull request #30)
- Microsoft Terminal upstream revision:
`1cea42d433253d95c4487a3037db48197b5e72f4`
- Engineering application and PowerShell module version: `1.2.4`
- Engineering package version: `1.2.4.0`
- Intended checkpoint tag: `v1.2.4`
- Final Command Timeline release target: `v1.3.0`
- Current public Latest: `v1.2.0`
- Application version: `1.3.0-alpha1`
- Package/file version: `1.3.0.0`
- PowerShell module version: `1.3.0` with prerelease suffix `alpha1`
- Release channel: `alpha`
- Release tag: `v1.3.0-alpha1`
- Current public Latest: `v1.2.0`, the stable Visual Progress release
- Supported target: Windows 11 x64

`v1.2.4` is a development checkpoint, not a distributable release. The README
and GitHub Latest continue to identify v1.2.0 as the public Visual Progress
release. Checkpoint tags v1.2.1 through v1.2.4 run quick validation only and are
explicitly excluded from full build, installer packaging, asset publication,
and GitHub Release jobs.
`v1.3.0-alpha1` is a published GitHub **prerelease**, not a stable release. 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.

## Implemented in the working tree
## Command Timeline status

- Retained the Phase 1 index, the Phase 2 overlay and navigation model, and the
Phase 3 load/copy/jump entry actions unchanged in behavior.
- Added pane-local search over each pane's bounded in-memory command text. The
match is a literal case-insensitive substring search; there is no regex, no
fuzzy matching, no output search, and no terminal-buffer rescan.
- Added a 256 UTF-16 code-unit query cap that truncates without leaving a lone
surrogate, enforced in the model and mirrored by `MaxLength` on the filter box.
- Reworked the navigation model to walk a filtered projection while keeping
stable `CommandId` identity. A still-matching command stays selected, a command
that stops matching hands selection to the nearest surviving match, and a new
command only takes the selection when it matches and the view was already
following the latest command.
- Added `/` and Tab to focus the filter box. Both are consumed before the PTY,
and filter-box text never reaches the shell. Escape now clears a non-empty
query before it closes the overlay.
- Added the `commandTimeline.enabled` and `commandTimeline.historyLimit` global
settings with defaults `true` and `500`, a 50–5000 clamped range, JSON schema
entries, and a Settings UI section under Appearance. An absent setting is not
serialized back, so existing settings files need no migration.
- Added bounded per-pane history with oldest-first eviction that applies to
panes that already exist and to new panes. Raising the limit never resurrects
an evicted command and sequence IDs are never reused.
- Added four distinct empty states so an unsupported shell is never reported as
simply having run no commands.
- Made list item position and set size reflect the filtered result count, and
kept localized accessible names, non-color status, High Contrast theme
resources, and the Reduced Motion-safe no-animation path.
- Advanced authoritative engineering version surfaces to `1.2.4`/`1.2.4.0` and
added the v1.2.4 root changelog entry.
- Kept `v1.3.0-alpha` out of scope: no persistent history, no output cache, no
telemetry, and no public release work.
The Command Timeline is feature-complete for its in-memory surface. Engineering
checkpoints v1.2.1 through v1.2.4 are all merged to `main`:

## Validation state
| Checkpoint | Scope |
| --- | --- |
| `v1.2.1` | Pane-owned OSC 133 index, stable command IDs, bounded command-text cache |
| `v1.2.2` | Overlay, deterministic navigation, wheel accumulation, accessibility |
| `v1.2.3` | Load without executing, copy command/output, jump to output, context menu |
| `v1.2.4` | Pane-local search, public settings, shell degradation, bounded history |

There is no persistent history, no output cache, no output search, and no
telemetry.

## Release channel handling

`verify-version.ps1` is now channel-aware rather than stable-only. It accepts
`stable`, `alpha`, and `beta`, and enforces that the channel, the module
prerelease suffix, and the application-version suffix agree with each other, so
a prerelease can never publish as Latest and a stable release can never carry a
prerelease suffix. The package version stays four-part numeric for MSIX and the
Win32 resource fields, and the PowerShell module version stays numeric with the
suffix carried in `PrivateData.PSData.Prerelease`.

Phase 4 validation requires the focused Command Timeline model/control tests,
the Settings Model Command Timeline tests, the extended
`test-command-timeline.ps1` source, search, settings, and privacy boundaries,
version and branding verification, release/CI classification guards, repository
Smoke validation, the smallest affected native projects, and GitHub quick PR
validation. Record exact results in the Draft PR and final task report; do not
treat this document as evidence for a command that did not run.
## Next steps

1. Install `v1.3.0-alpha1` locally and exercise the Command Timeline.
2. Fix anything the alpha testing surfaces.
3. Cut `v1.3.0-beta1` on channel `beta`. The beta may be listed on the winTerm
website alongside the stable v1.2.0 download.
4. 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.

## Validation state

The annotated `v1.2.4` checkpoint tag must point to the final commit that passes
those gates. Its tag workflow must run checkpoint quick validation only and
must not create a GitHub Release or update Latest.
Publication is gated by the tag-triggered release workflow: exact tag/version
match, release absence, clean checkout, version and branding verification,
static/security/privacy/workflow gates, an x64 Release build with compiled
tests, artifact generation, Draft asset re-download testing, and only then
publication. Record results from those actual runs; do not treat this document
as evidence for a command that did not run.
146 changes: 146 additions & 0 deletions docs/releases/1.3.0-alpha1.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
# winTerm 1.3.0-alpha1

**This is an alpha prerelease for local testing. It is not a stable release.**
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. This alpha is published only as a
tagged GitHub prerelease; it is not listed on the winTerm website and is not
submitted to WinGet.

winTerm 1.3.0-alpha1 brings the Command Timeline feature to a testable state.
It is the combined result of engineering checkpoints v1.2.1 through v1.2.4.

## What is new: 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 handle on the left edge of the
terminal.

- **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.
- **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. You review the command and press Enter yourself.
- **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 as succeeded or failed only when the
shell actually reported it. Incomplete shell integration reads as Unknown
rather than guessing, and status is never conveyed by color alone.

## 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 and defaults

A new section lives under **Settings → Appearance → Command timeline**:

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

- **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.
Lowering it discards the oldest commands immediately; raising it does not
bring them back.

An existing settings file needs no migration. An out-of-range value is clamped
into the supported range rather than failing the settings load.

## Shell requirements

The Timeline depends on OSC 133 shell integration.

| Situation | What you see |
| --- | --- |
| Capability not yet determined | `Waiting for shell integration` |
| Shell does not report complete command boundaries | `Command timeline unavailable` |
| Shell integration works, no commands yet | `No commands yet` |
| A filter is active and nothing matches | `No matching commands` |

PowerShell with winTerm shell integration reports full boundaries. `cmd.exe`
does not, and winTerm adds no prompt parser for it, so the Timeline stays
unavailable there rather than showing untrustworthy results.

## 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.

## 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.

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

Because this is an alpha, install it alongside or after backing up your
settings. Package identity stays separate from Microsoft Terminal, so it does
not disturb an existing Windows Terminal installation.

## Signing

The winTerm 1.3.0-alpha1 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)
6 changes: 3 additions & 3 deletions scripts/winterm/package-shell-assets.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,9 @@ foreach ($relativePath in $sourceAssets)
}

$version = Get-Content -LiteralPath (Join-Path $repositoryRoot 'shell\shared\version.json') -Raw | ConvertFrom-Json
if ($version.moduleVersion -ne '1.2.4' -or
$version.modulePrerelease -ne '' -or
$version.applicationVersion -ne '1.2.4' -or
if ($version.moduleVersion -ne '1.3.0' -or
$version.modulePrerelease -ne 'alpha1' -or
$version.applicationVersion -ne '1.3.0-alpha1' -or
$version.protocolVersion -ne 1)
{
throw 'The winTerm Shell asset version metadata is invalid.'
Expand Down
4 changes: 4 additions & 0 deletions scripts/winterm/test-release-workflow.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,10 @@ try
throw "WinGet workflow is missing required boundary '$required'."
}
}
if (-not $wingetWorkflow.Contains("github.event_name == 'release' && !github.event.release.prerelease"))
{
throw 'WinGet workflow must skip prerelease Releases so alpha and beta never reach WinGet.'
}
if ($wingetWorkflow.Contains('Repair-WinGetPackageManager -Latest') -or
$wingetWorkflow -match '(?i)\.msix(bundle)?')
{
Expand Down
Loading