Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
172 changes: 172 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,172 @@
# EditorConfig is awesome: https://EditorConfig.org

# top-most EditorConfig file
root = true

# All files
[*]
charset = utf-8
insert_final_newline = true
trim_trailing_whitespace = true
indent_style = space

# Code files
[*.{cs,csx,vb,vbx}]
indent_size = 4

# XML project files
[*.{csproj,vbproj,vcxproj,vcxproj.filters,proj,projitems,shproj}]
indent_size = 2

# XML config files
[*.{props,targets,ruleset,config,nuspec,resx,vsixmanifest,vsct}]
indent_size = 2

# JSON files
[*.json]
indent_size = 2

# YAML files
[*.{yml,yaml}]
indent_size = 2

# Markdown files
[*.md]
trim_trailing_whitespace = false

# Shell scripts
[*.sh]
end_of_line = lf

[*.{cmd,bat}]
end_of_line = crlf

# C# files
[*.cs]

# New line preferences
csharp_new_line_before_open_brace = all
csharp_new_line_before_else = true
csharp_new_line_before_catch = true
csharp_new_line_before_finally = true
csharp_new_line_before_members_in_object_initializers = true
csharp_new_line_before_members_in_anonymous_types = true
csharp_new_line_between_query_expression_clauses = true

# Indentation preferences
csharp_indent_case_contents = true
csharp_indent_switch_labels = true
csharp_indent_labels = one_less_than_current
csharp_indent_block_contents = true
csharp_indent_braces = false
csharp_indent_case_contents_when_block = false

# Space preferences
csharp_space_after_cast = false
csharp_space_after_keywords_in_control_flow_statements = true
csharp_space_between_parentheses = false
csharp_space_before_colon_in_inheritance_clause = true
csharp_space_after_colon_in_inheritance_clause = true
csharp_space_around_binary_operators = before_and_after
csharp_space_between_method_declaration_parameter_list_parentheses = false
csharp_space_between_method_declaration_empty_parameter_list_parentheses = false
csharp_space_between_method_declaration_name_and_open_parenthesis = false
csharp_space_between_method_call_parameter_list_parentheses = false
csharp_space_between_method_call_empty_parameter_list_parentheses = false
csharp_space_between_method_call_name_and_opening_parenthesis = false
csharp_space_after_comma = true
csharp_space_after_dot = false

# Organize usings
dotnet_sort_system_directives_first = true
dotnet_separate_import_directive_groups = false

# Code style - expression preferences
dotnet_style_prefer_auto_properties = true:suggestion
dotnet_style_prefer_conditional_expression_over_assignment = true:suggestion
dotnet_style_prefer_conditional_expression_over_return = true:suggestion
dotnet_style_prefer_inferred_tuple_names = true:suggestion
dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion
csharp_prefer_simple_default_expression = true:suggestion

# Code style - expression bodied members
csharp_style_expression_bodied_methods = when_on_single_line:suggestion
csharp_style_expression_bodied_constructors = when_on_single_line:suggestion
csharp_style_expression_bodied_operators = when_on_single_line:suggestion
csharp_style_expression_bodied_properties = when_on_single_line:suggestion
csharp_style_expression_bodied_indexers = when_on_single_line:suggestion
csharp_style_expression_bodied_accessors = when_on_single_line:suggestion
csharp_style_expression_bodied_lambdas = when_on_single_line:suggestion
csharp_style_expression_bodied_local_functions = when_on_single_line:suggestion

# Code style - pattern matching
csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion
csharp_style_pattern_matching_over_as_with_null_check = true:suggestion

# Code style - null checking
csharp_style_throw_expression = true:suggestion
csharp_style_conditional_delegate_call = true:suggestion

# Code style - modifier preferences
csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:suggestion
dotnet_style_require_accessibility_modifiers = for_non_interface_members:suggestion
dotnet_style_readonly_field = true:suggestion

# Code style - parentheses preferences
dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:suggestion
dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:suggestion
dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:suggestion
dotnet_style_parentheses_in_other_operators = never_if_unnecessary:suggestion

# Code style - var preferences
csharp_style_var_for_built_in_types = false:suggestion
csharp_style_var_when_type_is_apparent = true:suggestion
csharp_style_var_elsewhere = false:suggestion

# Naming conventions
dotnet_naming_rule.interface_should_be_begins_with_i.severity = suggestion
dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface
dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i

dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion
dotnet_naming_rule.types_should_be_pascal_case.symbols = types
dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case

dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = suggestion
dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members
dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case

# Symbol specifications
dotnet_naming_symbols.interface.applicable_kinds = interface
dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.interface.required_modifiers =

dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum
dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.types.required_modifiers =

dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method
dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.non_field_members.required_modifiers =

# Naming styles
dotnet_naming_style.begins_with_i.required_prefix = I
dotnet_naming_style.begins_with_i.required_suffix =
dotnet_naming_style.begins_with_i.word_separator =
dotnet_naming_style.begins_with_i.capitalization = pascal_case

dotnet_naming_style.pascal_case.required_prefix =
dotnet_naming_style.pascal_case.required_suffix =
dotnet_naming_style.pascal_case.word_separator =
dotnet_naming_style.pascal_case.capitalization = pascal_case

# Code quality
dotnet_code_quality_unused_parameters = all:suggestion
dotnet_remove_unnecessary_suppression_exclusions = none

# .NET diagnostic rules
dotnet_diagnostic.CA1062.severity = suggestion
dotnet_diagnostic.CA1305.severity = suggestion
dotnet_diagnostic.CA1307.severity = suggestion
dotnet_diagnostic.CA1822.severity = suggestion
dotnet_diagnostic.IDE0055.severity = warning
40 changes: 40 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
## Description
<!-- Provide a clear and concise description of what this PR does -->

## Type of Change
- [ ] 🐛 Bug fix (non-breaking change fixing an issue)
- [ ] ✨ New feature (non-breaking change adding functionality)
- [ ] 💥 Breaking change (fix or feature causing existing functionality to change)
- [ ] 📚 Documentation update
- [ ] ⚡ Performance improvement
- [ ] 🧹 Code refactoring
- [ ] ✅ Test improvements

## Checklist
- [ ] Code builds successfully (`dotnet build`)
- [ ] All tests pass (`dotnet test`)
- [ ] New tests added for new functionality
- [ ] Code follows [coding standards](../CONTRIBUTING.md#coding-standards)
- [ ] Commits follow [conventional commit format](../CONTRIBUTING.md#pr-title-format)
- [ ] Documentation updated (if needed)
- [ ] Native AOT compatibility verified
- [ ] No new TODOs added without corresponding GitHub issues
- [ ] Performance impact considered (run benchmarks if applicable)

## Related Issues
<!-- Link to related issues using keywords: Fixes #123, Closes #456, Relates to #789 -->

## Testing
<!-- Describe how you tested this change. Include test scenarios, edge cases, and any manual testing performed -->

## Performance Impact
<!-- If applicable, describe any performance implications -->
- [ ] No performance impact
- [ ] Performance improved (include benchmark results)
- [ ] Performance impact acceptable (explain why)

## Screenshots/Output
<!-- If applicable, add screenshots or console output showing the change -->

## Additional Notes
<!-- Any additional information reviewers should know -->
4 changes: 4 additions & 0 deletions .github/codeql/codeql-config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
name: "CodeQL Config"
disable-default-queries: true
queries:
- uses: security-and-quality
17 changes: 15 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ name: Skugga CI

on:
push:
branches: [ "master", "test", "feature/**" ]
branches: [ "master", "development", "test", "feature/**", "maintainance/**" ]
pull_request:
branches: [ "master", "test" ]
branches: [ "master", "development", "test" ]
workflow_dispatch:

jobs:
Expand Down Expand Up @@ -44,6 +44,12 @@ jobs:
- name: Restore Dependencies
run: dotnet restore Skugga.slnx

- name: Build Solution (Debug)
run: dotnet build Skugga.slnx /p:TreatWarningsAsErrors=false

- name: Check Formatting
run: dotnet format --verify-no-changes Skugga.slnx --no-restore

- name: Build Solution
run: |
dotnet build Skugga.slnx \
Expand All @@ -69,6 +75,13 @@ jobs:
name: test-results-${{ matrix.dotnet-version }}
path: "**/TestResults/**/*"

- name: Upload Coverage
if: always()
uses: actions/upload-artifact@v6
with:
name: code-coverage-${{ matrix.dotnet-version }}
path: "**/coverage.opencover.xml"

- name: Run Benchmarks (Smoke Test)
if: matrix.dotnet-version == '10.0.x'
run: |
Expand Down
46 changes: 46 additions & 0 deletions .github/workflows/codeql.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
name: "CodeQL"

on:
push:
branches: [ "master", "development", "maintainance/**" ]
pull_request:
branches: [ "master" ]
schedule:
- cron: '30 1 * * 1'

jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
permissions:
actions: read
contents: read
security-events: write

strategy:
fail-fast: false
matrix:
language: [ 'csharp' ]

steps:
- name: Checkout repository
uses: actions/checkout@v6

- name: Initialize CodeQL
uses: github/codeql-action/init@v4
with:
languages: ${{ matrix.language }}
config-file: ./.github/codeql/codeql-config.yml

- name: Setup .NET
uses: actions/setup-dotnet@v5
with:
dotnet-version: |
8.0.x
10.0.x

- name: Build
run: dotnet build Skugga.slnx

- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v4
14 changes: 12 additions & 2 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,14 @@ jobs:
echo "VERSION=$VERSION" >> $GITHUB_OUTPUT
echo "::notice::Publishing version $VERSION"

- name: Install CycloneDX
run: |
dotnet tool install --global CycloneDX
echo "$HOME/.dotnet/tools" >> $GITHUB_PATH

- name: Generate SBOM
run: dotnet-CycloneDX src/Skugga.Core/Skugga.Core.csproj -o nupkg -j -n Skugga -v ${{ steps.get_version.outputs.VERSION }}

- name: Restore Dependencies
run: dotnet restore Skugga.slnx

Expand Down Expand Up @@ -78,5 +86,7 @@ jobs:
if: always()
uses: actions/upload-artifact@v6
with:
name: nuget-package
path: nupkg/*.nupkg
name: release-artifacts
path: |
nupkg/*.nupkg
nupkg/bom.json
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
## files generated by popular Visual Studio add-ons.

# Project-specific files
ROADMAP.md

# Documentation drafts (never commit these)
docs/DOPPELGANGER_ROADMAP.md
Expand Down Expand Up @@ -442,3 +441,4 @@ artifacts/

# Private release documentation
RELEASE_GUIDE.md
*bak.png
34 changes: 32 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,35 @@ All notable changes to Skugga will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]
## [1.3.0] - 2026-01-07

### Added
- **Project Governance & Support**:
- Added `CODE_OF_CONDUCT.md` (Contributor Covenant v2.1)
- Added `SUPPORT.md` with clear support channels
- Added `.editorconfig` enforcing high-quality coding standards (aligned with Sannr)
- Added `docs/AOT_COMPATIBILITY_ANALYSIS.md` deeply analyzing AOT constraints and solutions
- **CI/CD & Security Enhancements**:
- Integrated **GitHub CodeQL** for automated security and quality analysis
- Integrated **CycloneDX SBOM** generation into release pipeline for supply chain security
- Added `IsAotCompatible` metadata to NuGet packages for SDK-level AOT verification
- Added automated **Source Formatting Validation** in CI pipeline
- Added **Code Coverage Artifacts** upload in CI for better visibility

### Changed
- **Build & Quality Standards**:
- Enabled rigorous code analysis (`AnalysisLevel=latest`, `EnforceCodeStyleInBuild=true`)
- Suppressed legacy technical debt warnings to allow incremental improvements
- Applied consistent formatting across the entire codebase
- Updated `GitVersion.yml` for v1.3.0 release
- **Samples & Demos**:
- Standardized all sample projects to use centralized package versions
- Verified runtime execution for all 7 major demo categories

### Fixed
- Resolved multiple `CA1310` (StringComparison) violations for better globalization support
- Aligned repository structure with Sannr enterprise standards
- Fixed build failures in test projects related to naming conventions and localization

## [1.2.0] - 2026-01-05

Expand Down Expand Up @@ -122,6 +150,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Minimal memory footprint
- Distroless container support

[Unreleased]: https://github.com/Digvijay/Skugga/compare/v1.1.0...HEAD
[Unreleased]: https://github.com/Digvijay/Skugga/compare/v1.3.0...HEAD
[1.3.0]: https://github.com/Digvijay/Skugga/compare/v1.2.0...v1.3.0
[1.2.0]: https://github.com/Digvijay/Skugga/compare/v1.1.0...v1.2.0
[1.1.0]: https://github.com/Digvijay/Skugga/compare/v1.0.0...v1.1.0
[1.0.0]: https://github.com/Digvijay/Skugga/releases/tag/v1.0.0
Loading
Loading