Fieldworks Uia2 Parity Testing
sillsdev/FieldWorks
Design or review FieldWorks UI automation and accessibility tests: UIA2, FlaUI, Appium, WinAppDriver, Avalonia.Headless, keyboard, focus, IME, and automation-id strategy.
Create, modify, debug, or review Windows Forms applications only when the request contains a concrete Windows Forms marker.
$ npx skills add dotnet/skills --skill winforms-expert -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install dotnet/skills winforms-expert --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/dotnet/skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/plugins/dotnet-winforms/skills/winforms-expert .claude/skills/winforms-expert && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "winforms-expert" agent skill from https://github.com/dotnet/skills/tree/main/plugins/dotnet-winforms/skills/winforms-expert into .claude/skills/winforms-expert/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "winforms-expert", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/dotnet/skills/tree/main/plugins/dotnet-winforms/skills/winforms-expertType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add dotnet/skills --skill winforms-expert -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install dotnet/skills winforms-expert --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/dotnet/skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/plugins/dotnet-winforms/skills/winforms-expert .agents/skills/winforms-expert && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "winforms-expert" agent skill from https://github.com/dotnet/skills/tree/main/plugins/dotnet-winforms/skills/winforms-expert into .agents/skills/winforms-expert/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "winforms-expert", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add dotnet/skills --skill winforms-expert -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install dotnet/skills winforms-expert --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/dotnet/skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/plugins/dotnet-winforms/skills/winforms-expert .cursor/skills/winforms-expert && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "winforms-expert" agent skill from https://github.com/dotnet/skills/tree/main/plugins/dotnet-winforms/skills/winforms-expert into .cursor/skills/winforms-expert/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "winforms-expert", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/dotnet/skills.git --path plugins/dotnet-winforms/skills/winforms-expert--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add dotnet/skills --skill winforms-expert -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install dotnet/skills winforms-expert --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/dotnet/skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/plugins/dotnet-winforms/skills/winforms-expert .gemini/skills/winforms-expert && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "winforms-expert" agent skill from https://github.com/dotnet/skills/tree/main/plugins/dotnet-winforms/skills/winforms-expert into .gemini/skills/winforms-expert/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "winforms-expert", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install dotnet/skills winforms-expertInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add dotnet/skills --skill winforms-expert -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/dotnet/skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/plugins/dotnet-winforms/skills/winforms-expert .github/skills/winforms-expert && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "winforms-expert" agent skill from https://github.com/dotnet/skills/tree/main/plugins/dotnet-winforms/skills/winforms-expert into .github/skills/winforms-expert/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "winforms-expert", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add dotnet/skills --skill winforms-expert -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install dotnet/skills winforms-expert --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/dotnet/skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/plugins/dotnet-winforms/skills/winforms-expert .opencode/skills/winforms-expert && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "winforms-expert" agent skill from https://github.com/dotnet/skills/tree/main/plugins/dotnet-winforms/skills/winforms-expert into .opencode/skills/winforms-expert/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "winforms-expert", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
winforms-expertCreate, modify, debug, or review Windows Forms applications only when the request contains a concrete Windows Forms marker.
Winforms Expert is an agent skill from dotnet/skills, published by the product's own GitHub organization. Create, modify, debug, or review Windows Forms applications only when the request contains a concrete Windows Forms marker. USE FOR: WinForms, Windows Forms, System.Windows.Forms, WinForms Form or UserControl designer files (.Designer.cs or .Designer.vb), Visual Studio WinForms Designer, TableLayoutPanel, BindingSource, DataGridView, Control.InvokeAsync, component-tray ownership, or custom control serialization. DO NOT USE FOR: WPF or WPF XAML, including Window.InputBindings, KeyBinding, commands, or DataContext…
Its SKILL.md is about 5.8k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Mobile. It works with Avalonia. The repository describes itself as: Repository for skills to assist AI coding agents with .NET and C. The licence is MIT.
7 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 8d670fa. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
pwshdotnetFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Winforms Expert loads about 5.8k tokens when it runs. Until then it costs about 158 tokens; SKILL.md has 2,899 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from dotnet/skills at commit 8d670fa, republished under its MIT licence (© dotnet). 2,899 words, ~5,786 tokens.
.claude/skills/winforms-expert/SKILL.md (or your agent's skills folder).Implement WinForms changes that compile, behave correctly at runtime, and remain editable in the
Visual Studio Designer. Treat InitializeComponent and *.Designer.* as a serialization format,
not ordinary application code; keep behavior in the main partial class and verify designer
usability whenever the environment permits.
Before editing, list the workspace root and locate any task-specific validator, test script, or documented verification command. Read its scenario selector and required arguments before choosing an implementation. After editing:
A successful build never substitutes for an available layout, binding, serialization, or designer-safety validator. Do not finish after merely reading a validator or after a build succeeds.
Use the repository's actual command and arguments; the sequence should look like:
pwsh -NoProfile -File <task-validator.ps1> <scenario-arguments>
dotnet build <project> --nologoUse this skill for:
Form, UserControl, or custom control.Do not use it to:
| Input | Required | How to obtain it |
|---|---|---|
| Requested UI behavior or defect | Yes | Use the user's request and reproduce the symptom when possible. |
| Project language and target framework | Yes | Inspect the project file; do not assume modern .NET or C#. |
| Existing Form/UserControl partial files | Yes | Find the main file, designer file, and matching .resx. |
| Repository conventions | Yes | Inspect nearby WinForms types, build scripts, analyzers, and package management. |
| Designer availability | No | Determine whether a compatible Visual Studio WinForms Designer can be opened. |
There are two code contexts:
| Context | Files | Rule |
|---|---|---|
| Designer serialization | *.Designer.cs, *.Designer.vb, InitializeComponent | Use simple, deterministic statements the designer can parse and regenerate. |
| Application behavior | Main partial class, services, view models | Use language features supported by the project's TFM and language version. |
In InitializeComponent and designer files:
Controls,
Items, Columns, or another serialized collection through a local variable.if, loops, switch, try/catch, lock, await, goto),
local functions, expression-bodied logic, collection expressions, null-conditional or
null-coalescing expressions, or other runtime decision logic.InitializeComponent and Dispose.Form/UserControl must have a usable parameterless construction path unless the project uses
an established custom designer pattern.BeginInit/EndInit, SuspendLayout/ResumeLayout, and container ownership balanced.Friend WithEvents fields and prefer Handles clauses in the main file.A safe InitializeComponent sequence is:
IContainer when owned components require it.BeginInit and SuspendLayout methods.EndInit, ResumeLayout, and PerformLayout where appropriate.Move anything more complex to the main partial class, usually after InitializeComponent has run.
Use the symptom to choose one WinForms-specific repair. Do not list several plausible patterns when the existing project and failure identify one.
| Symptom or request | Do | Never | Verify |
|---|---|---|---|
| A Form/UserControl builds but the Designer cannot instantiate it | Preserve the runtime constructor, add a designer-usable parameterless path, and defer dependency use until runtime load with an explicit design/null guard | Construct production services, open files, or query data from the designer path | The runtime composition root still supplies the real dependency; the design path reaches InitializeComponent without invoking it |
| Controls/components disappear, duplicate, or fail after Designer save/reopen | Restore the generated field/collection shape and balance every BeginInit/EndInit and SuspendLayout/ResumeLayout pair | Patch the symptom in OnLoad or move serialized controls into local variables | Save, close, reopen, and inspect the regenerated diff |
A designer-created Timer, BindingSource, image list, or similar component outlives the Form | Create the components container and pass it to the component constructor | Add ad hoc disposal while leaving designer ownership inconsistent | Closing the Form disposes the container-owned component and the component remains designer-managed |
| Adding/removing list items does not refresh a bound WinForms list control | Use BindingList<T> or the repository's adapter that raises WinForms list-change notifications | Treat ObservableCollection<T> as a drop-in WinForms DataSource | Mutate the list after binding and observe the control update |
| Nested content clips at DPI, font, or localization changes | Inspect AutoSize, AutoSizeMode, Dock, MinimumSize, MaximumSize, and row/column styles from the leaf through every parent; remove the actual growth cap while preserving intentional minimums; also inspect sibling controls positioned against the growing chain and keep them in responsive layout | Assume AutoSize = true is sufficient, increase one fixed Size, bypass a parent container, or leave a sibling where expanded content can overlap it | Exercise resize plus the relevant DPI/font/text expansion |
| UI work is posted but completion/errors are lost | Put the operation in a Task-returning method that callers/tests can await; let the required async void event handler do only await RefreshAsync(); update controls on the captured WinForms context or await InvokeAsync when execution can be off-context; restore control state in finally | Keep the whole operation inside async void, use _ =, BeginInvoke, a dead cancellation catch, or an application-wide exception hook as the normal path | Await the task-returning method through success and failure; verify the UI entry point delegates to it |
| Text must be localizable | Use the existing .resx and ComponentResourceManager.ApplyResources serialization pattern | Leave fallback UI text hard-coded in InitializeComponent | Build, switch culture when possible, and perform a Designer save/reopen |
| A VB app needs startup, single-instance, or unhandled-UI hooks | Extend ApplicationEvents.vb; qualify Microsoft.VisualBasic.ApplicationServices event-argument types when ambiguous; restore, activate, and bring the existing MainForm forward; log e.Exception; set e.ExitApplication = True explicitly | Invent Program.vb, add Sub Main, replace generated startup, or leave post-error continuation implicit | The configured StartupObject and generated application file remain unchanged, no new entry point exists, and the final report states the exit choice |
| Review finds no actual designer defect | Leave tracked project/source files byte-for-byte unchanged and report why the suspicious construct is harmless | Clean up warnings, reformat generated code, or modernize unrelated syntax | Run the narrow available check and focused build; confirm the source diff is empty |
| The workspace contains a task-specific validator or test script | Run the narrow repository-provided check after editing and before the generic build; treat its failure as evidence that the change is incomplete | Skip the specialized check because the project compiles, or claim a Designer round trip from static validation | Report the exact validator and build commands separately, then state whether runtime UI and Designer round-trip checks were actually available |
.resx for every affected Form/UserControl before
editing. Check base classes and nearby controls for repository conventions.InitializeComponent.For new or substantially revised layouts:
TableLayoutPanel, FlowLayoutPanel, SplitContainer, and nested UserControls over
brittle absolute positioning.AutoSize for caption/single-line rows and columns, Percent for expandable content,
and Absolute only for genuinely fixed-size content.AutoScaleMode. For new forms, choose scaling deliberately based
on the project conventions rather than copying coordinates from another DPI.Panel or GroupBox inside an autosized row can still clip its contents.For dialogs:
AcceptButton, CancelButton, and appropriate DialogResult values.async void event handler resumes on its captured UI synchronization context
after await unless that context was deliberately bypassed. Direct control access there is valid.
Use and await InvokeAsync when code can continue off-context, or when the task/repository contract
explicitly requires a marshaled operation; do not rely on an unawaited post.Control.InvokeAsync overload matching
whether the delegate is synchronous/asynchronous and whether it returns a value. Await the
returned operation; do not create fire-and-forget UI work.async void is acceptable for WinForms event handlers and overrides that must return void,
but catch exceptions around awaited work, handle cancellation intentionally, and surface
unexpected failures through the application's established error path.Application.ThreadException covers UI-thread exceptions; AppDomain.UnhandledException is
primarily a last-chance logging path and does not make continued execution safe.=> new ... or vice versa without confirming lifetime and disposal behavior.For application-wide startup:
Program.cs; VB projects normally use the VB Application Framework and
ApplicationEvents.vb, not a newly invented Program.vb.SystemAware when maintaining the normal .NET WinForms DPI behavior. Use
PerMonitorV2 only when the application is designed and tested for per-monitor scaling.For classic binding:
INotifyPropertyChanged for mutable bound objects and BindingList<T> or an established
adapter for list change notifications.BindingSource as the designer/runtime mediator when that matches the existing design.Binding.Format and Binding.Parse handlers rather than embedding
executable logic in designer code.Binding does not provide a
direct WPF-style mode. Document and test any workaround instead of implying native support.For modern WinForms MVVM APIs, first confirm the TFM contains the requested API:
Control.DataContext for ambient view-model context when available.ButtonBase.Command, ToolStripItem.Command, and CommandParameter when available..datasource and BindingSource pattern and verify it in the Designer.For custom Component/Control properties, choose one intentional CodeDOM serialization policy:
| Policy | Mechanism | Use |
|---|---|---|
| Serialize only when non-default | [DefaultValue(...)] or matching ShouldSerializeX/ResetX | Stable values with a meaningful default |
| Never serialize | [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] | Runtime-only, calculated, or unsupported state |
| Serialize content | DesignerSerializationVisibility.Content plus designer-compatible mutable content | Owned nested objects/collections intentionally edited in the property grid |
Import System.ComponentModel (or fully qualify its attributes). Keep default metadata and runtime
initialization directly aligned: for [DefaultValue(typeof(Color), "Yellow")], initialize the
property or its backing field directly with Color.Yellow; do not hide the actual default behind a
second constant or factory. Do not combine contradictory policies. Test property-grid editing and
save/reload behavior for custom serialization changes.
TabIndex order and verify keyboard-only traversal.DataGridView, icons, and custom painting, verify contrast in every supported
theme rather than assuming dark-mode adaptation.A change is complete only when the checks applicable to the environment are observable:
InitializeComponent contains unsupported runtime logic or unresolved fields,
handlers, resources, or unbalanced layout/initialization calls.If Visual Studio, the Designer, Windows desktop access, a required workload, or a target runtime is unavailable, report that validation as not run, state why, and list the exact checks that did run. A successful build is not evidence that the Designer opens. Do not report the work as fully designer-verified unless the design surface and serialization round trip were actually tested.
If a command fails:
Finish with a concise validation record:
Build: exact command and result.Runtime UI: exercised behavior, or not run with the blocking reason.Designer round trip: Form/UserControl opened, edited, saved, closed, and reopened; or not run
with the blocking reason.Preserved: project policy and generated/startup files intentionally left unchanged.| Pitfall | Corrective rule |
|---|---|
Treating InitializeComponent as normal modern C# | Keep it as simple designer serialization; move decisions and behavior to the main partial class. |
| Putting lambdas or local control variables in generated code | Use class-level fields and named handlers. |
| Editing only one partial file | Read and keep the main file, designer file, .resx, base type, and project metadata consistent. |
| Reformatting the entire designer file | Make a surgical diff that follows generated ordering and style. |
| Assuming a build proves designer health | Open, edit, save, close, and reopen the design surface. |
| Adding constructor dependencies to a designable type | Preserve a designer-usable parameterless path or an established custom designer solution. |
| Fixed-size nested containers clipping controls | Preserve an autosizing chain and test resize plus DPI scaling. |
| Using absolute colors for dark mode without testing | Prefer system colors or explicitly theme and contrast-test custom drawing. |
Treating ObservableCollection<T> as a drop-in WinForms list source | Use BindingList<T> or an adapter that bridges collection and property notifications. |
| Assuming WPF binding or converter features exist | Use WinForms Binding, BindingSource, Format, and Parse; verify TFM-specific APIs. |
| Fire-and-forget UI marshaling or uncaught async event errors | Await InvokeAsync; catch and surface failures in async void UI entry points. |
Inventing Program.vb for a VB application | Use the VB Application Framework and ApplicationEvents.vb conventions. |
| Changing DPI/theme/TFM/package policy during a UI fix | Preserve project policy unless the requested behavior requires and validates the change. |
© dotnet, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in plugins/dotnet-winforms/skills/winforms-expert of dotnet/skills.
Open the folder on GitHubat commit 8d670fa
We found 2 copies of this SKILL.md (exact, near-identical or edited) in other folders, from 1 other GitHub owner. This page covers the copy in dotnet/skills, which our catalogue first saw on October 7, 2026.
Winforms Expert next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Winforms Expert this skilldotnet/skills | 5.6k | 1 repos | ~5.8k | Automated safety check: Pass | MIT | |
| Fieldworks Uia2 Parity Testingsillsdev/FieldWorks | 110 | — | ~1k | Automated safety check: Pass | Custom licence | |
| Mvvm Toolkit Digithub/awesome-copilot | 40k | 1 repos | ~2.3k | Automated safety check: Pass | MIT | |
| Mvvm Toolkit Messengergithub/awesome-copilot | 40k | 1 repos | ~2.2k | Automated safety check: Pass | MIT | |
| Docusaurus StylingAvaloniaUI/avalonia-docs | 166 | — | ~3.3k | Automated safety check: Pass | None | |
| Oneware Stylingone-ware/OneWare | 147 | — | ~1.1k | Automated safety check: Pass | Apache-2.0 |
sillsdev/FieldWorks
Design or review FieldWorks UI automation and accessibility tests: UIA2, FlaUI, Appium, WinAppDriver, Avalonia.Headless, keyboard, focus, IME, and automation-id strategy.
github/awesome-copilot
Wire CommunityToolkit.Mvvm ViewModels into Microsoft.Extensions.DependencyInjection.
github/awesome-copilot
CommunityToolkit.Mvvm Messenger pub/sub for decoupled communication between ViewModels (or any objects).
AvaloniaUI/avalonia-docs
Style Docusaurus sites to match Avalonia Customer Portal theme using TailwindCSS, CSS variables, and component swizzling.
one-ware/OneWare
Styles OneWare Avalonia UI with the shared design system (tokens, classes, icons, control themes).
tautcony/ChapterTool
Phase D of a WinForms-to-Avalonia migration: build the Avalonia UI shell with composition, MVVM state and commands, responsive XAML, accessibility, localization boundaries, and behavior-focused…
dotnet/skills
Resolves .NET runtime frames in Apple .ips crash logs to function names, source files and line numbers using dSYM symbols, atos and the Microsoft symbol server.
dotnet/skills
Resolves native crash frames from .NET Android tombstones to function names, source files and line numbers using BuildIds, Microsoft's symbol server and llvm-symbolizer.
dotnet/skills
Scans C# and .NET code for about 50 performance anti-patterns and reports prioritized findings with concrete fixes, at a scan depth you choose.
dotnet/skills
Statically pairs source files with test files to list code that no test references, using Roslyn for C# or tree-sitter for many languages, with no build.
dotnet/skills
Activate this skill when BenchmarkDotNet (BDN) is involved in the task — creating, running, configuring, or reviewing BDN benchmarks.
dotnet/skills
Makes .NET projects compatible with Native AOT and trimming by resolving IL trim and AOT analyzer warnings through annotations rather than suppressions.
Works with
Categories
Create, modify, debug, or review Windows Forms applications only when the request contains a concrete Windows Forms marker. Winforms Expert is an agent skill from dotnet/skills, published by the product's own GitHub organization. Create, modify, debug, or review Windows Forms applications only when the request contains a concrete Windows Forms marker.
Winforms Expert fits situations like: system.Windows.Forms; userControl designer files (.Designer.cs; visual Studio WinForms Designer; tableLayoutPanel.
Run `npx skills add dotnet/skills --skill winforms-expert -a claude-code`. Or copy the skill folder (plugins/dotnet-winforms/skills/winforms-expert in dotnet/skills) into .claude/skills/winforms-expert in your project. Claude Code loads it when a task matches its description.
Run `npx skills add dotnet/skills --skill winforms-expert -a codex`. Or copy the skill folder (plugins/dotnet-winforms/skills/winforms-expert in dotnet/skills) into .agents/skills/winforms-expert in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add dotnet/skills --skill winforms-expert -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/winforms-expert, .gemini/skills/winforms-expert, .github/skills/winforms-expert and .opencode/skills/winforms-expert in your project.
Going by SKILL.md and its folder, Winforms Expert needs the command-line tools its instructions call (pwsh and dotnet).
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Winforms Expert is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 5.8k tokens (SKILL.md is roughly 23k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Winforms Expert: Fieldworks Uia2 Parity Testing (sillsdev/FieldWorks, 110 stars), Mvvm Toolkit Di (github/awesome-copilot, 40k stars), Mvvm Toolkit Messenger (github/awesome-copilot, 40k stars) and Docusaurus Styling (AvaloniaUI/avalonia-docs, 166 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
dotnet (a GitHub organization, an official publisher) maintains it in dotnet/skills, which has 5,568 GitHub stars. The repository holds 91 skills in this directory. The repository was last updated on October 7, 2026.
Source: dotnet/skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.