* Initial plan * Add copilot-instructions.md and .cursorrules for AI agents 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>
10 KiB
Terminal.Gui - Copilot Coding Agent Instructions
This file provides onboarding instructions for GitHub Copilot and other AI coding agents working with Terminal.Gui.
Project Overview
Terminal.Gui is a cross-platform UI toolkit for creating console-based graphical user interfaces in .NET. It's a large codebase (~1,050 C# files, 333MB) providing a comprehensive framework for building interactive console applications with support for keyboard and mouse input, customizable views, and a robust event system.
Key characteristics:
- Language: C# (net8.0)
- Size: ~496 source files in core library, ~1,050 total C# files
- Platform: Cross-platform (Windows, macOS, Linux)
- Architecture: Console UI toolkit with driver-based architecture
- Version: v2 (Alpha), v1 (maintenance mode)
- Branching: GitFlow model (v2_develop is default/active development)
Building and Testing
Required Tools
- .NET SDK: 8.0.0 (see
global.json) - Runtime: .NET 8.x (latest GA)
- Optional: ReSharper/Rider for code formatting
Build Commands (In Order)
ALWAYS run these commands from the repository root:
-
Restore packages (required first, ~15-20 seconds):
dotnet restore -
Build solution (Debug, ~50 seconds):
dotnet build --configuration Debug --no-restore- Expect ~326 warnings (nullable reference warnings, unused variables, etc.) - these are normal
- 0 errors expected
-
Build Release (for packaging):
dotnet build --configuration Release --no-restore
Test Commands
Two test projects exist:
-
Non-parallel tests (depend on static state, ~10 min timeout):
dotnet test Tests/UnitTests --no-build --verbosity normal- Uses
Application.Initand static state - Cannot run in parallel
- Includes
--blameflags for crash diagnostics
- Uses
-
Parallel tests (can run concurrently, ~10 min timeout):
dotnet test Tests/UnitTestsParallelizable --no-build --verbosity normal- No dependencies on static state
- Preferred for new tests
-
Integration tests:
dotnet test Tests/IntegrationTests --no-build --verbosity normal
Important: Tests may take significant time. CI uses blame flags for crash detection:
--diag:logs/UnitTests/logs.txt --blame --blame-crash --blame-hang --blame-hang-timeout 60s --blame-crash-collect-always
Running Examples
UICatalog (comprehensive demo app):
dotnet run --project Examples/UICatalog/UICatalog.csproj
Repository Structure
Root Directory Files
Terminal.sln- Main solution fileTerminal.sln.DotSettings- ReSharper code style settings.editorconfig- Code formatting rules (111KB, extensive)global.json- .NET SDK version pinningDirectory.Build.props- Common MSBuild propertiesDirectory.Packages.props- Central package version managementGitVersion.yml- Version numbering configurationAGENTS.md- General AI agent instructions (also useful reference)CONTRIBUTING.md- Contribution guidelinesREADME.md- Project documentation
Main Directories
/Terminal.Gui/ - Core library (496 C# files):
App/- Application lifecycle (Application.csstatic class,RunState,MainLoop)Configuration/-ConfigurationManagerfor settingsDrivers/- Console driver implementations (IConsoleDriver,NetDriver,UnixDriver,WindowsDriver)Drawing/- Rendering system (attributes, colors, glyphs)Input/- Keyboard and mouse input handlingViewBase/- CoreViewclass hierarchy and layoutViews/- Specific View subclasses (Window, Dialog, Button, ListView, etc.)Text/- Text manipulation and formatting
/Tests/:
UnitTests/- Non-parallel tests (useApplication.Init, static state)UnitTestsParallelizable/- Parallel tests (no static dependencies)IntegrationTests/- Integration testsStressTests/- Long-running stress tests (scheduled daily)coverlet.runsettings- Code coverage configuration
/Examples/:
UICatalog/- Comprehensive demo app for manual testingExample/- Basic exampleNativeAot/,SelfContained/- Deployment examplesReactiveExample/,CommunityToolkitExample/- Integration examples
/docfx/ - Documentation source:
docs/- Conceptual documentation (deep dives)api/- Generated API docs (gitignored)docfx.json- DocFX configuration
/Scripts/ - PowerShell build utilities (requires PowerShell 7.4+)
/.github/workflows/ - CI/CD pipelines:
unit-tests.yml- Main test workflow (Ubuntu, Windows, macOS)build-release.yml- Release build verificationintegration-tests.yml- Integration test workflowpublish.yml- NuGet package publishingapi-docs.yml- Documentation building and deploymentcodeql-analysis.yml- Security scanning
Code Style and Quality
Formatting
- Do NOT add formatting tools - Use existing
.editorconfigandTerminal.sln.DotSettings - Format code with:
- ReSharper/Rider (
Ctrl-E-C) - JetBrains CleanupCode CLI tool (free)
- Visual Studio (
Ctrl-K-D) as fallback
- ReSharper/Rider (
- Only format files you modify
Code Style Tenets
- Six-Year-Old Reading Level - Readability over terseness
- Consistency, Consistency, Consistency - Follow existing patterns ruthlessly
- Don't be Weird - Follow Microsoft/.NET conventions
- Set and Forget - Rely on automated tooling
- Documentation is the Spec - API docs are source of truth
Coding Conventions
- Use explicit types (avoid
varexcept for basic types likeint,string) - Use target-typed
new() - Follow
.editorconfigsettings (e.g., braces on new lines, spaces after keywords) - 4-space indentation
- See
CONTRIBUTING.mdfor full guidelines
Testing Requirements
Code Coverage
- Never decrease code coverage - PRs must maintain or increase coverage
- Target: 70%+ coverage for new code
- CI monitors coverage on each PR
Test Patterns
- Parallelizable tests preferred - Add new tests to
UnitTestsParallelizablewhen possible - Avoid static dependencies - Don't use
Application.Init,ConfigurationManagerin tests - Don't use
[AutoInitShutdown]- Legacy pattern, being phased out - Make tests granular - Each test should cover smallest area possible
- Follow existing test patterns in respective test projects
Test Configuration
xunit.runner.json- xUnit configurationcoverlet.runsettings- Coverage settings (OpenCover format)
API Documentation Requirements
All public APIs MUST have XML documentation:
- Clear, concise
<summary>tags - Use
<see cref=""/>for cross-references - Add
<remarks>for context - Include
<example>for non-obvious usage - Complex topics →
docfx/docs/*.mdfiles - Proper English and grammar
Common Build Issues
Issue: Build Warnings
- Expected: ~326 warnings (nullable refs, unused vars, xUnit suggestions)
- Action: Don't add new warnings; fix warnings in code you modify
Issue: Test Timeouts
- Expected: Tests can take 5-10 minutes
- Action: Use appropriate timeout values (60-120 seconds for test commands)
Issue: Restore Failures
- Solution: Ensure
dotnet restorecompletes before building - Note: Takes 15-20 seconds on first run
Issue: NativeAot/SelfContained Build
- Solution: Restore these projects explicitly:
dotnet restore ./Examples/NativeAot/NativeAot.csproj -f dotnet restore ./Examples/SelfContained/SelfContained.csproj -f
CI/CD Validation
The following checks run on PRs:
-
Unit Tests (
unit-tests.yml):- Runs on Ubuntu, Windows, macOS
- Both parallel and non-parallel test suites
- Code coverage collection
- 10-minute timeout per job
-
Build Release (
build-release.yml):- Verifies Release configuration builds
- Tests NativeAot and SelfContained builds
- Packs NuGet package
-
Integration Tests (
integration-tests.yml):- Cross-platform integration testing
- 10-minute timeout
-
CodeQL Analysis (
codeql-analysis.yml):- Security vulnerability scanning
To replicate CI locally:
# Full CI sequence:
dotnet restore
dotnet build --configuration Debug --no-restore
dotnet test Tests/UnitTests --no-build --verbosity normal
dotnet test Tests/UnitTestsParallelizable --no-build --verbosity normal
dotnet build --configuration Release --no-restore
Branching and PRs
GitFlow Model
v2_develop- Default branch, active developmentv2_release- Stable releases, matches NuGetv1_develop,v1_release- Legacy v1 (maintenance only)
PR Requirements
- Title: "Fixes #issue. Terse description"
- Description: Include "- Fixes #issue" for each issue
- Tests: Add tests for new functionality
- Coverage: Maintain or increase code coverage
- Scenarios: Update UICatalog scenarios when adding features
Key Architecture Concepts
View System
Viewbase class in/Terminal.Gui/ViewBase/- Two layout modes: Absolute and Computed
- Event-driven architecture
- Adornments: Border, Margin, Padding
Console Drivers
IConsoleDriverinterface- Platform-specific:
WindowsDriver,UnixDriver,NetDriver FakeDriverfor testing
Application Lifecycle
Applicationstatic class manages lifecycleMainLoophandles event processingRunStatetracks application state
What NOT to Do
- ❌ Don't add new linters/formatters (use existing)
- ❌ Don't modify unrelated code
- ❌ Don't remove/edit unrelated tests
- ❌ Don't break existing functionality
- ❌ Don't add tests to
UnitTestsif they can be parallelizable - ❌ Don't use
Application.Initin new tests - ❌ Don't decrease code coverage
- ❌ Don't add
vareverywhere (use explicit types)
Additional Resources
- Full Documentation: https://gui-cs.github.io/Terminal.Gui
- API Reference: https://gui-cs.github.io/Terminal.Gui/api/Terminal.Gui.App.html
- Deep Dives:
/docfx/docs/directory - AGENTS.md: Additional AI agent instructions
- CONTRIBUTING.md: Detailed contribution guidelines
Trust these instructions. Only search for additional information if instructions are incomplete or incorrect.