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
9 changes: 1 addition & 8 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,22 +13,15 @@ All notable changes to ANcpLua.Analyzers will be documented in this file.

### Added

- AL0107: Orphaned `[TracedTag]` on parameters of methods without `[Traced]` attribute
- AL0108: Redundant `[NoTrace]` on methods that are not interceptable
- AL0109: `[Traced]` on non-interceptable methods (non-partial, private, static non-partial)
- AL0110: `[TracedTag]` on `out`/`ref` parameters (cannot be captured for span attributes)
- Code fixes for AL0107, AL0108, AL0109, AL0110
- GitHub Actions workflow to remind about .NET 11 GA adoption on 2026-12-01
- Dependabot ignore rule for .NET 11 SDK previews/RCs

### Fixed

- README.md diagnostic count (102 → 106) and code fix count (38 → 42)
- README.md OpenTelemetry category count (19 → 23)
- README.md rule table missing AL0107-AL0110 rows
- NuGet package description out of sync with actual diagnostic/code fix counts
- Stale `nupkg/` directory (pre-UseArtifactsOutput artifact)

### Removed

- Telemetry-adjacent diagnostics and code fixes now homed in `ANcpLua.OpenTelemetry.SemanticConventions.Analyzers`: AL0013, AL0061, AL0063, AL0064, AL0065, AL0066, AL0067, AL0068, AL0069, AL0070, AL0071, AL0072, AL0073, AL0074, AL0075, AL0076, AL0077, AL0078, AL0079, AL0083, AL0085, AL0086, AL0088, AL0089, AL0090, AL0091, AL0092, AL0093, AL0096, AL0107, AL0108, AL0109, AL0110, AL0113, AL0124, AL0131, AL0135
- `verify-published-versions.ps1` — superseded by AL0017/AL0018/AL0019 compile-time enforcement
57 changes: 10 additions & 47 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

# ANcpLua.Analyzers

Roslyn analyzers for modern C# patterns, OpenTelemetry instrumentation, AOT safety, and ANcpLua ecosystem conventions.
Roslyn analyzers for modern C# patterns, AOT safety, ASP.NET Core, reliability, GenAI tool governance, and ANcpLua ecosystem conventions.

## Installation

Expand All @@ -16,27 +16,25 @@ dotnet add package ANcpLua.Analyzers

## What you get

- **127 diagnostics** spanning design, reliability, performance, OpenTelemetry, ASP.NET Core, AOT, and version management.
- **46 automatic code fixes** for high-confidence transformations.
- **88 diagnostics** spanning design, reliability, usage, Roslyn utilities, ASP.NET Core, AOT, threading, style, configuration, GenAI, and version management.
- **36 automatic code fixes** for high-confidence transformations.
- **CI-friendly enforcement** through `.editorconfig` severity configuration.

## Rule coverage by category

| Category | Rules |
|:---------|------:|
| OpenTelemetry | 24 |
| Roslyn Utilities | 24 |
| AOT Testing | 10 |
| Reliability | 10 |
| ASP.NET Core | 9 |
| GenAI | 9 |
| Reliability | 9 |
| Usage | 9 |
| Design | 7 |
| VersionManagement | 7 |
| Design | 6 |
| Threading | 6 |
| Configuration | 5 |
| Metrics | 5 |
| GenAI | 3 |
| Style | 3 |
| Configuration | 1 |

## Full rule catalog

Expand All @@ -52,7 +50,6 @@ dotnet add package ANcpLua.Analyzers
| [AL0008](https://ancplua.mintlify.app/analyzers/rules/AL0008) | Usage | Error | `Al0007ToAl0009IXmlSerializableAnalyzer` |
| [AL0009](https://ancplua.mintlify.app/analyzers/rules/AL0009) | Usage | Error | `Al0007ToAl0009IXmlSerializableAnalyzer` |
| [AL0011](https://ancplua.mintlify.app/analyzers/rules/AL0011) | Threading | Warning | `Al0011LockKeywordAnalyzer` |
| [AL0013](https://ancplua.mintlify.app/analyzers/rules/AL0013) | OpenTelemetry | Info | `Al0013MissingSchemaUrlAnalyzer` |
| [AL0014](https://ancplua.mintlify.app/analyzers/rules/AL0014) | Style | Warning | `Al0014PreferPatternMatchingAnalyzer` |
| [AL0015](https://ancplua.mintlify.app/analyzers/rules/AL0015) | Style | Info | `Al0015NormalizeNullGuardStyleAnalyzer` |
| [AL0016](https://ancplua.mintlify.app/analyzers/rules/AL0016) | Style | Info | `Al0016CombineDeclarationWithNullCheckAnalyzer` |
Expand All @@ -77,7 +74,6 @@ dotnet add package ANcpLua.Analyzers
| [AL0035](https://ancplua.mintlify.app/analyzers/rules/AL0035) | Roslyn Utilities | Info | `Al0035UseToDisplayStringExtensionsAnalyzer` |
| [AL0036](https://ancplua.mintlify.app/analyzers/rules/AL0036) | Roslyn Utilities | Warning | `Al0036UseGuardNotNullAnalyzer` |
| [AL0037](https://ancplua.mintlify.app/analyzers/rules/AL0037) | Roslyn Utilities | Warning | `Al0037UseTryParseExtensionsAnalyzer` |
| [AL0038](https://ancplua.mintlify.app/analyzers/rules/AL0038) | Roslyn Utilities | Warning | `Al0038UseGetOrNullAnalyzer` |
| [AL0039](https://ancplua.mintlify.app/analyzers/rules/AL0039) | Roslyn Utilities | Warning | `Al0039UseStringComparisonExtensionsAnalyzer` |
| [AL0040](https://ancplua.mintlify.app/analyzers/rules/AL0040) | Roslyn Utilities | Warning | `Al0040UseAttributeExtensionsAnalyzer` |
| [AL0041](https://ancplua.mintlify.app/analyzers/rules/AL0041) | AOT Testing | Error | `Al0041AotTestMustReturnIntAnalyzer` |
Expand All @@ -100,53 +96,20 @@ dotnet add package ANcpLua.Analyzers
| [AL0058](https://ancplua.mintlify.app/analyzers/rules/AL0058) | Threading | Warning | `Al0057ToAl0060ThreadingAnalyzer` |
| [AL0059](https://ancplua.mintlify.app/analyzers/rules/AL0059) | Threading | Warning | `Al0057ToAl0060ThreadingAnalyzer` |
| [AL0060](https://ancplua.mintlify.app/analyzers/rules/AL0060) | Threading | Warning | `Al0057ToAl0060ThreadingAnalyzer` |
| [AL0061](https://ancplua.mintlify.app/analyzers/rules/AL0061) | OpenTelemetry | Warning | `Al0061ActivityMissingSemconvAnalyzer` |
| [AL0063](https://ancplua.mintlify.app/analyzers/rules/AL0063) | OpenTelemetry | Warning | `Al0063UnregisteredActivitySourceAnalyzer` |
| [AL0064](https://ancplua.mintlify.app/analyzers/rules/AL0064) | GenAI | Warning | `Al0064GenAiMissingRequiredAttributesAnalyzer` |
| [AL0065](https://ancplua.mintlify.app/analyzers/rules/AL0065) | GenAI | Warning | `Al0065UseTokenUsageHistogramAnalyzer` |
| [AL0066](https://ancplua.mintlify.app/analyzers/rules/AL0066) | GenAI | Warning | `Al0066InvalidGenAiOperationNameAnalyzer` |
| [AL0067](https://ancplua.mintlify.app/analyzers/rules/AL0067) | Metrics | Warning | `Al0067UnregisteredMeterAnalyzer` |
| [AL0068](https://ancplua.mintlify.app/analyzers/rules/AL0068) | Metrics | Warning | `Al0068InvalidMetricNameAnalyzer` |
| [AL0069](https://ancplua.mintlify.app/analyzers/rules/AL0069) | Configuration | Warning | `Al0069IncompleteServiceDefaultsAnalyzer` |
| [AL0070](https://ancplua.mintlify.app/analyzers/rules/AL0070) | Configuration | Warning | `Al0070NonOtlpCollectorEndpointAnalyzer` |
| [AL0071](https://ancplua.mintlify.app/analyzers/rules/AL0071) | Metrics | Error | `Al0071MeterClassMustBePartialStaticAnalyzer` |
| [AL0072](https://ancplua.mintlify.app/analyzers/rules/AL0072) | Metrics | Error | `Al0072MetricMethodMustBePartialAnalyzer` |
| [AL0073](https://ancplua.mintlify.app/analyzers/rules/AL0073) | OpenTelemetry | Error | `Al0073TracedActivitySourceNameAnalyzer` |
| [AL0074](https://ancplua.mintlify.app/analyzers/rules/AL0074) | GenAI | Warning | `Al0074DeprecatedGenAiAttributeAnalyzer` |
| [AL0075](https://ancplua.mintlify.app/analyzers/rules/AL0075) | Metrics | Warning | `Al0075HighCardinalityMetricTagAnalyzer` |
| [AL0076](https://ancplua.mintlify.app/analyzers/rules/AL0076) | OpenTelemetry | Warning | `Al0076MissingOTelConfigurationAnalyzer` |
| [AL0077](https://ancplua.mintlify.app/analyzers/rules/AL0077) | OpenTelemetry | Warning | `Al0077DuplicateInstrumentationAnalyzer` |
| [AL0078](https://ancplua.mintlify.app/analyzers/rules/AL0078) | OpenTelemetry | Error | `Al0078InvalidActivitySourceNameAnalyzer` |
| [AL0079](https://ancplua.mintlify.app/analyzers/rules/AL0079) | OpenTelemetry | Info | `Al0079ManualSpanRecommendedAnalyzer` |
| [AL0080](https://ancplua.mintlify.app/analyzers/rules/AL0080) | ASP.NET Core | Warning | `Al0080MissingResilienceConfigurationAnalyzer` |
| [AL0081](https://ancplua.mintlify.app/analyzers/rules/AL0081) | ASP.NET Core | Warning | `Al0081MissingHealthChecksAnalyzer` |
| [AL0082](https://ancplua.mintlify.app/analyzers/rules/AL0082) | Configuration | Info | `Al0082ConsiderConnectionStringAnalyzer` |
| [AL0083](https://ancplua.mintlify.app/analyzers/rules/AL0083) | Configuration | Warning | `Al0083InsecureEndpointAnalyzer` |
| [AL0084](https://ancplua.mintlify.app/analyzers/rules/AL0084) | ASP.NET Core | Warning | `Al0084MissingServiceDiscoveryAnalyzer` |
| [AL0085](https://ancplua.mintlify.app/analyzers/rules/AL0085) | OpenTelemetry | Error | `Al0085InvalidAttributeValueAnalyzer` |
| [AL0086](https://ancplua.mintlify.app/analyzers/rules/AL0086) | OpenTelemetry | Warning | `Al0086IncorrectAttributeTypeAnalyzer` |
| [AL0088](https://ancplua.mintlify.app/analyzers/rules/AL0088) | OpenTelemetry | Warning | `Al0088SensitiveDataInAttributeAnalyzer` |
| [AL0089](https://ancplua.mintlify.app/analyzers/rules/AL0089) | OpenTelemetry | Warning | `Al0089MissingOtlpConfigurationAnalyzer` |
| [AL0090](https://ancplua.mintlify.app/analyzers/rules/AL0090) | OpenTelemetry | Warning | `Al0090UncompressedExportAnalyzer` |
| [AL0091](https://ancplua.mintlify.app/analyzers/rules/AL0091) | OpenTelemetry | Warning | `Al0091BatchExportDisabledAnalyzer` |
| [AL0092](https://ancplua.mintlify.app/analyzers/rules/AL0092) | OpenTelemetry | Info | `Al0092ConsiderSamplingAnalyzer` |
| [AL0093](https://ancplua.mintlify.app/analyzers/rules/AL0093) | OpenTelemetry | Warning | `Al0093MissingResourceAttributesAnalyzer` |
| [AL0094](https://ancplua.mintlify.app/analyzers/rules/AL0094) | AOT Testing | Warning | `Al0094AvoidDynamicKeywordAnalyzer` |
| [AL0095](https://ancplua.mintlify.app/analyzers/rules/AL0095) | AOT Testing | Warning | `Al0095AvoidExpressionCompileAnalyzer` |
| [AL0096](https://ancplua.mintlify.app/analyzers/rules/AL0096) | Configuration | Warning | `Al0096EnableEventSourceSupportAnalyzer` |
| [AL0101](https://ancplua.mintlify.app/analyzers/rules/AL0101) | AOT Testing | Warning | `Al0101AvoidActivatorCreateInstanceAnalyzer` |
| [AL0102](https://ancplua.mintlify.app/analyzers/rules/AL0102) | AOT Testing | Warning | `Al0102AvoidTypeGetTypeAnalyzer` |
| [AL0103](https://ancplua.mintlify.app/analyzers/rules/AL0103) | Design | Warning | `Al0103ClosedTypeHierarchySwitchAnalyzer` |
| [AL0104](https://ancplua.mintlify.app/analyzers/rules/AL0104) | Reliability | Warning | `Al0104PreferAwaitUsingAnalyzer` |
| [AL0105](https://ancplua.mintlify.app/analyzers/rules/AL0105) | Threading | Warning | `Al0105AvoidBlockingCallsInAsyncAnalyzer` |
| [AL0106](https://ancplua.mintlify.app/analyzers/rules/AL0106) | ASP.NET Core | Warning | `Al0106AvoidTaskRunInAspNetCoreAnalyzer` |
| [AL0107](https://ancplua.mintlify.app/analyzers/rules/AL0107) | OpenTelemetry | Warning | `Al0107OrphanedTracedTagAnalyzer` |
| [AL0108](https://ancplua.mintlify.app/analyzers/rules/AL0108) | OpenTelemetry | Info | `Al0108RedundantNoTraceAnalyzer` |
| [AL0109](https://ancplua.mintlify.app/analyzers/rules/AL0109) | OpenTelemetry | Warning | `Al0109NonInterceptableTracedAnalyzer` |
| [AL0110](https://ancplua.mintlify.app/analyzers/rules/AL0110) | OpenTelemetry | Error | `Al0110TracedTagOnOutRefParameterAnalyzer` |
| [AL0111](https://ancplua.mintlify.app/analyzers/rules/AL0111) | Reliability | Warning | `Al0111SqlInterpolationInCommandTextAnalyzer` |
| [AL0112](https://ancplua.mintlify.app/analyzers/rules/AL0112) | Reliability | Warning | `Al0112FireAndForgetTaskAnalyzer` |
| [AL0113](https://ancplua.mintlify.app/analyzers/rules/AL0113) | OpenTelemetry | Warning | `Al0113MissingExceptionRecordingOnActivityAnalyzer` |
| [AL0114](https://ancplua.mintlify.app/analyzers/rules/AL0114) | Reliability | Warning | `Al0114PreferTryParseAnalyzer` |
| [AL0115](https://ancplua.mintlify.app/analyzers/rules/AL0115) | Reliability | Warning | `Al0115EmptyCatchBlockAnalyzer` |
| [AL0116](https://ancplua.mintlify.app/analyzers/rules/AL0116) | Reliability | Warning | `Al0116ExceptionLeakedInResponseAnalyzer` |
Expand All @@ -157,22 +120,22 @@ dotnet add package ANcpLua.Analyzers
| [AL0121](https://ancplua.mintlify.app/analyzers/rules/AL0121) | Roslyn Utilities | Warning | `Al0121NormalizeWhitespaceAnalyzer` |
| [AL0122](https://ancplua.mintlify.app/analyzers/rules/AL0122) | Design | Error | `Al0122DuckDbTableMustBePartialAnalyzer` |
| [AL0123](https://ancplua.mintlify.app/analyzers/rules/AL0123) | Design | Warning | `Al0123DuckDbColumnConflictingOrdinalAnalyzer` |
| [AL0124](https://ancplua.mintlify.app/analyzers/rules/AL0124) | GenAI | Warning | `Al0124NonInterceptableAgentTracedAnalyzer` |
| [AL0125](https://ancplua.mintlify.app/analyzers/rules/AL0125) | Roslyn Utilities | Info | `Al0125UseStringComparisonAnyExtensionsAnalyzer` |
| [AL0126](https://ancplua.mintlify.app/analyzers/rules/AL0126) | Reliability | Info | `Al0126CancellationTokenPropagationAnalyzer` |
| [AL0127](https://ancplua.mintlify.app/analyzers/rules/AL0127) | VersionManagement | Warning | `Al0127OutdatedMafPackageVersionAnalyzer` |
| [AL0128](https://ancplua.mintlify.app/analyzers/rules/AL0128) | GenAI | Warning | `Al0128DestructiveToolMustRequireApprovalAnalyzer` |
| [AL0129](https://ancplua.mintlify.app/analyzers/rules/AL0129) | GenAI | Info | `Al0129ToolMustDeclareSideEffectAnalyzer` |
| [AL0130](https://ancplua.mintlify.app/analyzers/rules/AL0130) | GenAI | Info | `Al0130ToolMustDeclareCapabilityAnalyzer` |
| [AL0131](https://ancplua.mintlify.app/analyzers/rules/AL0131) | GenAI | Warning | `Al0131DirectGenAiSdkUsageAnalyzer` |
| [AL0137](https://ancplua.mintlify.app/analyzers/rules/AL0137) | Roslyn Utilities | Warning | `Al0137UseGuardForThrowIfAnalyzer` |
| [AL0138](https://ancplua.mintlify.app/analyzers/rules/AL0138) | Reliability | Warning | `Al0138UseExplicitMidpointRoundingAnalyzer` |

**Legend:** `Error` = build error, `Warning` = build warning, `Info` = IDE suggestion, `Disabled` = off by default.

## Code fixes

Automatic fixes are currently available for:

AL0002, AL0004, AL0005, AL0008, AL0011, AL0014, AL0015, AL0016, AL0025, AL0026, AL0027, AL0028, AL0029, AL0030, AL0031, AL0032, AL0033, AL0034, AL0035, AL0036, AL0037, AL0038, AL0039, AL0040, AL0045, AL0046, AL0047, AL0048, AL0049, AL0050, AL0051, AL0071, AL0072, AL0073, AL0074, AL0103, AL0107, AL0108, AL0109, AL0110, AL0121, AL0122, AL0124, AL0126
AL0002, AL0004, AL0005, AL0008, AL0011, AL0014, AL0015, AL0016, AL0025, AL0026, AL0027, AL0028, AL0029, AL0030, AL0031, AL0032, AL0033, AL0034, AL0035, AL0036, AL0037, AL0039, AL0040, AL0045, AL0046, AL0047, AL0048, AL0049, AL0050, AL0051, AL0103, AL0121, AL0122, AL0126, AL0137, AL0138

## Configuration

Expand Down

This file was deleted.

Loading
Loading