@sun-asterisk/sunlint 1.3.39 → 1.3.40

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (422) hide show
  1. package/config/rules/rules-registry-generated.json +134 -108
  2. package/docs/GENERATED_FILES_QUICK_REFERENCE.md +96 -0
  3. package/docs/GENERATED_FILE_HANDLING_SUMMARY.md +152 -0
  4. package/docs/skills/CREATE_NEW_DART_RULE.md +161 -14
  5. package/origin-rules/dart-en.md +151 -163
  6. package/package.json +2 -1
  7. package/rules/dart/D002_dispose_resources/config.json +25 -0
  8. package/rules/dart/D003_prefer_widgets_over_methods/config.json +14 -0
  9. package/rules/dart/D004_avoid_shrinkwrap_listview/config.json +13 -0
  10. package/rules/dart/D005_limit_widget_nesting/config.json +13 -0
  11. package/rules/dart/D006_prefer_extracting_large_callbacks/config.json +25 -0
  12. package/rules/dart/D007_prefer_init_first_dispose_last/config.json +10 -0
  13. package/rules/dart/D008_avoid_long_functions/config.json +12 -0
  14. package/rules/dart/D009_limit_function_parameters/config.json +13 -0
  15. package/rules/dart/D010_limit_cyclomatic_complexity/config.json +12 -0
  16. package/rules/dart/D011_prefer_named_parameters/config.json +12 -0
  17. package/rules/dart/D012_prefer_named_boolean_parameters/config.json +9 -0
  18. package/rules/dart/D013_single_public_class/config.json +10 -0
  19. package/rules/dart/D014_unsafe_collection_access/config.json +10 -0
  20. package/rules/dart/D015_copywith_all_parameters/config.json +9 -0
  21. package/rules/dart/D016_project_should_have_tests/config.json +24 -0
  22. package/rules/dart/D017_pubspec_dependencies_review/config.json +23 -0
  23. package/rules/dart/D018_remove_commented_code/config.json +13 -0
  24. package/rules/dart/D019_avoid_single_child_multi_child_widget/config.json +21 -0
  25. package/rules/dart/D020_limit_if_else_branches/config.json +12 -0
  26. package/rules/dart/D021_avoid_negated_boolean_checks/config.json +14 -0
  27. package/rules/dart/D022_use_setstate_correctly/config.json +14 -0
  28. package/rules/dart/D023_avoid_unnecessary_method_overrides/config.json +13 -0
  29. package/rules/dart/D024_avoid_unnecessary_stateful_widget/config.json +9 -0
  30. package/rules/dart/D025_avoid_nested_conditional_expressions/config.json +9 -0
  31. package/skill-assets/sunlint-code-quality/AGENTS.md +80 -0
  32. package/skill-assets/sunlint-code-quality/SKILL.md +176 -0
  33. package/skill-assets/sunlint-code-quality/rules/csharp/C006-verb-noun-functions.md +36 -0
  34. package/skill-assets/sunlint-code-quality/rules/csharp/C013-no-dead-code.md +38 -0
  35. package/skill-assets/sunlint-code-quality/rules/csharp/C014-dependency-injection.md +45 -0
  36. package/skill-assets/sunlint-code-quality/rules/csharp/C017-no-constructor-logic.md +46 -0
  37. package/skill-assets/sunlint-code-quality/rules/csharp/C018-generic-errors.md +38 -0
  38. package/skill-assets/sunlint-code-quality/rules/csharp/C019-error-log-level.md +29 -0
  39. package/skill-assets/sunlint-code-quality/rules/csharp/C020-no-unused-imports.md +30 -0
  40. package/skill-assets/sunlint-code-quality/rules/csharp/C022-no-unused-variables.md +33 -0
  41. package/skill-assets/sunlint-code-quality/rules/csharp/C023-no-duplicate-names.md +36 -0
  42. package/skill-assets/sunlint-code-quality/rules/csharp/C024-centralize-constants.md +33 -0
  43. package/skill-assets/sunlint-code-quality/rules/csharp/C029-catch-log-root-cause.md +40 -0
  44. package/skill-assets/sunlint-code-quality/rules/csharp/C030-custom-error-classes.md +38 -0
  45. package/skill-assets/sunlint-code-quality/rules/csharp/C033-separate-data-access.md +53 -0
  46. package/skill-assets/sunlint-code-quality/rules/csharp/C035-error-context-logging.md +31 -0
  47. package/skill-assets/sunlint-code-quality/rules/csharp/C041-no-hardcoded-secrets.md +25 -0
  48. package/skill-assets/sunlint-code-quality/rules/csharp/C042-boolean-naming.md +27 -0
  49. package/skill-assets/sunlint-code-quality/rules/csharp/C052-controller-parsing.md +41 -0
  50. package/skill-assets/sunlint-code-quality/rules/csharp/C060-superclass-logic.md +33 -0
  51. package/skill-assets/sunlint-code-quality/rules/csharp/C067-no-hardcoded-config.md +24 -0
  52. package/skill-assets/sunlint-code-quality/rules/csharp/S003-open-redirect.md +47 -0
  53. package/skill-assets/sunlint-code-quality/rules/csharp/S004-no-log-credentials.md +28 -0
  54. package/skill-assets/sunlint-code-quality/rules/csharp/S005-server-authorization.md +51 -0
  55. package/skill-assets/sunlint-code-quality/rules/csharp/S006-default-credentials.md +42 -0
  56. package/skill-assets/sunlint-code-quality/rules/csharp/S007-output-encoding.md +36 -0
  57. package/skill-assets/sunlint-code-quality/rules/csharp/S009-approved-crypto.md +37 -0
  58. package/skill-assets/sunlint-code-quality/rules/csharp/S010-csprng.md +32 -0
  59. package/skill-assets/sunlint-code-quality/rules/csharp/S011-encrypted-client-hello.md +36 -0
  60. package/skill-assets/sunlint-code-quality/rules/csharp/S012-secrets-management.md +35 -0
  61. package/skill-assets/sunlint-code-quality/rules/csharp/S013-tls-connections.md +36 -0
  62. package/skill-assets/sunlint-code-quality/rules/csharp/S016-no-sensitive-query-string.md +39 -0
  63. package/skill-assets/sunlint-code-quality/rules/csharp/S017-parameterized-queries.md +47 -0
  64. package/skill-assets/sunlint-code-quality/rules/csharp/S019-email-input-sanitization.md +35 -0
  65. package/skill-assets/sunlint-code-quality/rules/csharp/S020-eval-code-execution.md +56 -0
  66. package/skill-assets/sunlint-code-quality/rules/csharp/S022-context-escaping.md +50 -0
  67. package/skill-assets/sunlint-code-quality/rules/csharp/S023-dynamic-js-encoding.md +34 -0
  68. package/skill-assets/sunlint-code-quality/rules/csharp/S025-server-validation.md +56 -0
  69. package/skill-assets/sunlint-code-quality/rules/csharp/S026-tls-encryption.md +28 -0
  70. package/skill-assets/sunlint-code-quality/rules/csharp/S027-mtls-validation.md +40 -0
  71. package/skill-assets/sunlint-code-quality/rules/csharp/S028-upload-limits.md +50 -0
  72. package/skill-assets/sunlint-code-quality/rules/csharp/S029-csrf-protection.md +42 -0
  73. package/skill-assets/sunlint-code-quality/rules/csharp/S030-directory-browsing.md +26 -0
  74. package/skill-assets/sunlint-code-quality/rules/csharp/S031-secure-cookie-flag.md +35 -0
  75. package/skill-assets/sunlint-code-quality/rules/csharp/S032-httponly-cookie.md +31 -0
  76. package/skill-assets/sunlint-code-quality/rules/csharp/S033-samesite-cookie.md +36 -0
  77. package/skill-assets/sunlint-code-quality/rules/csharp/S034-host-prefix-cookie.md +31 -0
  78. package/skill-assets/sunlint-code-quality/rules/csharp/S035-app-hostnames.md +26 -0
  79. package/skill-assets/sunlint-code-quality/rules/csharp/S036-internal-file-paths.md +36 -0
  80. package/skill-assets/sunlint-code-quality/rules/csharp/S037-anti-cache-headers.md +33 -0
  81. package/skill-assets/sunlint-code-quality/rules/csharp/S039-tls-certificate-validation.md +41 -0
  82. package/skill-assets/sunlint-code-quality/rules/csharp/S041-logout-invalidation.md +36 -0
  83. package/skill-assets/sunlint-code-quality/rules/csharp/S042-long-lived-sessions.md +47 -0
  84. package/skill-assets/sunlint-code-quality/rules/csharp/S044-critical-changes-reauth.md +45 -0
  85. package/skill-assets/sunlint-code-quality/rules/csharp/S045-brute-force-protection.md +48 -0
  86. package/skill-assets/sunlint-code-quality/rules/csharp/S047-oauth-csrf-protection.md +53 -0
  87. package/skill-assets/sunlint-code-quality/rules/csharp/S048-oauth-redirect-validation.md +37 -0
  88. package/skill-assets/sunlint-code-quality/rules/csharp/S049-auth-code-expiry.md +33 -0
  89. package/skill-assets/sunlint-code-quality/rules/csharp/S050-token-entropy.md +33 -0
  90. package/skill-assets/sunlint-code-quality/rules/csharp/S051-password-length.md +35 -0
  91. package/skill-assets/sunlint-code-quality/rules/csharp/S052-otp-entropy.md +26 -0
  92. package/skill-assets/sunlint-code-quality/rules/csharp/S053-generic-error-messages.md +32 -0
  93. package/skill-assets/sunlint-code-quality/rules/csharp/S054-no-default-admin.md +31 -0
  94. package/skill-assets/sunlint-code-quality/rules/csharp/S055-content-type-validation.md +44 -0
  95. package/skill-assets/sunlint-code-quality/rules/csharp/S056-log-injection.md +33 -0
  96. package/skill-assets/sunlint-code-quality/rules/csharp/S057-synchronized-time.md +27 -0
  97. package/skill-assets/sunlint-code-quality/rules/csharp/S058-ssrf-protection.md +54 -0
  98. package/skill-assets/sunlint-code-quality/rules/java/C006-verb-noun-functions.md +36 -0
  99. package/skill-assets/sunlint-code-quality/rules/java/C013-no-dead-code.md +175 -0
  100. package/skill-assets/sunlint-code-quality/rules/java/C014-dependency-injection.md +42 -0
  101. package/skill-assets/sunlint-code-quality/rules/java/C017-no-constructor-logic.md +39 -0
  102. package/skill-assets/sunlint-code-quality/rules/java/C018-generic-errors.md +28 -0
  103. package/skill-assets/sunlint-code-quality/rules/java/C019-error-log-level.md +34 -0
  104. package/skill-assets/sunlint-code-quality/rules/java/C020-no-unused-imports.md +34 -0
  105. package/skill-assets/sunlint-code-quality/rules/java/C022-no-unused-variables.md +31 -0
  106. package/skill-assets/sunlint-code-quality/rules/java/C023-no-duplicate-names.md +37 -0
  107. package/skill-assets/sunlint-code-quality/rules/java/C024-centralize-constants.md +36 -0
  108. package/skill-assets/sunlint-code-quality/rules/java/C029-catch-log-root-cause.md +42 -0
  109. package/skill-assets/sunlint-code-quality/rules/java/C030-custom-error-classes.md +50 -0
  110. package/skill-assets/sunlint-code-quality/rules/java/C033-separate-data-access.md +46 -0
  111. package/skill-assets/sunlint-code-quality/rules/java/C035-error-context-logging.md +38 -0
  112. package/skill-assets/sunlint-code-quality/rules/java/C041-no-hardcoded-secrets.md +34 -0
  113. package/skill-assets/sunlint-code-quality/rules/java/C042-boolean-naming.md +27 -0
  114. package/skill-assets/sunlint-code-quality/rules/java/C052-controller-parsing.md +39 -0
  115. package/skill-assets/sunlint-code-quality/rules/java/C060-superclass-logic.md +32 -0
  116. package/skill-assets/sunlint-code-quality/rules/java/C067-no-hardcoded-config.md +31 -0
  117. package/skill-assets/sunlint-code-quality/rules/java/S003-open-redirect.md +38 -0
  118. package/skill-assets/sunlint-code-quality/rules/java/S004-no-log-credentials.md +36 -0
  119. package/skill-assets/sunlint-code-quality/rules/java/S005-server-authorization.md +53 -0
  120. package/skill-assets/sunlint-code-quality/rules/java/S006-default-credentials.md +39 -0
  121. package/skill-assets/sunlint-code-quality/rules/java/S007-output-encoding.md +49 -0
  122. package/skill-assets/sunlint-code-quality/rules/java/S009-approved-crypto.md +40 -0
  123. package/skill-assets/sunlint-code-quality/rules/java/S010-csprng.md +36 -0
  124. package/skill-assets/sunlint-code-quality/rules/java/S011-encrypted-client-hello.md +27 -0
  125. package/skill-assets/sunlint-code-quality/rules/java/S012-secrets-management.md +34 -0
  126. package/skill-assets/sunlint-code-quality/rules/java/S013-tls-connections.md +40 -0
  127. package/skill-assets/sunlint-code-quality/rules/java/S016-no-sensitive-query-string.md +36 -0
  128. package/skill-assets/sunlint-code-quality/rules/java/S017-parameterized-queries.md +47 -0
  129. package/skill-assets/sunlint-code-quality/rules/java/S019-email-input-sanitization.md +32 -0
  130. package/skill-assets/sunlint-code-quality/rules/java/S020-eval-code-execution.md +45 -0
  131. package/skill-assets/sunlint-code-quality/rules/java/S022-context-escaping.md +28 -0
  132. package/skill-assets/sunlint-code-quality/rules/java/S023-dynamic-js-encoding.md +28 -0
  133. package/skill-assets/sunlint-code-quality/rules/java/S025-server-validation.md +58 -0
  134. package/skill-assets/sunlint-code-quality/rules/java/S026-tls-encryption.md +57 -0
  135. package/skill-assets/sunlint-code-quality/rules/java/S027-mtls-validation.md +26 -0
  136. package/skill-assets/sunlint-code-quality/rules/java/S028-upload-limits.md +35 -0
  137. package/skill-assets/sunlint-code-quality/rules/java/S029-csrf-protection.md +35 -0
  138. package/skill-assets/sunlint-code-quality/rules/java/S030-directory-browsing.md +38 -0
  139. package/skill-assets/sunlint-code-quality/rules/java/S031-secure-cookie-flag.md +38 -0
  140. package/skill-assets/sunlint-code-quality/rules/java/S032-httponly-cookie.md +31 -0
  141. package/skill-assets/sunlint-code-quality/rules/java/S033-samesite-cookie.md +42 -0
  142. package/skill-assets/sunlint-code-quality/rules/java/S034-host-prefix-cookie.md +35 -0
  143. package/skill-assets/sunlint-code-quality/rules/java/S035-app-hostnames.md +23 -0
  144. package/skill-assets/sunlint-code-quality/rules/java/S036-internal-file-paths.md +39 -0
  145. package/skill-assets/sunlint-code-quality/rules/java/S037-anti-cache-headers.md +37 -0
  146. package/skill-assets/sunlint-code-quality/rules/java/S039-tls-certificate-validation.md +43 -0
  147. package/skill-assets/sunlint-code-quality/rules/java/S041-logout-invalidation.md +53 -0
  148. package/skill-assets/sunlint-code-quality/rules/java/S042-long-lived-sessions.md +36 -0
  149. package/skill-assets/sunlint-code-quality/rules/java/S044-critical-changes-reauth.md +28 -0
  150. package/skill-assets/sunlint-code-quality/rules/java/S045-brute-force-protection.md +38 -0
  151. package/skill-assets/sunlint-code-quality/rules/java/S047-oauth-csrf-protection.md +33 -0
  152. package/skill-assets/sunlint-code-quality/rules/java/S048-oauth-redirect-validation.md +25 -0
  153. package/skill-assets/sunlint-code-quality/rules/java/S049-auth-code-expiry.md +23 -0
  154. package/skill-assets/sunlint-code-quality/rules/java/S050-token-entropy.md +20 -0
  155. package/skill-assets/sunlint-code-quality/rules/java/S051-password-length.md +20 -0
  156. package/skill-assets/sunlint-code-quality/rules/java/S052-otp-entropy.md +23 -0
  157. package/skill-assets/sunlint-code-quality/rules/java/S053-generic-error-messages.md +21 -0
  158. package/skill-assets/sunlint-code-quality/rules/java/S054-no-default-admin.md +16 -0
  159. package/skill-assets/sunlint-code-quality/rules/java/S055-content-type-validation.md +36 -0
  160. package/skill-assets/sunlint-code-quality/rules/java/S056-log-injection.md +38 -0
  161. package/skill-assets/sunlint-code-quality/rules/java/S057-synchronized-time.md +35 -0
  162. package/skill-assets/sunlint-code-quality/rules/java/S058-ssrf-protection.md +56 -0
  163. package/skill-assets/sunlint-code-quality/rules/kotlin/C006-verb-noun-functions.md +45 -0
  164. package/skill-assets/sunlint-code-quality/rules/kotlin/C013-no-dead-code.md +49 -0
  165. package/skill-assets/sunlint-code-quality/rules/kotlin/C014-dependency-injection.md +64 -0
  166. package/skill-assets/sunlint-code-quality/rules/kotlin/C017-no-constructor-logic.md +68 -0
  167. package/skill-assets/sunlint-code-quality/rules/kotlin/C018-generic-errors.md +46 -0
  168. package/skill-assets/sunlint-code-quality/rules/kotlin/C019-error-log-level.md +50 -0
  169. package/skill-assets/sunlint-code-quality/rules/kotlin/C020-no-unused-imports.md +44 -0
  170. package/skill-assets/sunlint-code-quality/rules/kotlin/C022-no-unused-variables.md +39 -0
  171. package/skill-assets/sunlint-code-quality/rules/kotlin/C023-no-duplicate-names.md +47 -0
  172. package/skill-assets/sunlint-code-quality/rules/kotlin/C024-centralize-constants.md +58 -0
  173. package/skill-assets/sunlint-code-quality/rules/kotlin/C029-catch-log-root-cause.md +50 -0
  174. package/skill-assets/sunlint-code-quality/rules/kotlin/C030-custom-error-classes.md +72 -0
  175. package/skill-assets/sunlint-code-quality/rules/kotlin/C033-separate-data-access.md +69 -0
  176. package/skill-assets/sunlint-code-quality/rules/kotlin/C035-error-context-logging.md +47 -0
  177. package/skill-assets/sunlint-code-quality/rules/kotlin/C041-no-hardcoded-secrets.md +47 -0
  178. package/skill-assets/sunlint-code-quality/rules/kotlin/C042-boolean-naming.md +42 -0
  179. package/skill-assets/sunlint-code-quality/rules/kotlin/C052-controller-parsing.md +71 -0
  180. package/skill-assets/sunlint-code-quality/rules/kotlin/C060-superclass-logic.md +60 -0
  181. package/skill-assets/sunlint-code-quality/rules/kotlin/C067-no-hardcoded-config.md +51 -0
  182. package/skill-assets/sunlint-code-quality/rules/kotlin/S003-open-redirect.md +66 -0
  183. package/skill-assets/sunlint-code-quality/rules/kotlin/S004-no-log-credentials.md +59 -0
  184. package/skill-assets/sunlint-code-quality/rules/kotlin/S005-server-authorization.md +75 -0
  185. package/skill-assets/sunlint-code-quality/rules/kotlin/S006-default-credentials.md +49 -0
  186. package/skill-assets/sunlint-code-quality/rules/kotlin/S007-output-encoding.md +62 -0
  187. package/skill-assets/sunlint-code-quality/rules/kotlin/S009-approved-crypto.md +51 -0
  188. package/skill-assets/sunlint-code-quality/rules/kotlin/S010-csprng.md +61 -0
  189. package/skill-assets/sunlint-code-quality/rules/kotlin/S011-encrypted-client-hello.md +48 -0
  190. package/skill-assets/sunlint-code-quality/rules/kotlin/S012-secrets-management.md +53 -0
  191. package/skill-assets/sunlint-code-quality/rules/kotlin/S013-tls-connections.md +61 -0
  192. package/skill-assets/sunlint-code-quality/rules/kotlin/S016-no-sensitive-query-string.md +51 -0
  193. package/skill-assets/sunlint-code-quality/rules/kotlin/S017-parameterized-queries.md +41 -0
  194. package/skill-assets/sunlint-code-quality/rules/kotlin/S019-email-input-sanitization.md +50 -0
  195. package/skill-assets/sunlint-code-quality/rules/kotlin/S020-eval-code-execution.md +57 -0
  196. package/skill-assets/sunlint-code-quality/rules/kotlin/S022-context-escaping.md +58 -0
  197. package/skill-assets/sunlint-code-quality/rules/kotlin/S023-dynamic-js-encoding.md +57 -0
  198. package/skill-assets/sunlint-code-quality/rules/kotlin/S025-server-validation.md +59 -0
  199. package/skill-assets/sunlint-code-quality/rules/kotlin/S026-tls-encryption.md +50 -0
  200. package/skill-assets/sunlint-code-quality/rules/kotlin/S027-mtls-validation.md +60 -0
  201. package/skill-assets/sunlint-code-quality/rules/kotlin/S028-upload-limits.md +67 -0
  202. package/skill-assets/sunlint-code-quality/rules/kotlin/S029-csrf-protection.md +57 -0
  203. package/skill-assets/sunlint-code-quality/rules/kotlin/S030-directory-browsing.md +50 -0
  204. package/skill-assets/sunlint-code-quality/rules/kotlin/S031-secure-cookie-flag.md +51 -0
  205. package/skill-assets/sunlint-code-quality/rules/kotlin/S032-httponly-cookie.md +49 -0
  206. package/skill-assets/sunlint-code-quality/rules/kotlin/S033-samesite-cookie.md +54 -0
  207. package/skill-assets/sunlint-code-quality/rules/kotlin/S034-host-prefix-cookie.md +50 -0
  208. package/skill-assets/sunlint-code-quality/rules/kotlin/S035-app-hostnames.md +59 -0
  209. package/skill-assets/sunlint-code-quality/rules/kotlin/S036-internal-file-paths.md +61 -0
  210. package/skill-assets/sunlint-code-quality/rules/kotlin/S037-anti-cache-headers.md +58 -0
  211. package/skill-assets/sunlint-code-quality/rules/kotlin/S039-tls-certificate-validation.md +62 -0
  212. package/skill-assets/sunlint-code-quality/rules/kotlin/S041-logout-invalidation.md +71 -0
  213. package/skill-assets/sunlint-code-quality/rules/kotlin/S042-long-lived-sessions.md +57 -0
  214. package/skill-assets/sunlint-code-quality/rules/kotlin/S044-critical-changes-reauth.md +64 -0
  215. package/skill-assets/sunlint-code-quality/rules/kotlin/S045-brute-force-protection.md +64 -0
  216. package/skill-assets/sunlint-code-quality/rules/kotlin/S047-oauth-csrf-protection.md +74 -0
  217. package/skill-assets/sunlint-code-quality/rules/kotlin/S048-oauth-redirect-validation.md +61 -0
  218. package/skill-assets/sunlint-code-quality/rules/kotlin/S049-auth-code-expiry.md +70 -0
  219. package/skill-assets/sunlint-code-quality/rules/kotlin/S050-token-entropy.md +65 -0
  220. package/skill-assets/sunlint-code-quality/rules/kotlin/S051-password-length.md +52 -0
  221. package/skill-assets/sunlint-code-quality/rules/kotlin/S052-otp-entropy.md +55 -0
  222. package/skill-assets/sunlint-code-quality/rules/kotlin/S053-generic-error-messages.md +66 -0
  223. package/skill-assets/sunlint-code-quality/rules/kotlin/S054-no-default-admin.md +57 -0
  224. package/skill-assets/sunlint-code-quality/rules/kotlin/S055-content-type-validation.md +58 -0
  225. package/skill-assets/sunlint-code-quality/rules/kotlin/S056-log-injection.md +47 -0
  226. package/skill-assets/sunlint-code-quality/rules/kotlin/S057-synchronized-time.md +49 -0
  227. package/skill-assets/sunlint-code-quality/rules/kotlin/S058-ssrf-protection.md +69 -0
  228. package/skill-assets/sunlint-code-quality/rules/php/C006-verb-noun-functions.md +46 -0
  229. package/skill-assets/sunlint-code-quality/rules/php/C013-no-dead-code.md +53 -0
  230. package/skill-assets/sunlint-code-quality/rules/php/C014-dependency-injection.md +71 -0
  231. package/skill-assets/sunlint-code-quality/rules/php/C017-no-constructor-logic.md +68 -0
  232. package/skill-assets/sunlint-code-quality/rules/php/C018-generic-errors.md +50 -0
  233. package/skill-assets/sunlint-code-quality/rules/php/C019-error-log-level.md +54 -0
  234. package/skill-assets/sunlint-code-quality/rules/php/C020-no-unused-imports.md +55 -0
  235. package/skill-assets/sunlint-code-quality/rules/php/C022-no-unused-variables.md +51 -0
  236. package/skill-assets/sunlint-code-quality/rules/php/C023-no-duplicate-names.md +61 -0
  237. package/skill-assets/sunlint-code-quality/rules/php/C024-centralize-constants.md +60 -0
  238. package/skill-assets/sunlint-code-quality/rules/php/C029-catch-log-root-cause.md +57 -0
  239. package/skill-assets/sunlint-code-quality/rules/php/C030-custom-error-classes.md +62 -0
  240. package/skill-assets/sunlint-code-quality/rules/php/C033-separate-data-access.md +79 -0
  241. package/skill-assets/sunlint-code-quality/rules/php/C035-error-context-logging.md +54 -0
  242. package/skill-assets/sunlint-code-quality/rules/php/C041-no-hardcoded-secrets.md +59 -0
  243. package/skill-assets/sunlint-code-quality/rules/php/C042-boolean-naming.md +52 -0
  244. package/skill-assets/sunlint-code-quality/rules/php/C052-controller-parsing.md +66 -0
  245. package/skill-assets/sunlint-code-quality/rules/php/C060-superclass-logic.md +54 -0
  246. package/skill-assets/sunlint-code-quality/rules/php/C067-no-hardcoded-config.md +55 -0
  247. package/skill-assets/sunlint-code-quality/rules/php/S003-open-redirect.md +60 -0
  248. package/skill-assets/sunlint-code-quality/rules/php/S004-no-log-credentials.md +67 -0
  249. package/skill-assets/sunlint-code-quality/rules/php/S005-server-authorization.md +57 -0
  250. package/skill-assets/sunlint-code-quality/rules/php/S006-default-credentials.md +61 -0
  251. package/skill-assets/sunlint-code-quality/rules/php/S007-output-encoding.md +61 -0
  252. package/skill-assets/sunlint-code-quality/rules/php/S009-approved-crypto.md +53 -0
  253. package/skill-assets/sunlint-code-quality/rules/php/S010-csprng.md +47 -0
  254. package/skill-assets/sunlint-code-quality/rules/php/S011-encrypted-client-hello.md +41 -0
  255. package/skill-assets/sunlint-code-quality/rules/php/S012-secrets-management.md +60 -0
  256. package/skill-assets/sunlint-code-quality/rules/php/S013-tls-connections.md +67 -0
  257. package/skill-assets/sunlint-code-quality/rules/php/S016-no-sensitive-query-string.md +61 -0
  258. package/skill-assets/sunlint-code-quality/rules/php/S017-parameterized-queries.md +44 -0
  259. package/skill-assets/sunlint-code-quality/rules/php/S019-email-input-sanitization.md +54 -0
  260. package/skill-assets/sunlint-code-quality/rules/php/S020-eval-code-execution.md +57 -0
  261. package/skill-assets/sunlint-code-quality/rules/php/S022-context-escaping.md +58 -0
  262. package/skill-assets/sunlint-code-quality/rules/php/S023-dynamic-js-encoding.md +62 -0
  263. package/skill-assets/sunlint-code-quality/rules/php/S025-server-validation.md +63 -0
  264. package/skill-assets/sunlint-code-quality/rules/php/S026-tls-encryption.md +48 -0
  265. package/skill-assets/sunlint-code-quality/rules/php/S027-mtls-validation.md +62 -0
  266. package/skill-assets/sunlint-code-quality/rules/php/S028-upload-limits.md +60 -0
  267. package/skill-assets/sunlint-code-quality/rules/php/S029-csrf-protection.md +65 -0
  268. package/skill-assets/sunlint-code-quality/rules/php/S030-directory-browsing.md +40 -0
  269. package/skill-assets/sunlint-code-quality/rules/php/S031-secure-cookie-flag.md +55 -0
  270. package/skill-assets/sunlint-code-quality/rules/php/S032-httponly-cookie.md +54 -0
  271. package/skill-assets/sunlint-code-quality/rules/php/S033-samesite-cookie.md +52 -0
  272. package/skill-assets/sunlint-code-quality/rules/php/S034-host-prefix-cookie.md +49 -0
  273. package/skill-assets/sunlint-code-quality/rules/php/S035-app-hostnames.md +49 -0
  274. package/skill-assets/sunlint-code-quality/rules/php/S036-internal-file-paths.md +56 -0
  275. package/skill-assets/sunlint-code-quality/rules/php/S037-anti-cache-headers.md +56 -0
  276. package/skill-assets/sunlint-code-quality/rules/php/S039-tls-certificate-validation.md +54 -0
  277. package/skill-assets/sunlint-code-quality/rules/php/S041-logout-invalidation.md +63 -0
  278. package/skill-assets/sunlint-code-quality/rules/php/S042-long-lived-sessions.md +57 -0
  279. package/skill-assets/sunlint-code-quality/rules/php/S044-critical-changes-reauth.md +71 -0
  280. package/skill-assets/sunlint-code-quality/rules/php/S045-brute-force-protection.md +67 -0
  281. package/skill-assets/sunlint-code-quality/rules/php/S047-oauth-csrf-protection.md +72 -0
  282. package/skill-assets/sunlint-code-quality/rules/php/S048-oauth-redirect-validation.md +54 -0
  283. package/skill-assets/sunlint-code-quality/rules/php/S049-auth-code-expiry.md +71 -0
  284. package/skill-assets/sunlint-code-quality/rules/php/S050-token-entropy.md +58 -0
  285. package/skill-assets/sunlint-code-quality/rules/php/S051-password-length.md +59 -0
  286. package/skill-assets/sunlint-code-quality/rules/php/S052-otp-entropy.md +45 -0
  287. package/skill-assets/sunlint-code-quality/rules/php/S053-generic-error-messages.md +59 -0
  288. package/skill-assets/sunlint-code-quality/rules/php/S054-no-default-admin.md +62 -0
  289. package/skill-assets/sunlint-code-quality/rules/php/S055-content-type-validation.md +58 -0
  290. package/skill-assets/sunlint-code-quality/rules/php/S056-log-injection.md +48 -0
  291. package/skill-assets/sunlint-code-quality/rules/php/S057-synchronized-time.md +52 -0
  292. package/skill-assets/sunlint-code-quality/rules/php/S058-ssrf-protection.md +65 -0
  293. package/skill-assets/sunlint-code-quality/rules/python/C006-verb-noun-functions.md +30 -0
  294. package/skill-assets/sunlint-code-quality/rules/python/C013-no-dead-code.md +24 -0
  295. package/skill-assets/sunlint-code-quality/rules/python/C014-dependency-injection.md +68 -0
  296. package/skill-assets/sunlint-code-quality/rules/python/C017-no-constructor-logic.md +30 -0
  297. package/skill-assets/sunlint-code-quality/rules/python/C018-generic-errors.md +25 -0
  298. package/skill-assets/sunlint-code-quality/rules/python/C019-error-log-level.md +26 -0
  299. package/skill-assets/sunlint-code-quality/rules/python/C020-no-unused-imports.md +28 -0
  300. package/skill-assets/sunlint-code-quality/rules/python/C022-no-unused-variables.md +24 -0
  301. package/skill-assets/sunlint-code-quality/rules/python/C023-no-duplicate-names.md +27 -0
  302. package/skill-assets/sunlint-code-quality/rules/python/C024-centralize-constants.md +27 -0
  303. package/skill-assets/sunlint-code-quality/rules/python/C029-catch-log-root-cause.md +61 -0
  304. package/skill-assets/sunlint-code-quality/rules/python/C030-custom-error-classes.md +28 -0
  305. package/skill-assets/sunlint-code-quality/rules/python/C033-separate-data-access.md +53 -0
  306. package/skill-assets/sunlint-code-quality/rules/python/C035-error-context-logging.md +26 -0
  307. package/skill-assets/sunlint-code-quality/rules/python/C041-no-hardcoded-secrets.md +23 -0
  308. package/skill-assets/sunlint-code-quality/rules/python/C042-boolean-naming.md +24 -0
  309. package/skill-assets/sunlint-code-quality/rules/python/C052-controller-parsing.md +34 -0
  310. package/skill-assets/sunlint-code-quality/rules/python/C060-superclass-logic.md +26 -0
  311. package/skill-assets/sunlint-code-quality/rules/python/C067-no-hardcoded-config.md +22 -0
  312. package/skill-assets/sunlint-code-quality/rules/python/S003-open-redirect.md +16 -0
  313. package/skill-assets/sunlint-code-quality/rules/python/S004-no-log-credentials.md +16 -0
  314. package/skill-assets/sunlint-code-quality/rules/python/S005-server-authorization.md +16 -0
  315. package/skill-assets/sunlint-code-quality/rules/python/S006-default-credentials.md +16 -0
  316. package/skill-assets/sunlint-code-quality/rules/python/S007-output-encoding.md +16 -0
  317. package/skill-assets/sunlint-code-quality/rules/python/S009-approved-crypto.md +16 -0
  318. package/skill-assets/sunlint-code-quality/rules/python/S010-csprng.md +16 -0
  319. package/skill-assets/sunlint-code-quality/rules/python/S011-encrypted-client-hello.md +16 -0
  320. package/skill-assets/sunlint-code-quality/rules/python/S012-secrets-management.md +16 -0
  321. package/skill-assets/sunlint-code-quality/rules/python/S013-tls-connections.md +16 -0
  322. package/skill-assets/sunlint-code-quality/rules/python/S016-no-sensitive-query-string.md +16 -0
  323. package/skill-assets/sunlint-code-quality/rules/python/S017-parameterized-queries.md +51 -0
  324. package/skill-assets/sunlint-code-quality/rules/python/S019-email-input-sanitization.md +16 -0
  325. package/skill-assets/sunlint-code-quality/rules/python/S020-eval-code-execution.md +51 -0
  326. package/skill-assets/sunlint-code-quality/rules/python/S022-context-escaping.md +16 -0
  327. package/skill-assets/sunlint-code-quality/rules/python/S023-dynamic-js-encoding.md +16 -0
  328. package/skill-assets/sunlint-code-quality/rules/python/S025-server-validation.md +16 -0
  329. package/skill-assets/sunlint-code-quality/rules/python/S026-tls-encryption.md +16 -0
  330. package/skill-assets/sunlint-code-quality/rules/python/S027-mtls-validation.md +16 -0
  331. package/skill-assets/sunlint-code-quality/rules/python/S028-upload-limits.md +16 -0
  332. package/skill-assets/sunlint-code-quality/rules/python/S029-csrf-protection.md +16 -0
  333. package/skill-assets/sunlint-code-quality/rules/python/S030-directory-browsing.md +16 -0
  334. package/skill-assets/sunlint-code-quality/rules/python/S031-secure-cookie-flag.md +16 -0
  335. package/skill-assets/sunlint-code-quality/rules/python/S032-httponly-cookie.md +16 -0
  336. package/skill-assets/sunlint-code-quality/rules/python/S033-samesite-cookie.md +16 -0
  337. package/skill-assets/sunlint-code-quality/rules/python/S034-host-prefix-cookie.md +16 -0
  338. package/skill-assets/sunlint-code-quality/rules/python/S035-app-hostnames.md +16 -0
  339. package/skill-assets/sunlint-code-quality/rules/python/S036-internal-file-paths.md +50 -0
  340. package/skill-assets/sunlint-code-quality/rules/python/S037-anti-cache-headers.md +16 -0
  341. package/skill-assets/sunlint-code-quality/rules/python/S039-tls-certificate-validation.md +16 -0
  342. package/skill-assets/sunlint-code-quality/rules/python/S041-logout-invalidation.md +16 -0
  343. package/skill-assets/sunlint-code-quality/rules/python/S042-long-lived-sessions.md +16 -0
  344. package/skill-assets/sunlint-code-quality/rules/python/S044-critical-changes-reauth.md +16 -0
  345. package/skill-assets/sunlint-code-quality/rules/python/S045-brute-force-protection.md +16 -0
  346. package/skill-assets/sunlint-code-quality/rules/python/S047-oauth-csrf-protection.md +16 -0
  347. package/skill-assets/sunlint-code-quality/rules/python/S048-oauth-redirect-validation.md +16 -0
  348. package/skill-assets/sunlint-code-quality/rules/python/S049-auth-code-expiry.md +16 -0
  349. package/skill-assets/sunlint-code-quality/rules/python/S050-token-entropy.md +16 -0
  350. package/skill-assets/sunlint-code-quality/rules/python/S051-password-length.md +16 -0
  351. package/skill-assets/sunlint-code-quality/rules/python/S052-otp-entropy.md +16 -0
  352. package/skill-assets/sunlint-code-quality/rules/python/S053-generic-error-messages.md +16 -0
  353. package/skill-assets/sunlint-code-quality/rules/python/S054-no-default-admin.md +16 -0
  354. package/skill-assets/sunlint-code-quality/rules/python/S055-content-type-validation.md +16 -0
  355. package/skill-assets/sunlint-code-quality/rules/python/S056-log-injection.md +16 -0
  356. package/skill-assets/sunlint-code-quality/rules/python/S057-synchronized-time.md +16 -0
  357. package/skill-assets/sunlint-code-quality/rules/python/S058-ssrf-protection.md +57 -0
  358. package/skill-assets/sunlint-code-quality/rules/typescript/C006-verb-noun-functions.md +45 -0
  359. package/skill-assets/sunlint-code-quality/rules/typescript/C013-no-dead-code.md +51 -0
  360. package/skill-assets/sunlint-code-quality/rules/typescript/C014-dependency-injection.md +69 -0
  361. package/skill-assets/sunlint-code-quality/rules/typescript/C017-no-constructor-logic.md +60 -0
  362. package/skill-assets/sunlint-code-quality/rules/typescript/C018-generic-errors.md +47 -0
  363. package/skill-assets/sunlint-code-quality/rules/typescript/C019-error-log-level.md +50 -0
  364. package/skill-assets/sunlint-code-quality/rules/typescript/C020-no-unused-imports.md +55 -0
  365. package/skill-assets/sunlint-code-quality/rules/typescript/C022-no-unused-variables.md +59 -0
  366. package/skill-assets/sunlint-code-quality/rules/typescript/C023-no-duplicate-names.md +58 -0
  367. package/skill-assets/sunlint-code-quality/rules/typescript/C024-centralize-constants.md +56 -0
  368. package/skill-assets/sunlint-code-quality/rules/typescript/C029-catch-log-root-cause.md +53 -0
  369. package/skill-assets/sunlint-code-quality/rules/typescript/C030-custom-error-classes.md +60 -0
  370. package/skill-assets/sunlint-code-quality/rules/typescript/C033-separate-data-access.md +69 -0
  371. package/skill-assets/sunlint-code-quality/rules/typescript/C035-error-context-logging.md +50 -0
  372. package/skill-assets/sunlint-code-quality/rules/typescript/C041-no-hardcoded-secrets.md +47 -0
  373. package/skill-assets/sunlint-code-quality/rules/typescript/C042-boolean-naming.md +42 -0
  374. package/skill-assets/sunlint-code-quality/rules/typescript/C052-controller-parsing.md +64 -0
  375. package/skill-assets/sunlint-code-quality/rules/typescript/C060-superclass-logic.md +67 -0
  376. package/skill-assets/sunlint-code-quality/rules/typescript/C067-no-hardcoded-config.md +52 -0
  377. package/skill-assets/sunlint-code-quality/rules/typescript/S003-open-redirect.md +76 -0
  378. package/skill-assets/sunlint-code-quality/rules/typescript/S004-no-log-credentials.md +71 -0
  379. package/skill-assets/sunlint-code-quality/rules/typescript/S005-server-authorization.md +68 -0
  380. package/skill-assets/sunlint-code-quality/rules/typescript/S006-default-credentials.md +69 -0
  381. package/skill-assets/sunlint-code-quality/rules/typescript/S007-output-encoding.md +60 -0
  382. package/skill-assets/sunlint-code-quality/rules/typescript/S009-approved-crypto.md +53 -0
  383. package/skill-assets/sunlint-code-quality/rules/typescript/S010-csprng.md +53 -0
  384. package/skill-assets/sunlint-code-quality/rules/typescript/S011-encrypted-client-hello.md +45 -0
  385. package/skill-assets/sunlint-code-quality/rules/typescript/S012-secrets-management.md +47 -0
  386. package/skill-assets/sunlint-code-quality/rules/typescript/S013-tls-connections.md +70 -0
  387. package/skill-assets/sunlint-code-quality/rules/typescript/S016-no-sensitive-query-string.md +53 -0
  388. package/skill-assets/sunlint-code-quality/rules/typescript/S017-parameterized-queries.md +55 -0
  389. package/skill-assets/sunlint-code-quality/rules/typescript/S019-email-input-sanitization.md +56 -0
  390. package/skill-assets/sunlint-code-quality/rules/typescript/S020-eval-code-execution.md +58 -0
  391. package/skill-assets/sunlint-code-quality/rules/typescript/S022-context-escaping.md +48 -0
  392. package/skill-assets/sunlint-code-quality/rules/typescript/S023-dynamic-js-encoding.md +52 -0
  393. package/skill-assets/sunlint-code-quality/rules/typescript/S025-server-validation.md +62 -0
  394. package/skill-assets/sunlint-code-quality/rules/typescript/S026-tls-encryption.md +47 -0
  395. package/skill-assets/sunlint-code-quality/rules/typescript/S027-mtls-validation.md +50 -0
  396. package/skill-assets/sunlint-code-quality/rules/typescript/S028-upload-limits.md +65 -0
  397. package/skill-assets/sunlint-code-quality/rules/typescript/S029-csrf-protection.md +62 -0
  398. package/skill-assets/sunlint-code-quality/rules/typescript/S030-directory-browsing.md +52 -0
  399. package/skill-assets/sunlint-code-quality/rules/typescript/S031-secure-cookie-flag.md +48 -0
  400. package/skill-assets/sunlint-code-quality/rules/typescript/S032-httponly-cookie.md +36 -0
  401. package/skill-assets/sunlint-code-quality/rules/typescript/S033-samesite-cookie.md +46 -0
  402. package/skill-assets/sunlint-code-quality/rules/typescript/S034-host-prefix-cookie.md +50 -0
  403. package/skill-assets/sunlint-code-quality/rules/typescript/S035-app-hostnames.md +49 -0
  404. package/skill-assets/sunlint-code-quality/rules/typescript/S036-internal-file-paths.md +53 -0
  405. package/skill-assets/sunlint-code-quality/rules/typescript/S037-anti-cache-headers.md +52 -0
  406. package/skill-assets/sunlint-code-quality/rules/typescript/S039-tls-certificate-validation.md +51 -0
  407. package/skill-assets/sunlint-code-quality/rules/typescript/S041-logout-invalidation.md +58 -0
  408. package/skill-assets/sunlint-code-quality/rules/typescript/S042-long-lived-sessions.md +55 -0
  409. package/skill-assets/sunlint-code-quality/rules/typescript/S044-critical-changes-reauth.md +69 -0
  410. package/skill-assets/sunlint-code-quality/rules/typescript/S045-brute-force-protection.md +59 -0
  411. package/skill-assets/sunlint-code-quality/rules/typescript/S047-oauth-csrf-protection.md +60 -0
  412. package/skill-assets/sunlint-code-quality/rules/typescript/S048-oauth-redirect-validation.md +59 -0
  413. package/skill-assets/sunlint-code-quality/rules/typescript/S049-auth-code-expiry.md +73 -0
  414. package/skill-assets/sunlint-code-quality/rules/typescript/S050-token-entropy.md +48 -0
  415. package/skill-assets/sunlint-code-quality/rules/typescript/S051-password-length.md +60 -0
  416. package/skill-assets/sunlint-code-quality/rules/typescript/S052-otp-entropy.md +49 -0
  417. package/skill-assets/sunlint-code-quality/rules/typescript/S053-generic-error-messages.md +61 -0
  418. package/skill-assets/sunlint-code-quality/rules/typescript/S054-no-default-admin.md +64 -0
  419. package/skill-assets/sunlint-code-quality/rules/typescript/S055-content-type-validation.md +64 -0
  420. package/skill-assets/sunlint-code-quality/rules/typescript/S056-log-injection.md +48 -0
  421. package/skill-assets/sunlint-code-quality/rules/typescript/S057-synchronized-time.md +57 -0
  422. package/skill-assets/sunlint-code-quality/rules/typescript/S058-ssrf-protection.md +63 -0
@@ -0,0 +1,38 @@
1
+ ---
2
+ title: Do Not Throw Generic Errors
3
+ impact: HIGH
4
+ impactDescription: enables proper error handling and monitoring
5
+ tags: error-handling, exceptions, custom-errors, debugging, quality, csharp
6
+ ---
7
+
8
+ ## Do Not Throw Generic Errors
9
+
10
+ Throwing specific exceptions allows callers to handle specific error cases.
11
+
12
+ **Incorrect (generic exception):**
13
+
14
+ ```csharp
15
+ if (user == null)
16
+ {
17
+ throw new Exception("User not found"); // Generic
18
+ }
19
+ ```
20
+
21
+ **Correct (specific exception):**
22
+
23
+ ```csharp
24
+ if (user == null)
25
+ {
26
+ throw new KeyNotFoundException($"User {id} not found"); // Built-in specific
27
+ }
28
+
29
+ // Or custom exception
30
+ public class UserNotFoundException : Exception { ... }
31
+
32
+ if (user == null)
33
+ {
34
+ throw new UserNotFoundException(id);
35
+ }
36
+ ```
37
+
38
+ **Tools:** Roslyn Analyzers (CA2201), SonarQube
@@ -0,0 +1,29 @@
1
+ ---
2
+ title: Do Not Use Error Log For Non-critical
3
+ impact: HIGH
4
+ impactDescription: prevents alert fatigue and log noise
5
+ tags: logging, log-levels, error, observability, quality, csharp
6
+ ---
7
+
8
+ ## Do Not Use Error Log For Non-critical
9
+
10
+ Reserve `LogError` for system failures requiring intervention. Use `LogWarning` or `LogInformation` for business flows.
11
+
12
+ **Incorrect (wrong level):**
13
+
14
+ ```csharp
15
+ // Not an error - just invalid input
16
+ _logger.LogError("User entered invalid email");
17
+ ```
18
+
19
+ **Correct (appropriate level):**
20
+
21
+ ```csharp
22
+ // Business logic flow
23
+ _logger.LogWarning("Login failed for user {UserId}", userId);
24
+
25
+ // System failure
26
+ _logger.LogError(ex, "Database connection failed");
27
+ ```
28
+
29
+ **Tools:** Manual Review
@@ -0,0 +1,30 @@
1
+ ---
2
+ title: Do Not Import Unused Namespaces
3
+ impact: LOW
4
+ impactDescription: reduces clutter
5
+ tags: imports, cleanup, quality, csharp
6
+ ---
7
+
8
+ ## Do Not Import Unused Namespaces
9
+
10
+ Unused `using` directives clutter the file.
11
+
12
+ **Incorrect:**
13
+
14
+ ```csharp
15
+ using System;
16
+ using System.Text; // Unused
17
+ using System.Linq; // Unused
18
+
19
+ public class User { }
20
+ ```
21
+
22
+ **Correct:**
23
+
24
+ ```csharp
25
+ using System;
26
+
27
+ public class User { }
28
+ ```
29
+
30
+ **Tools:** Visual Studio "Remove Unused Usings", Roslyn Analyzers (IDE0005)
@@ -0,0 +1,33 @@
1
+ ---
2
+ title: Remove Unused Variables
3
+ impact: MEDIUM
4
+ impactDescription: improves code maintainability and reduces clutter
5
+ tags: csharp, clean-code, maintainability
6
+ ---
7
+
8
+ ## Remove Unused Variables
9
+
10
+ Unused variables reduce code readability and may indicate logic errors.
11
+
12
+ **Incorrect:**
13
+
14
+ ```csharp
15
+ public void CalculateTotal()
16
+ {
17
+ int unused = 10; // C022: variable 'unused' is assigned but its value is never used
18
+ var total = 100;
19
+ Console.WriteLine($"Total: {total}");
20
+ }
21
+ ```
22
+
23
+ **Correct:**
24
+
25
+ ```csharp
26
+ public void CalculateTotal()
27
+ {
28
+ var total = 100;
29
+ Console.WriteLine($"Total: {total}");
30
+ }
31
+ ```
32
+
33
+ **Tools:** Roslyn Analyzers, SonarQube (S1481)
@@ -0,0 +1,36 @@
1
+ ---
2
+ title: No Duplicate Variable Names In Scope (Shadowing)
3
+ impact: HIGH
4
+ impactDescription: prevents shadowing bugs
5
+ tags: variables, shadowing, scope, quality, csharp
6
+ ---
7
+
8
+ ## No Duplicate Variable Names In Scope (Shadowing)
9
+
10
+ Variable shadowing occurs when an inner scope variable has the same name as an outer scope variable.
11
+
12
+ **Incorrect (shadowing):**
13
+
14
+ ```csharp
15
+ var name = "Main";
16
+
17
+ public void Process()
18
+ {
19
+ var name = "Inner"; // Shadows class member or outer variable
20
+ Console.WriteLine(name);
21
+ }
22
+ ```
23
+
24
+ **Correct (unique names):**
25
+
26
+ ```csharp
27
+ var appName = "Main";
28
+
29
+ public void Process()
30
+ {
31
+ var processName = "Inner";
32
+ Console.WriteLine(processName);
33
+ }
34
+ ```
35
+
36
+ **Tools:** Roslyn Analyzers, SonarQube
@@ -0,0 +1,33 @@
1
+ ---
2
+ title: Centralize Constants
3
+ impact: HIGH
4
+ impactDescription: makes values easy to find and update
5
+ tags: constants, magic-numbers, configuration, quality, csharp
6
+ ---
7
+
8
+ ## Centralize Constants
9
+
10
+ Avoid magic numbers and strings. Use `const` fields or configuration.
11
+
12
+ **Incorrect (magic strings/numbers):**
13
+
14
+ ```csharp
15
+ if (status == "Active") { }
16
+ if (count > 5) { }
17
+ ```
18
+
19
+ **Correct (centralized):**
20
+
21
+ ```csharp
22
+ public static class Constants
23
+ {
24
+ public const string StatusActive = "Active";
25
+ public const int MaxRetries = 5;
26
+ }
27
+
28
+ // Usage
29
+ if (status == Constants.StatusActive) { }
30
+ if (count > Constants.MaxRetries) { }
31
+ ```
32
+
33
+ **Tools:** Roslyn Analyzers, SonarQube
@@ -0,0 +1,40 @@
1
+ ---
2
+ title: Ensure Exceptions Log Root Cause
3
+ impact: CRITICAL
4
+ impactDescription: enables debugging of root causes
5
+ tags: error-handling, logging, debugging, quality, csharp
6
+ ---
7
+
8
+ ## Ensure Exceptions Log Root Cause
9
+
10
+ When catching an exception, always log the full exception object, not just the message.
11
+
12
+ **Incorrect (swallowing stack trace):**
13
+
14
+ ```csharp
15
+ try
16
+ {
17
+ // ...
18
+ }
19
+ catch (Exception ex)
20
+ {
21
+ // Lost stack trace and inner exception!
22
+ _logger.LogError("Error: " + ex.Message);
23
+ }
24
+ ```
25
+
26
+ **Correct (logging exception):**
27
+
28
+ ```csharp
29
+ try
30
+ {
31
+ // ...
32
+ }
33
+ catch (Exception ex)
34
+ {
35
+ // Pass exception object as first argument
36
+ _logger.LogError(ex, "Error processing order {OrderId}", orderId);
37
+ }
38
+ ```
39
+
40
+ **Tools:** Roslyn Analyzers, SonarQube
@@ -0,0 +1,38 @@
1
+ ---
2
+ title: Use Custom Error Classes
3
+ impact: MEDIUM
4
+ impactDescription: improves error handling granularity
5
+ tags: error-handling, exceptions, design, quality, csharp
6
+ ---
7
+
8
+ ## Use Custom Error Classes
9
+
10
+ Use specific, typed exceptions instead of generic `Exception`.
11
+
12
+ **Incorrect (throwing generic):**
13
+
14
+ ```csharp
15
+ throw new Exception("Validation failed");
16
+ ```
17
+
18
+ **Correct (custom business exceptions):**
19
+
20
+ ```csharp
21
+ public class InsufficientFundsException : Exception
22
+ {
23
+ public decimal Available { get; }
24
+ public decimal Required { get; }
25
+
26
+ public InsufficientFundsException(decimal available, decimal required)
27
+ : base($"Insufficient funds. Required: {required}, Available: {available}")
28
+ {
29
+ Available = available;
30
+ Required = required;
31
+ }
32
+ }
33
+
34
+ // Usage
35
+ throw new InsufficientFundsException(100, 200);
36
+ ```
37
+
38
+ **Tools:** Roslyn Analyzers
@@ -0,0 +1,53 @@
1
+ ---
2
+ title: Separate Data Access Logic
3
+ impact: HIGH
4
+ impactDescription: improves testability and maintainability
5
+ tags: architecture, repository, layering, quality, csharp
6
+ ---
7
+
8
+ ## Separate Data Access Logic
9
+
10
+ Keep database logic out of Controllers and Business Services. Use Repositories or Query handlers.
11
+
12
+ **Incorrect (DB usage in controller):**
13
+
14
+ ```csharp
15
+ [HttpPost]
16
+ public IActionResult CreateUser(User user)
17
+ {
18
+ // Direct EF context usage in controller
19
+ using (var context = new DbContext())
20
+ {
21
+ context.Users.Add(user);
22
+ context.SaveChanges();
23
+ }
24
+ return Ok();
25
+ }
26
+ ```
27
+
28
+ **Correct (Repository/Service pattern):**
29
+
30
+ ```csharp
31
+ // Controller
32
+ public IActionResult CreateUser(UserDto dto)
33
+ {
34
+ _userService.RegisterUser(dto);
35
+ return Ok();
36
+ }
37
+
38
+ // Service
39
+ public void RegisterUser(UserDto dto)
40
+ {
41
+ var user = _mapper.Map<User>(dto);
42
+ _userRepository.Add(user);
43
+ }
44
+
45
+ // Repository
46
+ public void Add(User user)
47
+ {
48
+ _context.Users.Add(user);
49
+ _context.SaveChanges();
50
+ }
51
+ ```
52
+
53
+ **Tools:** Architecture Tests, SonarQube
@@ -0,0 +1,31 @@
1
+ ---
2
+ title: Log All Relevant Context On Errors
3
+ impact: HIGH
4
+ impactDescription: enables quick debugging and incident response
5
+ tags: error-handling, logging, context, debugging, quality, csharp
6
+ ---
7
+
8
+ ## Log All Relevant Context On Errors
9
+
10
+ Structured logging should include all IDs and state relevant to the error.
11
+
12
+ **Incorrect (message only):**
13
+
14
+ ```csharp
15
+ _logger.LogError("Payment failed");
16
+ ```
17
+
18
+ **Correct (structured context):**
19
+
20
+ ```csharp
21
+ _logger.LogError(ex, "Payment failed for User {UserId} Order {OrderId} Amount {Amount}",
22
+ userId, orderId, amount);
23
+
24
+ // Or using scopes
25
+ using (_logger.BeginScope(new Dictionary<string, object> { ["UserId"] = userId }))
26
+ {
27
+ _logger.LogError(ex, "Payment failed");
28
+ }
29
+ ```
30
+
31
+ **Tools:** Serilog, MEL
@@ -0,0 +1,25 @@
1
+ ---
2
+ title: No Hardcoded Secrets In Repo
3
+ impact: HIGH
4
+ impactDescription: prevents credential exposure
5
+ tags: secrets, credentials, security, git, quality, csharp
6
+ ---
7
+
8
+ ## No Hardcoded Secrets In Repo
9
+
10
+ Never commit API keys or passwords.
11
+
12
+ **Incorrect:**
13
+
14
+ ```csharp
15
+ private const string ServiceKey = "sk_live_123";
16
+ ```
17
+
18
+ **Correct:**
19
+
20
+ ```csharp
21
+ // Load from configuration
22
+ var key = _configuration["ServiceKey"];
23
+ ```
24
+
25
+ **Tools:** GitLeaks, Security Code Scan
@@ -0,0 +1,27 @@
1
+ ---
2
+ title: Boolean Names Is/Has/Should
3
+ impact: HIGH
4
+ impactDescription: makes conditions instantly readable
5
+ tags: naming, booleans, readability, quality, csharp
6
+ ---
7
+
8
+ ## Boolean Names Is/Has/Should
9
+
10
+ Prefix boolean properties and variables with `Is`, `Has`, `Can`, `Should`.
11
+
12
+ **Incorrect:**
13
+
14
+ ```csharp
15
+ public bool Active { get; set; }
16
+ public bool Validate { get; set; } // is this a flag or a method?
17
+ ```
18
+
19
+ **Correct:**
20
+
21
+ ```csharp
22
+ public bool IsActive { get; set; }
23
+ public bool ShouldValidate { get; set; }
24
+ public bool HasAccess { get; set; }
25
+ ```
26
+
27
+ **Tools:** StyleCop, Code Review
@@ -0,0 +1,41 @@
1
+ ---
2
+ title: Separate Parsing From Controllers
3
+ impact: HIGH
4
+ impactDescription: keeps controllers thin and focused
5
+ tags: controller, parsing, transformation, patterns, quality, csharp
6
+ ---
7
+
8
+ ## Separate Parsing From Controllers
9
+
10
+ Controllers should handle HTTP, not data transformation. Use AutoMapper or Mappers.
11
+
12
+ **Incorrect (mapping in controller):**
13
+
14
+ ```csharp
15
+ [HttpGet]
16
+ public IActionResult GetUser(int id)
17
+ {
18
+ var user = _repo.Get(id);
19
+ // Manual mapping logic cluttering controller
20
+ var dto = new UserDto
21
+ {
22
+ FullName = user.FirstName + " " + user.LastName,
23
+ Age = DateTime.Now.Year - user.Dob.Year
24
+ };
25
+ return Ok(dto);
26
+ }
27
+ ```
28
+
29
+ **Correct (AutoMapper or dedicated mapper):**
30
+
31
+ ```csharp
32
+ [HttpGet]
33
+ public IActionResult GetUser(int id)
34
+ {
35
+ var user = _repo.Get(id);
36
+ var dto = _mapper.Map<UserDto>(user);
37
+ return Ok(dto);
38
+ }
39
+ ```
40
+
41
+ **Tools:** AutoMapper, Mapster
@@ -0,0 +1,33 @@
1
+ ---
2
+ title: Do Not Ignore Superclass Logic
3
+ impact: HIGH
4
+ impactDescription: ensures proper inheritance behavior
5
+ tags: inheritance, override, superclass, oop, quality, csharp
6
+ ---
7
+
8
+ ## Do Not Ignore Superclass Logic
9
+
10
+ When overriding `virtual` methods, consider if you need to call `base.Method()`.
11
+
12
+ **Incorrect (breaking chain):**
13
+
14
+ ```csharp
15
+ protected override void OnInitialized()
16
+ {
17
+ // Missing base.OnInitialized();
18
+ // Might break component initialization in frameworks like Blazor/WPF
19
+ MyInit();
20
+ }
21
+ ```
22
+
23
+ **Correct:**
24
+
25
+ ```csharp
26
+ protected override void OnInitialized()
27
+ {
28
+ base.OnInitialized();
29
+ MyInit();
30
+ }
31
+ ```
32
+
33
+ **Tools:** Roslyn Analyzers, SonarQube
@@ -0,0 +1,24 @@
1
+ ---
2
+ title: Do Not Hardcode Configuration
3
+ impact: HIGH
4
+ impactDescription: enables environment-specific deployments
5
+ tags: configuration, environment, deployment, quality, csharp
6
+ ---
7
+
8
+ ## Do Not Hardcode Configuration
9
+
10
+ Use `appsettings.json` and `IConfiguration`.
11
+
12
+ **Incorrect:**
13
+
14
+ ```csharp
15
+ var client = new HttpClient { BaseAddress = new Uri("http://localhost:5000") };
16
+ ```
17
+
18
+ **Correct:**
19
+
20
+ ```csharp
21
+ var client = new HttpClient { BaseAddress = new Uri(_config["ApiUrl"]) };
22
+ ```
23
+
24
+ **Tools:** Roslyn Analyzers
@@ -0,0 +1,47 @@
1
+ ---
2
+ title: Protect Against Open Redirects
3
+ impact: MEDIUM
4
+ impactDescription: prevents phishing redirect attacks
5
+ tags: redirect, phishing, url, security, csharp
6
+ ---
7
+
8
+ ## Protect Against Open Redirects
9
+
10
+ Open redirects allow attackers to use your domain to redirect users to malicious sites, facilitating phishing attacks.
11
+
12
+ **Incorrect (unvalidated redirect):**
13
+
14
+ ```csharp
15
+ [HttpGet]
16
+ public IActionResult Login(string returnUrl)
17
+ {
18
+ // ... login logic ...
19
+ return Redirect(returnUrl); // Attacker can send ?returnUrl=http://evil.com
20
+ }
21
+ ```
22
+
23
+ **Correct (validated redirect):**
24
+
25
+ ```csharp
26
+ [HttpGet]
27
+ public IActionResult Login(string returnUrl)
28
+ {
29
+ // ... login logic ...
30
+
31
+ // Use LocalRedirect to enforce local URLs
32
+ if (Url.IsLocalUrl(returnUrl))
33
+ {
34
+ return LocalRedirect(returnUrl);
35
+ }
36
+
37
+ // Or validate against allow list
38
+ if (IsAllowedUrl(returnUrl))
39
+ {
40
+ return Redirect(returnUrl);
41
+ }
42
+
43
+ return RedirectToAction("Index", "Home");
44
+ }
45
+ ```
46
+
47
+ **Tools:** Roslyn Analyzers, SonarQube
@@ -0,0 +1,28 @@
1
+ ---
2
+ title: Do Not Log Credentials Or Tokens
3
+ impact: MEDIUM
4
+ impactDescription: prevents credential exposure in logs
5
+ tags: logging, credentials, tokens, secrets, security, csharp
6
+ ---
7
+
8
+ ## Do Not Log Credentials Or Tokens
9
+
10
+ Never log passwords or raw tokens.
11
+
12
+ **Incorrect:**
13
+
14
+ ```csharp
15
+ _logger.LogInformation("Login attempt with password {Password}", password);
16
+ ```
17
+
18
+ **Correct:**
19
+
20
+ ```csharp
21
+ _logger.LogInformation("Login attempt for User {User}", username);
22
+
23
+ // Use Redaction in newer .NET
24
+ [LoggerMessage(Level = LogLevel.Information, Message = "Login for {User}")]
25
+ partial void LogLogin(string user, [NotLogged] string password);
26
+ ```
27
+
28
+ **Tools:** Roslyn Analyzers
@@ -0,0 +1,51 @@
1
+ ---
2
+ title: Enforce Authorization At Trusted Service Layer
3
+ impact: CRITICAL
4
+ impactDescription: prevents client-side authorization bypass
5
+ tags: authorization, server-side, middleware, access-control, security, csharp
6
+ ---
7
+
8
+ ## Enforce Authorization At Trusted Service Layer
9
+
10
+ Client-side checks (hiding buttons) are not security checks. Authorization must be enforced on the server for every privileged action.
11
+
12
+ **Incorrect (client-side only or trusting inputs):**
13
+
14
+ ```csharp
15
+ // Trusting a parameter from the client
16
+ [HttpPost]
17
+ public IActionResult DeleteUser(int id, bool isAdmin)
18
+ {
19
+ if (isAdmin) // Attacker can toggle this!
20
+ {
21
+ _repo.Delete(id);
22
+ }
23
+ return Ok();
24
+ }
25
+ ```
26
+
27
+ **Correct (server-side authorization):**
28
+
29
+ ```csharp
30
+ [Authorize(Roles = "Admin")] // Declarative check
31
+ [HttpPost]
32
+ public IActionResult DeleteUser(int id)
33
+ {
34
+ _repo.Delete(id);
35
+ return Ok();
36
+ }
37
+
38
+ // Resource-based authorization
39
+ [HttpPost]
40
+ public async Task<IActionResult> EditDocument(int id)
41
+ {
42
+ var document = _repo.Get(id);
43
+ var result = await _authorizationService.AuthorizeAsync(User, document, "EditPolicy");
44
+
45
+ if (!result.Succeeded) return Forbid();
46
+
47
+ // Proceed...
48
+ }
49
+ ```
50
+
51
+ **Tools:** Roslyn Analyzers, SonarQube
@@ -0,0 +1,42 @@
1
+ ---
2
+ title: Do Not Use Default Credentials
3
+ impact: CRITICAL
4
+ impactDescription: prevents trivial compromise via known credentials
5
+ tags: credentials, default, passwords, configuration, security, csharp
6
+ ---
7
+
8
+ ## Do Not Use Default Credentials
9
+
10
+ Default credentials in configuration files or code allow attackers trivial access.
11
+
12
+ **Incorrect (hardcoded defaults):**
13
+
14
+ ```json
15
+ // appsettings.json
16
+ {
17
+ "ConnectionStrings": {
18
+ "DefaultConnection": "Server=...;User Id=sa;Password=sa;"
19
+ }
20
+ }
21
+ ```
22
+
23
+ **Correct (secure configuration):**
24
+
25
+ ```csharp
26
+ // Use Environment Variables or User Secrets
27
+ // appsettings.json should use placeholders or be overridden
28
+ {
29
+ "ConnectionStrings": {
30
+ "DefaultConnection": "Server=...;User Id=${DB_USER};Password=${DB_PASS};"
31
+ }
32
+ }
33
+
34
+ // Code validation
35
+ var password = configuration["DbPassword"];
36
+ if (password == "admin" || password == "password")
37
+ {
38
+ throw new SecurityException("Default credentials detected");
39
+ }
40
+ ```
41
+
42
+ **Tools:** Secret Scanners, Configuration Validation