Skip to content

Release v2.1.0-beta.1#5241

Merged
tig merged 63 commits into
mainfrom
release/v2.1.0-beta.1
May 7, 2026
Merged

Release v2.1.0-beta.1#5241
tig merged 63 commits into
mainfrom
release/v2.1.0-beta.1

Conversation

@tig

@tig tig commented May 7, 2026

Copy link
Copy Markdown
Member

Release v2.1.0-beta.1

This is a beta pre-release.

Version: 2.1.0-beta.1
NuGet Package: Terminal.Gui 2.1.0-beta.1

What happens when this PR is merged

  1. ✅ The Finalize Release workflow will automatically create tag v2.1.0-beta.1
  2. ✅ The Publish workflow will build and push to NuGet.org
  3. ✅ A GitHub Release will be created with auto-generated notes
  4. ✅ A back-merge PR from maindevelop will be opened

Checklist

  • CI passes on this PR
  • Version looks correct: 2.1.0-beta.1
  • Release notes reviewed (will be auto-generated on merge)

tig and others added 30 commits April 28, 2026 14:38
* Initial plan

* docs: reframe layout docs around responsive UI

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/a6b913bd-38e5-4d80-ac23-9dc8e6716045

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* docs: polish responsive layout wording

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/a6b913bd-38e5-4d80-ac23-9dc8e6716045

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* docs: tighten instructional sentence style

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/d453216b-6d43-4261-aa23-0dad98805e91

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* docs: fix remaining instructional prose

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/d7be6123-896e-4b95-8e3f-0cee1d6d35d1

Co-authored-by: tig <585482+tig@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: tig <585482+tig@users.noreply.github.com>
Back-merge v2.0.0 from main into develop
Co-authored-by: Tig <tig@users.noreply.github.com>
* Add tests for ShadowStyle inheritance and reset behavior

Added two unit tests to ShadowTests.cs:
- ShadowStyle_Getter_Does_Not_Inherit_From_SuperView ensures a child view does not inherit ShadowStyle from its SuperView and that round-tripping the property does not create a MarginView or add shadow thickness.
- Setting_ShadowStyle_Null_Resets_ShadowSize verifies that setting ShadowStyle to null resets the MarginView's ShadowSize to Size.Empty, preventing residual state.

* Fixes #5088 - Changed Margin.ShadowStyle to only use the local value and reset ShadowSize to Size.Empty when unset. Adjusted related tests to match new behavior.

Refactored ShadowStyleDemo window and editor initialization for clarity and consistency, updated shadow window positioning and scheme usage, and improved child view arrangement.

* Update Tests/UnitTestsParallelizable/ViewBase/Adornment/ShadowTests.cs

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…5115)

* Bump ReportGenerator from 5.5.5 to 5.5.6

---
updated-dependencies:
- dependency-name: ReportGenerator
  dependency-version: 5.5.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update Examples link in README.md (#5104)

* Reframe layout docs around responsive UI and instructional style (#5110)

* Initial plan

* docs: reframe layout docs around responsive UI

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/a6b913bd-38e5-4d80-ac23-9dc8e6716045

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* docs: polish responsive layout wording

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/a6b913bd-38e5-4d80-ac23-9dc8e6716045

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* docs: tighten instructional sentence style

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/d453216b-6d43-4261-aa23-0dad98805e91

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* docs: fix remaining instructional prose

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/d7be6123-896e-4b95-8e3f-0cee1d6d35d1

Co-authored-by: tig <585482+tig@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Fixes #5114. Remove main from publish branch triggers; use tags only

Main branch pushes were triggering the publish workflow without a release
tag, causing GitVersion to produce invalid NuGet versions (e.g. 2.0.0-5420).

- Remove main from branches trigger; stable releases now publish only on v* tag push
- Develop branch pushes continue publishing pre-release packages automatically
- Update template dispatch conditions to match tag-based flow

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
Co-authored-by: tig <585482+tig@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…ut (#5083)

* Fixes #5072. TableView reserves space for later columns when laying out

A wide column (e.g. a long Description) previously consumed all available
viewport width and pushed subsequent columns off-screen. Each visible
column now reserves at least its header width (or configured MinWidth)
during layout so wide columns are clamped instead of starving later
columns.

The reservation only inspects column headers and styles — it never
iterates cell rows — so paginated or very large ITableSource
implementations remain performant.

* Tighten TableView column-bounds test to use strict inequality

Right-edge check now uses < Viewport.Width instead of <= per code review.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Restore foreach loop in TableView.CalculateContentSize

Use a manual index counter rather than converting the loop to for, and
revert the unrelated borderWidth local-variable extraction. The fix only
needs the index to compute the slice of remaining columns to reserve
space for.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Updated table col width calculation and added wide example

* Fixed tests and updated comment wording based on copilot pr feedback

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: Tig <tig@users.noreply.github.com>
…is resizing (#5120)

* Fixes #5119. Popover isn't recalculating it's position when terminal is resizing

* Add one more unit test for popover screen resize

* Fix unit test

---------

Co-authored-by: Tig <tig@users.noreply.github.com>
… custom ColorGetter (#5128)

* Fixes #5075. TableView ShowVerticalCellLines=false renders incorrectly with custom ColorGetter

When ShowVerticalCellLines is false and a ColumnStyle.ColorGetter is in use
(e.g. FileDialog), the 1-char gap between cells retained the row scheme's
attribute, producing visible "stripes" through custom-colored cells.

TruncateOrPad intentionally renders cells to (Width - 1) chars, leaving 1
char for the cell boundary. RenderRow now extends the cell's own background
into that gap when the separator is the default invisible space.
RenderSeparator skips drawing in the same case (RenderRow owns the gap).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* FileDialog: use ShowVerticalCellLines=false now that #5075 fix is in.

Per PR review on #5128, switch FileDialog's TableView to render without
vertical cell lines so its custom ColorGetter (file-type colors) shows
through cleanly. The TableView fix in this PR ensures the 1-char gap
between cells now picks up the cell's own background instead of the
row scheme's, so removing the lines no longer leaves color stripes.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: BDisp <bd.bdisp@gmail.com>
* Revert "Fixes #5132. TableView Home/End navigation with FullRowSelect (#5133)"

This reverts commit 6361f33.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Docs: Document Home/End rebinding for FullRowSelect in TableView

Adds a tip to the FullRowSelect section showing how to rebind Home/End
to Command.Start/Command.End for row-level navigation, referencing the
UICatalogRunnable pattern.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
#5131)

* Adds concurrency test for OutputBufferImpl race condition

Adds AddStr_And_ClearContents_Concurrent_DoesNotThrow test that
reproduces the race condition in OutputBufferImpl where ClearContents
replaces the Contents reference while AddStr is concurrently iterating.

See #5130.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Adds concurrency tests, benchmark, and plan for #5130

- Expanded OutputBufferImplConcurrencyTests with 4 tests covering:
  AddStr+ClearContents, FillRect+ClearContents, Move+AddStr+ClearContents,
  and a three-way concurrent test
- Added OutputBufferBenchmark for perf baseline (AddStr, FillRect,
  ClearContents, SetSize, TypicalDrawCycle)
- Added implementation plan in plans/

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Refactor OutputBufferImpl for thread safety

Replaced locking on Contents with a dedicated _contentsLock object to ensure safe concurrent access to buffer state (Contents, DirtyLines, Clip, etc.). Refactored buffer management methods (ClearContents, SetSize, FillRect, Move, IsValidLocation) to use the new lock. Updated FillRect and AddGrapheme to avoid race conditions. Improved documentation and comments for concurrency. Moved SetCellUrl/GetCellUrl implementations under the lock. In OutputBufferImplConcurrencyTests, reordered and moved helper methods for clarity; no test logic changes. No public API changes, but internal concurrency is now robust.

* Refactor StringExtensions for style and consistency

Refactored methods to use expression-bodied members and improved code style (constants, variable declarations, and formatting). Added and then removed `IsSurrogatePair` and `MakePrintable` extension methods, resulting in no net functional changes. All updates are stylistic and organizational.

* Fix race condition in FillRect(Rectangle, char) overload

The char overload called Move() + AddRune() without holding _contentsLock,
allowing concurrent threads to corrupt Col/Row between the two calls and
write characters to wrong positions.

Fix: delegate to FillRect(Rectangle, Rune) which holds the lock atomically.

Added test proving the race (detected wrong-position writes in <13ms before fix).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Added null check in OutputBufferImpl.cs WriteGrapheme. Introduced locking in RuneExtensions.cs for thread-safe Unicode width calculation.

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: BDisp <bd.bdisp@gmail.com>
…bleSelection.SelectedCell` (#5142)

* Initial plan

* Rename TableSelection.Cursor to TableSelection.SelectedCell

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/8d9d1a5e-97bb-4c6e-862a-948119c94fca

Co-authored-by: tig <585482+tig@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: tig <585482+tig@users.noreply.github.com>
* Initial plan

* Add custom header styling for TableView (Options B+C)

- Add HeaderColorGetterArgs class for contextual header color info
- Add HeaderColorGetterDelegate for per-column header color override
- Add ColumnStyle.HeaderColorGetter property
- Add TableStyle.HeaderScheme property for global header scheme
- Update RenderHeaderMidline to apply header styling
- Update CharacterMap scenario to italicize sorted column header
- Add unit tests for both per-column and global header styling

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/157d9f83-14ee-4f74-9d4a-a6b879105d50

Co-authored-by: tig <585482+tig@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: tig <585482+tig@users.noreply.github.com>
Co-authored-by: Tig <tig@users.noreply.github.com>
* Fix NativeAOT configuration cloning and warning cleanup

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Fix config converter regressions and serialization cleanup

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Remove stale AOT propagation annotations

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Fix NativeAOT configuration cloning and warning cleanup

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Fix config converter regressions and serialization cleanup

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Remove stale AOT propagation annotations

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Fix PR 5134 config review feedback

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Simplify AttributeJsonConverter style parsing

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Correctly serialize null properties in ScopeJsonConverter

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Tig <tig@users.noreply.github.com>
* Initial plan

* Improve DropDownList keyboard: Space to open, Up/Down to navigate, CollectionNavigation support

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/c07c6615-2cdd-40a1-b0c0-86f0f31c26bb

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Address code review: split compound conditions into separate guard clauses

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/c07c6615-2cdd-40a1-b0c0-86f0f31c26bb

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Code cleanup

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: tig <585482+tig@users.noreply.github.com>
Co-authored-by: Tig <tig@users.noreply.github.com>
…#5150)

* Initial plan

* Fixes #5103. Disable NerdFonts default in FileDialogExamples scenario

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/49264ca7-5e02-4e48-aa49-e81b08ddcf23

Co-authored-by: tig <585482+tig@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: tig <585482+tig@users.noreply.github.com>
Co-authored-by: Tig <tig@users.noreply.github.com>
…ity (#5170) (#5179)

Key.Equals(object?) included Handled in the comparison while GetHashCode
returned only _keyCode.GetHashCode(), violating the .NET contract that
equal objects must have equal hash codes. This broke KeyBindings (a
ConcurrentDictionary<Key, KeyBinding>) when Handled flipped between
storing and lookup.

Handled is per-event state, not part of binding identity, so it is
removed from the equality comparison. KeyEqualityComparer already used
KeyCode-only equality and is consistent.

Two existing tests in KeyTests.cs that asserted the buggy behavior
(Equals_ShouldReturnTrue_WhenEqual and
Equals_Handled_Changed_ShouldReturnFalse_WhenNotEqual) have been
updated to assert the correct contract-honoring behavior.

https://claude.ai/code/session_01CdoS4YQ7v9aNPZaNsYnxjv

Co-authored-by: Claude <noreply@anthropic.com>
…eptable (#5189)

CLAUDE.md and .claude/rules/testing-patterns.md disagreed on the AI marker
convention (one said "// Claude - Opus 4.5", the other "// CoPilot - ChatGPT v4").
Empirically both are used: Tests/UnitTestsParallelizable + Tests/UnitTests.NonParallelizable
contain ~105 files with "// Claude" markers and ~93 with "// CoPilot". Update both
guidance files to list the two forms as equally acceptable and tell reviewers not to
flag inconsistency between them. Triggered by Copilot review nits across PRs #5177-#5188.

https://claude.ai/code/session_01CdoS4YQ7v9aNPZaNsYnxjv

Co-authored-by: Claude <noreply@anthropic.com>
…) (#5186)

* fix: UnixRawModeHelper safe restore on crash + valid-state guard (#5164)

When the input thread crashes before the driver Dispose() runs, the Unix
terminal is left in raw mode and the user's shell is left unusable.

This change adds three safety nets so the original termios is restored on
any abnormal exit path:

- Finalizer: last-resort restore if Dispose() is bypassed (e.g. fatal
  native crash, immediate process abort).
- AppDomain.ProcessExit hook registered after a successful TryEnable;
  unregistered in Dispose() to avoid leaking the helper for the lifetime
  of the process.
- Console.CancelKeyPress hook so Ctrl+C also restores cleanly.

Also adds a _haveSavedTermios guard so Restore() is a hard no-op unless
tcgetattr previously succeeded - preventing an uninitialized termios
struct from ever being written back to the terminal.

Tests in UnitTests.Parallelizable cover:
- Restore() without TryEnable() is a no-op and does not throw.
- Restore() is idempotent.
- Dispose() without TryEnable() is a no-op and double-Dispose is safe.
- The type has a finalizer (last-resort restore contract).
- TryEnable() failure paths leave _haveSavedTermios = false.

The full crash-during-input-thread scenario is integration-only (requires
a real tty); the unit tests cover the observable contract.

https://claude.ai/code/session_01CdoS4YQ7v9aNPZaNsYnxjv

* fix: check tcsetattr return; document CancelKeyPress limitation (#5164)

Address Copilot review feedback on PR #5186:

- Restore() and the finalizer now check the tcsetattr return code. On
  non-zero return, log the errno via the existing Logging infrastructure.
  Restore() leaves IsRawModeEnabled set to true when the syscall fails so
  callers and the finalizer know the terminal was not restored. The
  finalizer logs only and never throws.
- Document the Console.CancelKeyPress limitation: with ISIG disabled in
  raw mode, a keyboard Ctrl+C arrives as a 0x03 byte rather than SIGINT,
  so the hook is unlikely to fire while raw mode is active. The
  subscription remains as belt-and-braces defense for hosts that do not
  disable ISIG and for externally-delivered SIGINT events; the primary
  safety nets are AppDomain.ProcessExit and the finalizer.

https://claude.ai/code/session_01CdoS4YQ7v9aNPZaNsYnxjv

* fix: drop unreachable finalizer from UnixRawModeHelper (#5164 review)

The finalizer in UnixRawModeHelper was dead code: the instance is rooted
by its AppDomain.CurrentDomain.ProcessExit and Console.CancelKeyPress
event-handler subscriptions, so it can never become finalization-eligible
while those hooks are wired. Drop the finalizer and the now-unneeded
GC.SuppressFinalize call. Restoration relies on explicit Dispose as the
primary path with the ProcessExit hook as the safety net for normal
process exit; CancelKeyPress remains a best-effort fallback. Update the
class-level remarks and the obsolete reflection-based finalizer test
accordingly (6 tests -> 5).

https://claude.ai/code/session_01CdoS4YQ7v9aNPZaNsYnxjv

---------

Co-authored-by: Claude <noreply@anthropic.com>
…) (#5188)

* docs: clarify SessionBegun/SessionEnded as token lifecycle hooks (#5162)

https://claude.ai/code/session_01CdoS4YQ7v9aNPZaNsYnxjv

* docs: tighten SessionBegun/SessionEnded XML accuracy (#5162)

Address Copilot review feedback on PR #5188 by aligning the
SessionBegun and SessionEnded XML docs with the actual ordering and
contract in ApplicationImpl.Begin/End.

- SessionBegun summary: describe the real firing point (after the
  token is pushed onto SessionStack and TopRunnable is set, but
  before IsRunningChanged/IsModalChanged fire) instead of "immediately
  after token construction".
- SessionEnded summary: drop "token-disposal hook"/"about to be
  released" framing; SessionToken is not IDisposable. Describe the
  real state (state has unwound, IsRunningChanged(false) has fired,
  Runnable is null) without overstating the SessionStack invariant
  (End only pops when wasModal && popped == token).
- Replace "manually dispose of the SessionToken" guidance in both
  remarks blocks with the actual caller responsibility: subscribe to
  SessionEnded and call End(SessionToken) themselves.
- End(SessionToken) remarks: replace "disposes the sessionToken" with
  "clears SessionToken.Runnable on sessionToken" to match the code.

https://claude.ai/code/session_01CdoS4YQ7v9aNPZaNsYnxjv

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: BDisp <bd.bdisp@gmail.com>
…ose (#5163) (#5185)

* fix: ApplicationImpl.Invoke throws NotInitializedException after Dispose (#5163)

Both `Invoke(Action)` and `Invoke(Action<IApplication>)` overloads
silently dropped actions when called before `Init()` or after
`Dispose()`: the thread-affinity fast path is skipped (no main thread
or top runnable) and the `TimedEvents.Add` fallback queues onto a
stopped queue.

Add an `Initialized` guard at the top of both overloads so the post-
Dispose / pre-Init case fails loudly with `NotInitializedException`,
matching the pattern already used by `Run(IRunnable, ...)` in the
same file.

The deeper thread-affinity race between the fast-path read of
`TopRunnableView` / `MainThreadId` and concurrent shutdown is
intentionally out of scope - that requires a redesign noted in the
issue and is not covered here.

https://claude.ai/code/session_01CdoS4YQ7v9aNPZaNsYnxjv

* fix: address review comments on Invoke disposed-throws (#5163)

- Pass nameof(Invoke) to NotInitializedException so the formatted
  "{member} cannot be accessed before Initialization" message is
  grammatically correct.
- Add ArgumentNullException.ThrowIfNull(action) to the non-generic
  Invoke(Action) overload so a null action fails deterministically
  (consistent with Begin/Run argument validation).
- Wrap Init in try/finally in the AfterDispose tests so a thrown
  Init does not leak the process-wide SynchronizationContext.

https://claude.ai/code/session_01CdoS4YQ7v9aNPZaNsYnxjv

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: BDisp <bd.bdisp@gmail.com>
…#5181)

* fix: ConcurrentDictionaryJsonConverter rejects duplicate keys (#5173)

The Read implementation was calling TryAdd and ignoring its return value,
so duplicate keys in input JSON were silently dropped. Now throws a
JsonException on duplicate, mirroring the DictionaryJsonConverter fix.

https://claude.ai/code/session_01CdoS4YQ7v9aNPZaNsYnxjv

* style: normalize space-before-paren in ConcurrentDictionaryJsonConverter (#5173 review)

Apply project's space-before-paren convention to the Read method body,
matching DictionaryJsonConverter<T>. Addresses review feedback on
PR #5181 where the new TryAdd duplicate-key check used the convention
but adjacent calls in the same method body did not.

https://claude.ai/code/session_01CdoS4YQ7v9aNPZaNsYnxjv

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: BDisp <bd.bdisp@gmail.com>
Copilot AI and others added 2 commits May 7, 2026 13:38
* Initial plan

* Fix AOT hard-coded key binding clone

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/275ee9b0-ace3-402a-a75e-18ca75db4388

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* Match nullable key array test helper

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/d1e76594-a3c8-4c84-b738-3decfdb73987

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Use precise nullable warning suppression

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/d1e76594-a3c8-4c84-b738-3decfdb73987

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Use record with expression for key binding clone

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/094cf268-64cd-42e9-9179-af0d70e786a2

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Add AOT-safety comment to CloneHardCodedPropertyValue

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: tig <585482+tig@users.noreply.github.com>
Co-authored-by: Tig <tig@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@tig

tig commented May 7, 2026

Copy link
Copy Markdown
Member Author

@copilot resolve the merge conflicts in this pull request

# Conflicts:
#	Directory.Packages.props

Co-authored-by: tig <585482+tig@users.noreply.github.com>

Copilot AI commented May 7, 2026

Copy link
Copy Markdown
Contributor

@copilot resolve the merge conflicts in this pull request

Resolved. The only conflict was in Directory.Packages.propsorigin/main had ReportGenerator 5.5.6 with duplicate entries that had already been cleaned up in this branch. Kept our version (de-duplicated with ReportGenerator 5.5.9). Merge commit: 46c762619.

Copilot finished work on behalf of tig May 7, 2026 20:00
@tig tig merged commit c2568cb into main May 7, 2026
13 checks passed
@tig tig deleted the release/v2.1.0-beta.1 branch May 7, 2026 20:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants