Thank you for your interest in contributing to SarifMark! We welcome contributions from the community and appreciate your help in making this project better.
This project adheres to a Code of Conduct. By participating, you are expected to uphold this code. Please report unacceptable behavior through GitHub.
If you find a bug, please create an issue on GitHub with the following information:
- Description: Clear description of the bug
- Steps to Reproduce: Detailed steps to reproduce the issue
- Expected Behavior: What you expected to happen
- Actual Behavior: What actually happened
- Environment: Operating system, .NET version, SarifMark version
- Logs: Any relevant error messages or logs
We welcome feature suggestions! Please create an issue on GitHub with:
- Feature Description: Clear description of the proposed feature
- Use Case: Why this feature would be useful
- Proposed Solution: Your ideas on how to implement it (optional)
- Alternatives: Any alternative solutions you've considered (optional)
We follow a standard GitHub workflow for contributions:
- Fork the repository
- Clone your fork locally
- Create a branch for your changes (
git checkout -b feature/my-feature) - Make your changes following our coding standards
- Test your changes thoroughly
- Commit your changes with clear commit messages
- Push to your fork
- Create a Pull Request to the main repository
- .NET SDK 8.0, 9.0, or 10.0
- Git
- A code editor (Visual Studio, VS Code, or Rider recommended)
-
Clone the repository:
git clone https://github.com/demaconsulting/SarifMark.git cd SarifMark -
Restore dependencies:
dotnet tool restore dotnet restore
-
Build the project:
dotnet build --configuration Release
-
Run tests:
dotnet test --configuration Release
- Follow the C# Coding Conventions
- Use clear, descriptive names for variables, methods, and classes
- Write XML documentation comments for all public, internal, and private members
- Keep methods focused and single-purpose
- Write tests for new functionality
This project enforces code style through .editorconfig. Key requirements:
- Indentation: 4 spaces for C#, 2 spaces for YAML/JSON/XML
- Line Endings: LF (Unix-style)
- Encoding: UTF-8
- Namespaces: Use file-scoped namespace declarations
- Braces: Required for all control statements
- Naming Conventions:
- Interfaces:
IInterfaceName - Classes/Structs/Enums:
PascalCase - Methods/Properties:
PascalCase - Parameters/Local Variables:
camelCase
- Interfaces:
All members require XML documentation with proper indentation:
/// <summary>
/// Brief description of what this does.
/// </summary>
/// <param name="parameter">Description of the parameter.</param>
/// <returns>Description of the return value.</returns>
public int ExampleMethod(string parameter)
{
// Implementation
}Note the spaces after /// for proper indentation in summary blocks.
We use MSTest v4 for unit and integration tests.
Use the pattern: ClassName_MethodUnderTest_Scenario_ExpectedBehavior
Examples:
Program_Main_NoArguments_ReturnsSuccessContext_Create_WithInvalidFlag_ThrowsArgumentExceptionSarifResults_Read_ValidFile_ReturnsResults
- Write tests that are clear and focused
- Use modern MSTest v4 assertions:
Assert.HasCount(expectedCount, collection)Assert.IsEmpty(collection)Assert.DoesNotContain(item, collection)
- Always clean up resources (use
try/finallyfor console redirection) - Link tests to requirements in
requirements.yamlwhen applicable
# Run all tests
dotnet test --configuration Release
# Run specific test
dotnet test --filter "FullyQualifiedName~YourTestName"
# Run with coverage
dotnet test --collect "XPlat Code Coverage"All markdown files must follow these rules (enforced by markdownlint):
- Maximum line length: 120 characters
- Use ATX-style headers (
# Header) - Lists must be surrounded by blank lines
- Use reference-style links:
[text][ref]with[ref]: urlat document end - Exception:
README.mduses absolute URLs (it's included in the NuGet package)
All files are spell-checked using cspell. Add project-specific terms to .cspell.json:
{
"words": [
"myterm"
]
}Before submitting a pull request, ensure all quality checks pass:
dotnet build --configuration Release
dotnet test --configuration ReleaseAll tests must pass with zero warnings.
# These commands run in CI - verify locally if tools are installed
markdownlint-cli2 "**/*.md"
cspell "**/*.{md,cs}"
yamllint -c .yamllint.yaml .Maintain or improve code coverage. Use the --collect "XPlat Code Coverage" option when running tests.
Write clear, concise commit messages:
- Use present tense ("Add feature" not "Added feature")
- Use imperative mood ("Move cursor to..." not "Moves cursor to...")
- Limit first line to 72 characters
- Reference issues and pull requests when applicable
Examples:
Add support for custom report headersFix crash when SARIF file path is invalidUpdate documentation for --report-depth optionRefactor argument parsing for better testability
- Update Documentation: Update relevant documentation for your changes
- Add Tests: Include tests that cover your changes
- Run Quality Checks: Ensure all linters, tests, and builds pass
- Submit PR: Create a pull request with a clear description
- Code Review: Address feedback from maintainers
- Merge: Once approved, a maintainer will merge your PR
When creating a pull request, include:
- Description: What changes does this PR introduce?
- Motivation: Why are these changes needed?
- Related Issues: Link to any related issues
- Testing: How have you tested these changes?
- Checklist:
- Tests added/updated
- Documentation updated
- All tests pass
- Code follows style guidelines
- No new warnings introduced
SarifMark uses DemaConsulting.ReqStream for requirements traceability:
- All requirements are defined in
requirements.yaml - Each requirement should be linked to test cases
- Run
dotnet reqstreamto generate requirements documentation - Use the
--enforceflag to ensure all requirements have test coverage
Releases are managed by project maintainers. The process includes:
- Version bump in project files
- Tag the release in Git
- Build and test across all supported platforms
- Publish NuGet package
- Create GitHub release with artifacts and release notes
- Questions: Use GitHub Discussions
- Bugs: Report via GitHub Issues
- Security: See SECURITY.md for vulnerability reporting
By contributing to SarifMark, you agree that your contributions will be licensed under the MIT License.
Thank you for contributing to SarifMark!