Thank you for your interest in contributing to Remote Agent! This document provides guidelines for contributing to the project.
Important: All development work should be based on the develop branch, not main.
main— Production-ready code. Protected branch. All changes must go through pull requests.develop— Main development branch. All feature branches should be created from and merged back intodevelop.- Feature branches — Create feature branches from
developusing descriptive names (e.g.,feature/add-authentication,fix/connection-timeout).
-
Fork the repository (if you're not a direct collaborator).
-
Clone your fork and add the upstream remote:
git clone https://github.com/YOUR_USERNAME/remote-agent.git cd remote-agent git remote add upstream https://github.com/sharpninja/remote-agent.git -
Create a feature branch from
develop:git checkout develop git pull upstream develop git checkout -b feature/your-feature-name
-
Make your changes following the coding standards below.
-
Test your changes:
./scripts/build-dotnet10.sh Release ./scripts/build-desktop-dotnet9.sh Release
-
Commit your changes with clear, descriptive commit messages:
git add . git commit -m "Add feature: description of your change"
Note: All commits must be signed. See branch-protection.md for setup instructions.
-
Push to your fork:
git push origin feature/your-feature-name
-
Create a Pull Request from your feature branch to the
developbranch of the upstream repository.
All warnings are treated as errors. See REPOSITORY_RULES.md for details.
- Do not suppress warnings without explicit approval.
- Fix the underlying issue that causes the warning.
- The build fails on any warning.
- Follow standard .NET coding conventions.
- Use meaningful variable and method names.
- Add XML documentation comments for public APIs.
- Keep methods focused and concise.
- Write unit tests for new functionality.
- Ensure all tests pass before submitting a PR.
- Integration tests should go in
RemoteAgent.Service.IntegrationTests.
All test classes and methods should be annotated with the functional (FR) and technical (TR) requirements they cover:
/// <summary>Tests for authentication. FR-13.5; TR-18.1, TR-18.2.</summary>
[Trait("Category", "Requirements")]
[Trait("Requirement", "FR-13.5")]
[Trait("Requirement", "TR-18.1")]
[Trait("Requirement", "TR-18.2")]
public class AuthUserServiceTests
{
[Fact]
public void UpsertListDelete_ShouldPersistUser()
{
// Test implementation
}
}After adding or updating requirement annotations, regenerate the traceability matrix:
./scripts/generate-requirements-matrix.shThis updates docs/requirements-test-coverage.md, which maps all requirements to their test coverage.
- .NET 10 SDK (MAUI app + service + shared libs/tests)
- .NET 9 SDK (Avalonia desktop app + desktop UI tests)
- For Android development: Android SDK and MAUI workload
./scripts/build-dotnet10.sh Release
./scripts/build-desktop-dotnet9.sh Releasedotnet test tests/RemoteAgent.App.Tests/RemoteAgent.App.Tests.csproj -c Release
dotnet test tests/RemoteAgent.Service.Tests/RemoteAgent.Service.Tests.csproj -c Release
dotnet test tests/RemoteAgent.Desktop.UiTests/RemoteAgent.Desktop.UiTests.csproj -c ReleaseIntegration tests are intentionally isolated and excluded from default pipeline runs. Execute them explicitly when needed:
./scripts/test-integration.sh ReleaseCI runs integration tests only through the manual integration-tests.yml workflow.
dotnet run --project src/RemoteAgent.Service- Base branch: Always target the
developbranch unless explicitly coordinating a hotfix tomain. - Title: Use a clear, descriptive title.
- Description: Explain what changes were made and why.
- Tests: Include tests for new features or bug fixes.
- Documentation: Update documentation if you're changing functionality.
- A maintainer will review your PR.
- Address any feedback or requested changes.
- Once approved, your PR will be merged into
develop. - Periodically,
developwill be merged intomainfor releases.
If you have questions or run into issues:
- Check existing Issues
- Open a new issue if your question/problem isn't already covered
- Join discussions in pull requests
Thank you for contributing!