# Terminal.Gui Project

**Terminal.Gui** is a cross-platform UI toolkit for creating console-based graphical user interfaces in .NET. This repository contains all files required to build the **Terminal.Gui** library and NuGet package, enabling developers to create rich terminal applications with ease.

## Project Overview

**Terminal.Gui** provides a comprehensive framework for building interactive console applications with support for keyboard and mouse input, customizable views, and a robust event system. It is designed to work across Windows, macOS, and Linux, leveraging platform-specific console capabilities where available.

## Project Folder Structure

This directory contains the core **Terminal.Gui** library source code. For a detailed repository structure, see [CONTRIBUTING.md - Repository Structure](../CONTRIBUTING.md#repository-structure).

## Getting Started

For instructions on how to start using **Terminal.Gui**, refer to the [Getting Started Guide](https://gui-cs.github.io/Terminal.Gui/docs/getting-started.html) in our documentation.

## Documentation

Comprehensive documentation is available at [gui-cs.github.io/Terminal.Gui](https://gui-cs.github.io/Terminal.Gui).

For information on generating and updating the API documentation locally, refer to the [DocFX README](../docfx/README.md).

## Versioning

Version information for Terminal.Gui is managed by [gitversion](https://gitversion.net). To install `gitversion`:

```powershell
dotnet tool install --global GitVersion.Tool
dotnet-gitversion
```

The project version (used in the NuGet package and `Terminal.Gui.dll`) is determined from the latest `git tag`. The format of version numbers is `major.minor.patch.build.height` and follows [Semantic Versioning](https://semver.org/) rules.

To define a new version, tag a commit using `git tag`:

```powershell
git tag v2.1.0-beta.1 -a -m "Release v2.1.0 Beta 1"
dotnet-gitversion /updateprojectfiles
dotnet build -c Release
```

**DO NOT COMMIT AFTER USING `/updateprojectfiles`!** Doing so will update the `.csproj` files in your branch with version info, which we do not want.

## Publishing a Release of Terminal.Gui

To release a new version, follow these steps based on [Semantic Versioning](https://semver.org/) rules:

- **MAJOR** version for incompatible API changes.
- **MINOR** version for backwards-compatible functionality additions.
- **PATCH** version for backwards-compatible bug fixes.

### Steps for Release:

1. **Verify the `v2_develop` branch is ready for release**:
	- Ensure all changes are committed and pushed to the `v2_develop` branch.
	- Ensure your local `v2_develop` branch is up-to-date with `upstream/v2_develop`.

2. **Create a pull request for the release in the `v2_develop` branch**:
	- Title the PR as "Release vX.Y.Z".
	```powershell
	git checkout v2_develop
	git pull upstream v2_develop
	git checkout -b vX_Y_Z
	git add .
	git commit -m "Release vX.Y.Z"
	git push
	```
	- Go to the link printed by `git push` and fill out the Pull Request.

3. **On github.com, verify the build action worked on your fork, then merge the PR**.

4. **Pull the merged `v2_develop` from `upstream`**:
	```powershell
	git checkout v2_develop
	git pull upstream v2_develop
	```

5. **Merge `v2_develop` into `v2_release`**:
	```powershell
	git checkout v2_release
	git pull upstream v2_release
	git merge v2_develop
	```
	- Fix any merge errors.

6. **Create a new annotated tag for the release on `v2_release`**:
	```powershell
	git tag vX.Y.Z -a -m "Release vX.Y.Z"
	```

7. **Push the new tag to `v2_release` on `upstream`**:
	```powershell
	git push --atomic upstream v2_release vX.Y.Z
	```

8. **Monitor Github Actions to ensure the NuGet publishing worked**:
	- Check [GitHub Actions](https://github.com/gui-cs/Terminal.Gui/actions).

9. **Check NuGet to see the new package version (wait a few minutes)**:
	- Visit [NuGet Package](https://www.nuget.org/packages/Terminal.Gui).

10. **Add a new Release in Github**:
	- Go to [GitHub Releases](https://github.com/gui-cs/Terminal.Gui/releases) and generate release notes with the list of PRs since the last release.

11. **Update the `v2_develop` branch with the new version**:
	```powershell
	git checkout v2_develop
	git pull upstream v2_develop
	git merge v2_release
	git push upstream v2_develop
	```

## NuGet

The official NuGet package for Terminal.Gui is available at [https://www.nuget.org/packages/Terminal.Gui](https://www.nuget.org/packages/Terminal.Gui). When a new version tag is defined and merged into `v2_release`, a NuGet package is automatically generated by a GitHub Action. Pre-release versions (e.g., `2.0.0-beta.5`) are tagged as pre-release on NuGet.

## Contributing

We welcome contributions from the community. For complete contribution guidelines, including:
- Build and test instructions
- Coding conventions and style rules
- Testing requirements and patterns
- Pull request guidelines
- CI/CD workflows

Please refer to [CONTRIBUTING.md](../CONTRIBUTING.md) in the repository root.
