Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
58 commits
Select commit Hold shift + click to select a range
f339083
Merge branch 'develop' of https://github.com/gui-cs/Terminal.Gui into…
tig May 12, 2026
0f76db3
Merge branch 'develop' of https://github.com/gui-cs/Terminal.Gui into…
tig May 13, 2026
09017a9
Add tests for #5357 ancestor-only layout propagation
harder May 22, 2026
cd8c2f0
Fixes #5357. Split upward layout propagation from downward subtree in…
harder May 22, 2026
1fb219b
Fixes #5357. Avoid redraw fan-out from ancestor-only layout propagation
harder May 22, 2026
57c0f3e
Add tests for #5357 ancestor-only layout propagation
harder May 22, 2026
65154a4
Fixes #5357. Split upward layout propagation from downward subtree in…
harder May 22, 2026
7be7ed0
Fixes #5357. Avoid redraw fan-out from ancestor-only layout propagation
harder May 22, 2026
8b4f7b9
Merge remote-tracking branch 'origin/fix-5357-split-layout-propagatio…
harder May 22, 2026
5aa5d51
Fix possessive typo in SetNeedsLayout doc comment
Copilot May 22, 2026
2775087
Fix doc comment grammar in Layout return description
Copilot May 22, 2026
1489e75
Fixes #5357. Update fan-out tests for layout-only fix
harder May 22, 2026
fc81222
Merge branch 'develop' of https://github.com/gui-cs/Terminal.Gui into…
tig May 23, 2026
1dd45a9
Initial plan
Copilot May 24, 2026
0dc422f
Add SpectreView interop with rendering and tests
Copilot May 24, 2026
18f49b7
Add UICatalog SpectreView scenario demo
Copilot May 24, 2026
c6c6ff7
Add SpectreView scenario GIF under docfx images
Copilot May 24, 2026
b7eb9c5
Replace SpectreView scenario GIF with visible tuirec capture
Copilot May 24, 2026
959e784
Apply .claude cleanup formatting to SpectreView touched files
Copilot May 24, 2026
248df34
Add tuirec recording guide and simplify hero-gif doc
Copilot May 24, 2026
ed798ae
Remove hero-gif.md, tuirec.md, and GIF (moved to PR #5396)
tig May 24, 2026
e2ee04f
Add ToSpectreStyle reverse conversion, NuGet metadata, and markup tests
tig May 24, 2026
92e2d13
Add SpectreView scenario demo GIF recorded with tuirec
tig May 24, 2026
79cb212
Re-record scenario GIF with Space activation and 1.5x speed
tig May 24, 2026
de772c7
Address CR feedback: skip control codes, fix column tracking, use nul…
tig May 24, 2026
f386d9e
Merge branch 'develop' of https://github.com/gui-cs/Terminal.Gui into…
tig May 24, 2026
89904c3
Merge branch 'develop' of https://github.com/gui-cs/Terminal.Gui into…
tig May 24, 2026
80f425e
docs: pin Editor 2.5.0 for docfx, widen TOC, add build steps to build…
tig May 24, 2026
b24cc88
docs: use VersionOverride=* for EditorRef (fix CPM conflict)
tig May 24, 2026
c27b4a7
docs: add Editor namespace summaries, switch TOC to sans-serif
tig May 24, 2026
c3c4818
docs: fix hero.gif URL case and bump TOC font size
tig May 24, 2026
708770d
docs: narrow TOC to 380px, bump font to 0.85rem
tig May 24, 2026
10aef72
docs: TOC 340px, font 0.9rem
tig May 24, 2026
5ff48da
Merge pull request #5399 from gui-cs/backmerge/v2.4.1
tig May 24, 2026
5f61a80
Initial plan
Copilot May 25, 2026
c64a404
Fix submenu hover overlap handling
Copilot May 25, 2026
b231e5a
Fix review comments: update AI headers to // Copilot and fix #5356 → …
tig May 25, 2026
fe9d72f
Simplify OnMouseEnter to walk from end of viewsUnderMouse list
tig May 25, 2026
fb5216c
Merge pull request #5393 from gui-cs/copilot/add-spectreview-rendering
tig May 25, 2026
b8df285
Add recording demonstrating submenu hover fix
tig May 25, 2026
729f60e
Merge pull request #5406 from gui-cs/copilot/test-popup-context-menu-bug
tig May 25, 2026
9fe4535
Fixes #5274 - Avoid duplicate ScreenChanged from Application.Screen s…
Copilot May 25, 2026
6af5590
Add 10 emojis with ZWJ (#5400)
BDisp May 25, 2026
5c2cca3
Fixes #4888 - Add configurable mouse binding combos for selection sta…
Copilot May 25, 2026
779978a
Fixes #5412. Migrate from .sln to .slnx and remove redundant solution…
tig May 25, 2026
2a73083
Add tuirec recording guide and hero-gif docs (#5396)
tig May 25, 2026
16786ee
Fixes #5099 - Preserve filename on FileDialog table navigation (#5408)
Copilot May 25, 2026
97741eb
Fixes #5200 - Prevent FileDialog Enter navigation from selecting the …
Copilot May 25, 2026
00db601
Fixes #5357. Narrow SetNeedsLayout propagation
harder May 26, 2026
8253657
Fixes #5125 - Preserve FileDialog selection colors when navigating vi…
Copilot May 26, 2026
4ce72c7
Fixes #5363 - Honor AllowedTypes on initial OpenDialog mixed-mode loa…
Copilot May 26, 2026
b270d5d
Fixes #5401 - Move non-UICatalog examples to gui-cs/Examples and rest…
Copilot May 26, 2026
5d40f18
Merge pull request #5373 from harder/fix-5357-split-layout-propagation
harder May 26, 2026
9fa49c1
Refresh generated API view docs assets (#5419)
tig May 26, 2026
72b7bb4
Delete plans directory (#5417)
tig May 26, 2026
452f7d0
Regenerate view GIF assets via CI/CD workflow dispatch (#5423)
tig May 26, 2026
0d0a262
Audit and fix inaccuracies in AI guidance files (#5424)
tig May 26, 2026
5846f04
Bump Microsoft.NET.Test.Sdk from 18.5.1 to 18.6.0 (#5425)
dependabot[bot] May 27, 2026
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
6 changes: 3 additions & 3 deletions .claude/agents/cleanup-agent.md
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ Successfully cleaned files meet:
- Applies "Full Cleanup" profile from `Terminal.sln.DotSettings`
- Uses `--include` parameter to target specific files
- Respects all project code style settings
- Command: `jb cleanupcode Terminal.sln --profile="Full Cleanup" --include="path/to/file.cs" --no-build`
- Command: `jb cleanupcode Terminal.slnx --profile="Full Cleanup" --include="path/to/file.cs" --no-build`

### 3. Backing Field Reordering
- Places backing fields immediately before their properties
Expand Down Expand Up @@ -118,7 +118,7 @@ The `--include` parameter **WORKS CORRECTLY** for single-file cleanup:

```powershell
# Cleanup a single file
jb cleanupcode Terminal.sln `
jb cleanupcode Terminal.slnx `
--profile="Full Cleanup" `
--include="Terminal.Gui/Views/TableView/TableView.cs" `
--no-build `
Expand All @@ -139,7 +139,7 @@ jb cleanupcode Terminal.sln `

```powershell
# Inspect a single file for warnings
jb inspectcode Terminal.sln `
jb inspectcode Terminal.slnx `
--output="inspect-report.xml" `
--include="Terminal.Gui/Views/TableView/TableView.cs" `
--severity=WARNING `
Expand Down
6 changes: 3 additions & 3 deletions .claude/rules/event-patterns.md
Original file line number Diff line number Diff line change
Expand Up @@ -69,13 +69,13 @@ void OnTextChanged (object sender, EventArgs e) { }

## Local Function Naming

**Use camelCase for local functions:**
**Use PascalCase for local functions** (the `.editorconfig` `local_functions_rule` enforces `upper_camel_case_style` at `warning` severity):

```csharp
// CORRECT
void textViewDrawContent (object? sender, DrawEventArgs e) { }
void TextViewDrawContent (object? sender, DrawEventArgs e) { }

// WRONG
void TextView_DrawContent (object? sender, DrawEventArgs e) { }
void TextViewDrawContent (object? sender, DrawEventArgs e) { }
void textViewDrawContent (object? sender, DrawEventArgs e) { }
```
12 changes: 6 additions & 6 deletions .claude/rules/testing-patterns.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
3. **Follow existing test patterns**
- Study tests in respective test projects before writing new ones

4. **Avoid adding new tests to `UnitTests` Project**
4. **Never add new tests to `UnitTests.Legacy`**
- Make them parallelizable and add them to `UnitTestsParallelizable`

5. **Avoid static dependencies**
Expand All @@ -38,7 +38,7 @@

## Test Projects

### 1. Non-Parallel Tests (`Tests/UnitTests/`)
### 1. Non-Parallel Tests (`Tests/UnitTests.NonParallelizable/`)

**When to use:**
- Testing functionality that depends on static state
Expand All @@ -48,11 +48,10 @@
- ~10 min timeout
- Uses `Application.Init` and static state
- Cannot run in parallel
- Includes `--diagnostic` flag for logging

**Command:**
```bash
dotnet test --project Tests/UnitTests --no-build --verbosity normal
dotnet test --project Tests/UnitTests.NonParallelizable --no-build --verbosity normal
```

### 2. Parallel Tests (`Tests/UnitTestsParallelizable/`) - **PREFERRED**
Expand Down Expand Up @@ -84,8 +83,9 @@ dotnet test --project Tests/IntegrationTests --no-build --verbosity normal

## Test Configuration Files

- `xunit.runner.json` - xUnit configuration
- `coverlet.runsettings` - Coverage settings (currently unused, pending MTP integration)
- `xunit.runner.json` - Per-project xUnit configuration (parallelization, etc.)
- `Tests/TestEnvironmentSetup.cs` - Compiled into every test project; its `[ModuleInitializer]` sets `DisableRealDriverIO=1` before any test code runs
- Coverage tooling: each test project references the `coverlet.collector` package, but coverage is not actively collected in CI yet (see "Code Coverage" above — pending an MTP-compatible solution). `.runsettings` files are ignored by Microsoft Testing Platform (MTP).

## Example Test Pattern

Expand Down
5 changes: 2 additions & 3 deletions .claude/tasks/build-app.md
Original file line number Diff line number Diff line change
Expand Up @@ -142,10 +142,9 @@ See `.claude/cookbook/common-patterns.md` for recipes including:

| Example | Location | Description |
|---------|----------|-------------|
| Hello World | `Examples/Example/` | Minimal login form |
| All Controls | `Examples/UICatalog/` | Comprehensive demo app |
| MVVM | `Examples/CommunityToolkitExample/` | CommunityToolkit MVVM |
| Reactive | `Examples/ReactiveExample/` | ReactiveUI integration |
| Scenario automation | `Examples/ScenarioRunner/` | Run UICatalog scenarios from the CLI |
| Additional samples | `gui-cs/Examples` | Standalone example applications |

## Event Handling Patterns

Expand Down
8 changes: 4 additions & 4 deletions .claude/workflows/build-test-workflow.md
Original file line number Diff line number Diff line change
Expand Up @@ -80,13 +80,13 @@ dotnet test --project Tests/UnitTests --no-build --verbosity normal && dotnet te

## Common Build Issues

### Issue: NativeAot/SelfContained Build Failures
### Issue: AOT validation failures

**Solution:** Restore these projects explicitly:
**Solution:** Build and publish the in-repo AOT smoke app:

```bash
dotnet restore ./Examples/NativeAot/NativeAot.csproj -f
dotnet restore ./Examples/SelfContained/SelfContained.csproj -f
dotnet publish ./Tests/NativeAotSmoke/NativeAotSmoke.csproj --configuration Release --output ./aot-publish
./aot-publish/NativeAotSmoke --smoke-test
```

## Build Order Best Practice
Expand Down
2 changes: 1 addition & 1 deletion .cursorrules
Original file line number Diff line number Diff line change
Expand Up @@ -122,4 +122,4 @@ Input flows: Driver → `IInputProcessor` → `KeyBindings`/`MouseBindings` →
| Common UI patterns | `.claude/cookbook/common-patterns.md` |
| App building guide | `.claude/tasks/build-app.md` |
| Deep-dive docs | `docfx/docs/` |
| Working examples | `Examples/Example/`, `Examples/UICatalog/` |
| Working examples | `Examples/UICatalog/`, `Examples/ScenarioRunner/`, `gui-cs/Examples` |
3 changes: 1 addition & 2 deletions .github/workflows/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,7 @@ The repository uses multiple GitHub Actions workflows. What runs and when:
- Build Debug: `dotnet build --configuration Debug --no-restore -property:NoWarn=0618%3B0612`
- Build Release (library): `dotnet build Terminal.Gui/Terminal.Gui.csproj --configuration Release --no-incremental --force -property:NoWarn=0618%3B0612`
- Pack Release: `dotnet pack Terminal.Gui/Terminal.Gui.csproj --configuration Release --output ./local_packages -property:NoWarn=0618%3B0612`
- Restore NativeAot/SelfContained examples, then restore solution again
- Build Release for `Examples/NativeAot` and `Examples/SelfContained`
- Publish `Tests/NativeAotSmoke` with AOT and run `--smoke-test`
- Build Release solution

### 2) Build & Run Unit Tests (`.github/workflows/unit-tests.yml`)
Expand Down
100 changes: 91 additions & 9 deletions .github/workflows/api-docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,21 @@ name: Build and publish v2 API docs
on:
push:
branches: [develop]
workflow_dispatch:
inputs:
regenerate-views:
description: Regenerate views.md and view GIF assets
type: boolean
default: true

permissions:
contents: write
id-token: write
pages: write

jobs:
deploy:
name: Build and Deploy v2 API docs to github-pages ${{ github.ref_name }}
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
build:
name: Build v2 API docs ${{ github.ref_name }}
runs-on: windows-latest
steps:
- name: Checkout
Expand All @@ -27,6 +31,31 @@ jobs:
dotnet-version: 10.x
dotnet-quality: 'ga'

- name: Detect view docs changes
id: view-docs
shell: pwsh
run: |
$shouldGenerate = $false

if ("${{ github.event_name }}" -eq "workflow_dispatch") {
$shouldGenerate = "${{ inputs.regenerate-views }}" -eq "true"
} else {
$before = "${{ github.event.before }}"

if ($before -match "^0+$") {
$before = "HEAD~1"
}

$changedFiles = git diff --name-only $before "${{ github.sha }}"
$shouldGenerate = [bool]($changedFiles | Where-Object {
$_ -match "^Terminal\.Gui/Views/" -or
$_ -match "^docfx/scripts/OutputView/" -or
$_ -match "^docfx/scripts/generate-views-doc\.ps1$"
} | Select-Object -First 1)
}

"should_generate=$($shouldGenerate.ToString().ToLowerInvariant())" >> $env:GITHUB_OUTPUT

- name: Restore dependencies
run: dotnet restore

Expand All @@ -36,23 +65,76 @@ jobs:
- name: Build EditorRef (for Terminal.Gui.Editor docs)
run: dotnet build docfx/EditorRef/EditorRef.csproj --configuration Release

- name: DocFX Build
working-directory: docfx
- name: Install DocFX
run: |
dotnet tool install -g docfx

- name: Setup Go
if: steps.view-docs.outputs.should_generate == 'true'
uses: actions/setup-go@v6
with:
go-version: stable

- name: Install views docs tools
if: steps.view-docs.outputs.should_generate == 'true'
run: |
go install github.com/gui-cs/tuirec/cmd/tuirec@latest
Add-Content $env:GITHUB_PATH "$(go env GOPATH)\bin"
Install-Module powershell-yaml -Scope CurrentUser -Force

- name: Generate API metadata
working-directory: docfx
run: |
$env:DOCFX_SOURCE_BRANCH_NAME="${{ github.ref_name }}"
docfx metadata

- name: Generate views docs
if: steps.view-docs.outputs.should_generate == 'true'
working-directory: docfx
run: |
./scripts/generate-views-doc.ps1

- name: DocFX Build
working-directory: docfx
run: |
docfx build
continue-on-error: false

- name: Commit regenerated views assets
if: github.event_name == 'workflow_dispatch' && steps.view-docs.outputs.should_generate == 'true'
shell: pwsh
run: |
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
git add docfx/docs/views.md docfx/images/views

if (git diff --cached --quiet) {
Write-Host "No regenerated view assets to commit."
exit 0
}

git commit -m "Regenerate docfx view GIF assets via CI"
git push

- name: Setup Pages
if: github.event_name == 'push' && github.ref_name == 'develop'
uses: actions/configure-pages@v6

- name: Upload artifact
if: github.event_name == 'push' && github.ref_name == 'develop'
uses: actions/upload-pages-artifact@v5
with:
path: docfx/_site


deploy:
name: Deploy v2 API docs to github-pages ${{ github.ref_name }}
if: github.event_name == 'push' && github.ref_name == 'develop'
needs: build
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
runs-on: windows-latest
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v5
Expand Down
23 changes: 5 additions & 18 deletions .github/workflows/build-validation.yml
Original file line number Diff line number Diff line change
Expand Up @@ -50,36 +50,23 @@ jobs:
- name: Pack Release Terminal.Gui
run: dotnet pack Terminal.Gui/Terminal.Gui.csproj --configuration Release --output ./local_packages -property:NoWarn=0618%3B0612

- name: Restore AOT and Self-Contained projects
run: |
dotnet restore ./Examples/NativeAot/NativeAot.csproj -f
dotnet restore ./Examples/SelfContained/SelfContained.csproj -f

- name: Restore Solution Packages
run: dotnet restore

- name: Build Release AOT and Self-Contained
run: |
dotnet build ./Examples/NativeAot/NativeAot.csproj --configuration Release -property:NoWarn=0618%3B0612
dotnet build ./Examples/SelfContained/SelfContained.csproj --configuration Release -property:NoWarn=0618%3B0612

- name: AOT Publish (catches trimming and reflection errors)
run: dotnet publish ./Examples/NativeAot/NativeAot.csproj --configuration Release --output ./aot-publish -property:NoWarn=0618%3B0612
- name: AOT Publish Test App (catches trimming and reflection errors)
run: dotnet publish ./Tests/NativeAotSmoke/NativeAotSmoke.csproj --configuration Release --output ./aot-publish -property:NoWarn=0618%3B0612

- name: AOT Smoke Test (run the published AOT binary on Linux)
if: runner.os == 'Linux'
env:
DisableRealDriverIO: "1"
run: |
chmod +x ./aot-publish/NativeAot
./aot-publish/NativeAot --smoke-test
chmod +x ./aot-publish/NativeAotSmoke
./aot-publish/NativeAotSmoke --smoke-test

- name: AOT Smoke Test (run the published AOT binary on Windows)
if: runner.os == 'Windows'
env:
DisableRealDriverIO: "1"
shell: pwsh
run: ./aot-publish/NativeAot.exe --smoke-test
run: ./aot-publish/NativeAotSmoke.exe --smoke-test

- name: Build Release Solution
run: dotnet build --configuration Release --no-restore -property:NoWarn=0618%3B0612
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -82,3 +82,9 @@ log.*
.mcp.json
.env
tmpclaude-*-cwd

# tuirec artifacts
artifacts/
docfx/artifacts/
local_packages/
*.cast
2 changes: 1 addition & 1 deletion .windsurfrules
Original file line number Diff line number Diff line change
Expand Up @@ -122,4 +122,4 @@ Input flows: Driver → `IInputProcessor` → `KeyBindings`/`MouseBindings` →
| Common UI patterns | `.claude/cookbook/common-patterns.md` |
| App building guide | `.claude/tasks/build-app.md` |
| Deep-dive docs | `docfx/docs/` |
| Working examples | `Examples/Example/`, `Examples/UICatalog/` |
| Working examples | `Examples/UICatalog/`, `Examples/ScenarioRunner/`, `gui-cs/Examples` |
3 changes: 1 addition & 2 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ dotnet run
### Key Resources
- **App Building Guide**: [.claude/tasks/build-app.md](.claude/tasks/build-app.md)
- **Common Patterns**: [.claude/cookbook/common-patterns.md](.claude/cookbook/common-patterns.md)
- **Examples**: `Examples/Example/` (minimal), `Examples/UICatalog/` (comprehensive)
- **Examples**: `Examples/UICatalog/`, `Examples/ScenarioRunner/`, and [gui-cs/Examples](https://github.com/gui-cs/Examples)

### API Reference (Compressed)
| Namespace | Contents |
Expand Down Expand Up @@ -547,6 +547,5 @@ Implementing `IValue<T>` requires `ValueChanging`, `ValueChanged`, and `ValueCha






9 changes: 6 additions & 3 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ See `.claude/rules/` for detailed guidance:
- `event-patterns.md` - Lambdas, closures, handlers
- `early-return.md` - **Guard clauses, minimal nesting** (commonly violated!)
- `collection-expressions.md` - Use `[...]` syntax
- `unicode-graphemes.md` - **Think in graphemes** - `GetColumns()`, `GraphemeHelper.GetGraphemes()`
- `cwp-pattern.md` - Cancellable Workflow Pattern
- `code-layout.md` - Backing fields, member ordering
- `api-documentation.md` - XML documentation requirements
Expand All @@ -63,7 +64,6 @@ See `.claude/rules/` for detailed guidance:
## Task-Specific Guides

See `.claude/tasks/` for task checklists:
- `scenario-modernization.md` - Upgrading UICatalog scenarios
- `clean-code-review.md` - Creating clean git commit histories
- `build-app.md` - Building applications with Terminal.Gui

Expand Down Expand Up @@ -100,8 +100,11 @@ dotnet test --project Tests/UnitTests.NonParallelizable --no-build
# Legacy tests — do NOT add new tests here; candidates for rewrite/deletion
dotnet test --project Tests/UnitTests.Legacy --no-build

# Run a single test by fully-qualified name
dotnet test --project Tests/UnitTestsParallelizable --no-build --filter "FullyQualifiedName~MyTestClass.MyTestMethod"
# Run a single test by method name (Microsoft Testing Platform)
dotnet test --project Tests/UnitTestsParallelizable --no-build --filter-method "*MyTestMethod"

# Run all tests in a class
dotnet test --project Tests/UnitTestsParallelizable --no-build --filter-class "*MyTestClass"
```

See `Tests/README.md` for the full list of test projects (including `IntegrationTests`, `StressTests`, `Benchmarks`) and the static-state classification that determines where a new test belongs.
Expand Down
Loading
Loading