@ngxtm/devkit 3.3.0 → 3.4.1

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 (345) hide show
  1. package/cli/index.js +59 -13
  2. package/cli/rules.js +248 -0
  3. package/package.json +2 -1
  4. package/rules/README.md +141 -0
  5. package/rules/dart/best-practices/SKILL.md +23 -0
  6. package/rules/dart/language/SKILL.md +52 -0
  7. package/rules/dart/tooling/SKILL.md +43 -0
  8. package/rules/dotnet/aspnet-core/SKILL.md +92 -0
  9. package/rules/dotnet/aspnet-core/references/REFERENCE.md +335 -0
  10. package/rules/dotnet/best-practices/SKILL.md +101 -0
  11. package/rules/dotnet/best-practices/references/REFERENCE.md +256 -0
  12. package/rules/dotnet/blazor/SKILL.md +146 -0
  13. package/rules/dotnet/blazor/references/REFERENCE.md +392 -0
  14. package/rules/dotnet/language/SKILL.md +82 -0
  15. package/rules/dotnet/language/references/REFERENCE.md +222 -0
  16. package/rules/dotnet/patterns.rule.md +388 -0
  17. package/rules/dotnet/razor-pages/SKILL.md +124 -0
  18. package/rules/dotnet/razor-pages/references/REFERENCE.md +321 -0
  19. package/rules/dotnet/security/SKILL.md +89 -0
  20. package/rules/dotnet/security/references/REFERENCE.md +295 -0
  21. package/rules/dotnet/tooling/SKILL.md +92 -0
  22. package/rules/dotnet/tooling/references/REFERENCE.md +300 -0
  23. package/rules/flutter/auto-route-navigation/SKILL.md +43 -0
  24. package/rules/flutter/auto-route-navigation/references/REFERENCE.md +19 -0
  25. package/rules/flutter/auto-route-navigation/references/router-config.md +62 -0
  26. package/rules/flutter/bloc-state-management/SKILL.md +64 -0
  27. package/rules/flutter/bloc-state-management/references/REFERENCE.md +20 -0
  28. package/rules/flutter/bloc-state-management/references/auth-bloc-example.md +52 -0
  29. package/rules/flutter/bloc-state-management/references/equatable-usage.md +56 -0
  30. package/rules/flutter/bloc-state-management/references/property-based-state.md +68 -0
  31. package/rules/flutter/bloc.rule.md +76 -0
  32. package/rules/flutter/cicd/SKILL.md +48 -0
  33. package/rules/flutter/cicd/references/advanced-workflow.md +66 -0
  34. package/rules/flutter/cicd/references/fastlane.md +139 -0
  35. package/rules/flutter/cicd/references/github-actions.md +59 -0
  36. package/rules/flutter/dependency-injection/SKILL.md +42 -0
  37. package/rules/flutter/dependency-injection/references/REFERENCE.md +15 -0
  38. package/rules/flutter/dependency-injection/references/modules.md +37 -0
  39. package/rules/flutter/error-handling/SKILL.md +32 -0
  40. package/rules/flutter/error-handling/references/REFERENCE.md +19 -0
  41. package/rules/flutter/error-handling/references/error-mapping.md +31 -0
  42. package/rules/flutter/feature-based-clean-architecture/SKILL.md +46 -0
  43. package/rules/flutter/feature-based-clean-architecture/references/REFERENCE.md +14 -0
  44. package/rules/flutter/feature-based-clean-architecture/references/folder-structure.md +36 -0
  45. package/rules/flutter/getx-navigation/SKILL.md +70 -0
  46. package/rules/flutter/getx-navigation/references/app-pages.md +40 -0
  47. package/rules/flutter/getx-navigation/references/middleware-example.md +29 -0
  48. package/rules/flutter/getx-state-management/SKILL.md +76 -0
  49. package/rules/flutter/getx-state-management/references/binding-example.md +32 -0
  50. package/rules/flutter/getx-state-management/references/reactive-vs-simple.md +39 -0
  51. package/rules/flutter/go-router-navigation/SKILL.md +57 -0
  52. package/rules/flutter/idiomatic-flutter/SKILL.md +20 -0
  53. package/rules/flutter/layer-based-clean-architecture/SKILL.md +50 -0
  54. package/rules/flutter/layer-based-clean-architecture/references/REFERENCE.md +60 -0
  55. package/rules/flutter/layer-based-clean-architecture/references/repository-mapping.md +50 -0
  56. package/rules/flutter/localization/SKILL.md +50 -0
  57. package/rules/flutter/localization/references/REFERENCE.md +48 -0
  58. package/rules/flutter/localization/references/sheet-loader.md +33 -0
  59. package/rules/flutter/navigator-v1-navigation/SKILL.md +71 -0
  60. package/rules/flutter/navigator-v1-navigation/references/on-generate-route.md +48 -0
  61. package/rules/flutter/performance/SKILL.md +24 -0
  62. package/rules/flutter/retrofit-networking/SKILL.md +51 -0
  63. package/rules/flutter/retrofit-networking/references/REFERENCE.md +19 -0
  64. package/rules/flutter/retrofit-networking/references/token-refresh.md +40 -0
  65. package/rules/flutter/riverpod-state-management/SKILL.md +53 -0
  66. package/rules/flutter/riverpod-state-management/references/architecture.md +124 -0
  67. package/rules/flutter/riverpod-state-management/references/best-practices.md +89 -0
  68. package/rules/flutter/riverpod-state-management/references/testing.md +73 -0
  69. package/rules/flutter/riverpod.rule.md +78 -0
  70. package/rules/flutter/security/SKILL.md +33 -0
  71. package/rules/flutter/security/references/REFERENCE.md +15 -0
  72. package/rules/flutter/security/references/network-security.md +28 -0
  73. package/rules/flutter/testing/SKILL.md +44 -0
  74. package/rules/flutter/testing/references/REFERENCE.md +21 -0
  75. package/rules/flutter/testing/references/bloc-testing.md +38 -0
  76. package/rules/flutter/testing/references/integration-testing.md +128 -0
  77. package/rules/flutter/testing/references/robot-pattern.md +82 -0
  78. package/rules/flutter/testing/references/unit-testing.md +130 -0
  79. package/rules/flutter/testing/references/widget-testing.md +120 -0
  80. package/rules/flutter/widgets/SKILL.md +37 -0
  81. package/rules/golang/chi-router/SKILL.md +219 -0
  82. package/rules/golang/chi-router/references/REFERENCE.md +13 -0
  83. package/rules/golang/chi-router/references/routing-patterns.md +205 -0
  84. package/rules/golang/cobra-cli/SKILL.md +227 -0
  85. package/rules/golang/cobra-cli/references/REFERENCE.md +13 -0
  86. package/rules/golang/cobra-cli/references/command-patterns.md +224 -0
  87. package/rules/golang/core/SKILL.md +210 -0
  88. package/rules/golang/core/references/REFERENCE.md +14 -0
  89. package/rules/golang/core/references/concurrency-patterns.md +114 -0
  90. package/rules/golang/core/references/error-handling.md +87 -0
  91. package/rules/golang/echo-framework/SKILL.md +215 -0
  92. package/rules/golang/echo-framework/references/REFERENCE.md +14 -0
  93. package/rules/golang/echo-framework/references/middleware-patterns.md +141 -0
  94. package/rules/golang/echo-framework/references/routing-patterns.md +140 -0
  95. package/rules/golang/ent-orm/SKILL.md +239 -0
  96. package/rules/golang/ent-orm/references/REFERENCE.md +13 -0
  97. package/rules/golang/ent-orm/references/schema-patterns.md +255 -0
  98. package/rules/golang/fiber-framework/SKILL.md +196 -0
  99. package/rules/golang/fiber-framework/references/REFERENCE.md +13 -0
  100. package/rules/golang/fiber-framework/references/routing-patterns.md +191 -0
  101. package/rules/golang/gin-framework/SKILL.md +205 -0
  102. package/rules/golang/gin-framework/references/REFERENCE.md +14 -0
  103. package/rules/golang/gin-framework/references/middleware-patterns.md +119 -0
  104. package/rules/golang/gorm-orm/SKILL.md +196 -0
  105. package/rules/golang/gorm-orm/references/REFERENCE.md +14 -0
  106. package/rules/golang/gorm-orm/references/model-definitions.md +167 -0
  107. package/rules/golang/gorm-orm/references/query-patterns.md +161 -0
  108. package/rules/golang/grpc/SKILL.md +231 -0
  109. package/rules/golang/grpc/references/REFERENCE.md +13 -0
  110. package/rules/golang/grpc/references/service-patterns.md +276 -0
  111. package/rules/golang/testify/SKILL.md +239 -0
  112. package/rules/golang/testify/references/REFERENCE.md +13 -0
  113. package/rules/golang/testify/references/assert-patterns.md +170 -0
  114. package/rules/golang/validator/SKILL.md +234 -0
  115. package/rules/golang/validator/references/REFERENCE.md +13 -0
  116. package/rules/golang/validator/references/validation-tags.md +211 -0
  117. package/rules/golang/viper-config/SKILL.md +244 -0
  118. package/rules/golang/viper-config/references/REFERENCE.md +13 -0
  119. package/rules/golang/viper-config/references/config-loading.md +181 -0
  120. package/rules/golang/wire-di/SKILL.md +243 -0
  121. package/rules/golang/wire-di/references/REFERENCE.md +13 -0
  122. package/rules/golang/wire-di/references/provider-patterns.md +193 -0
  123. package/rules/golang/zap-logging/SKILL.md +203 -0
  124. package/rules/golang/zap-logging/references/REFERENCE.md +13 -0
  125. package/rules/golang/zap-logging/references/logger-config.md +165 -0
  126. package/rules/java/build-gradle/SKILL.md +92 -0
  127. package/rules/java/build-gradle/references/REFERENCE.md +14 -0
  128. package/rules/java/build-gradle/references/kotlin-dsl.md +118 -0
  129. package/rules/java/build-gradle/references/task-configuration.md +132 -0
  130. package/rules/java/build-maven/SKILL.md +86 -0
  131. package/rules/java/build-maven/references/REFERENCE.md +14 -0
  132. package/rules/java/build-maven/references/dependency-management.md +111 -0
  133. package/rules/java/build-maven/references/lifecycle-phases.md +114 -0
  134. package/rules/java/graalvm-native/SKILL.md +105 -0
  135. package/rules/java/graalvm-native/references/REFERENCE.md +12 -0
  136. package/rules/java/java-collections-streams/SKILL.md +148 -0
  137. package/rules/java/java-collections-streams/references/REFERENCE.md +15 -0
  138. package/rules/java/java-collections-streams/references/collectors-patterns.md +178 -0
  139. package/rules/java/java-collections-streams/references/stream-pipelines.md +165 -0
  140. package/rules/java/java-concurrency/SKILL.md +187 -0
  141. package/rules/java/java-concurrency/references/REFERENCE.md +17 -0
  142. package/rules/java/java-concurrency/references/completable-future.md +165 -0
  143. package/rules/java/java-concurrency/references/executor-patterns.md +176 -0
  144. package/rules/java/java-concurrency/references/virtual-threads.md +190 -0
  145. package/rules/java/java-core-language/SKILL.md +121 -0
  146. package/rules/java/java-core-language/references/REFERENCE.md +15 -0
  147. package/rules/java/java-core-language/references/jvm-memory-model.md +160 -0
  148. package/rules/java/java-core-language/references/modern-java-features.md +168 -0
  149. package/rules/java/java-project-structure/SKILL.md +195 -0
  150. package/rules/java/java-project-structure/references/REFERENCE.md +15 -0
  151. package/rules/java/java-project-structure/references/maven-project-layout.md +199 -0
  152. package/rules/java/java-project-structure/references/module-system.md +159 -0
  153. package/rules/java/micronaut-core/SKILL.md +99 -0
  154. package/rules/java/micronaut-core/references/REFERENCE.md +12 -0
  155. package/rules/java/micronaut-reactive/SKILL.md +68 -0
  156. package/rules/java/micronaut-reactive/references/REFERENCE.md +12 -0
  157. package/rules/java/quarkus-core/SKILL.md +85 -0
  158. package/rules/java/quarkus-core/references/REFERENCE.md +12 -0
  159. package/rules/java/quarkus-reactive/SKILL.md +67 -0
  160. package/rules/java/quarkus-reactive/references/REFERENCE.md +12 -0
  161. package/rules/java/spring-batch/SKILL.md +102 -0
  162. package/rules/java/spring-batch/references/REFERENCE.md +12 -0
  163. package/rules/java/spring-boot-architecture/SKILL.md +206 -0
  164. package/rules/java/spring-boot-architecture/references/REFERENCE.md +15 -0
  165. package/rules/java/spring-boot-architecture/references/auto-configuration.md +158 -0
  166. package/rules/java/spring-boot-architecture/references/configuration-properties.md +202 -0
  167. package/rules/java/spring-boot-web/SKILL.md +217 -0
  168. package/rules/java/spring-boot-web/references/REFERENCE.md +17 -0
  169. package/rules/java/spring-cloud/SKILL.md +109 -0
  170. package/rules/java/spring-cloud/references/REFERENCE.md +13 -0
  171. package/rules/java/spring-data-jpa/SKILL.md +241 -0
  172. package/rules/java/spring-data-jpa/references/REFERENCE.md +16 -0
  173. package/rules/java/spring-security/SKILL.md +161 -0
  174. package/rules/java/spring-security/references/REFERENCE.md +16 -0
  175. package/rules/java/spring-security/references/jwt-auth-flow.md +213 -0
  176. package/rules/java/testing-junit-mockito/SKILL.md +135 -0
  177. package/rules/java/testing-junit-mockito/references/REFERENCE.md +15 -0
  178. package/rules/java/testing-junit-mockito/references/junit5-patterns.md +159 -0
  179. package/rules/java/testing-junit-mockito/references/mockito-patterns.md +148 -0
  180. package/rules/java/testing-junit-mockito/references/spring-boot-testing.md +152 -0
  181. package/rules/javascript/best-practices/SKILL.md +64 -0
  182. package/rules/javascript/best-practices/references/REFERENCE.md +91 -0
  183. package/rules/javascript/language/SKILL.md +71 -0
  184. package/rules/javascript/language/references/REFERENCE.md +106 -0
  185. package/rules/javascript/tooling/SKILL.md +60 -0
  186. package/rules/javascript/tooling/references/REFERENCE.md +107 -0
  187. package/rules/metadata.json +54 -0
  188. package/rules/nestjs/api-standards/SKILL.md +47 -0
  189. package/rules/nestjs/api-standards/references/pagination-wrapper.md +87 -0
  190. package/rules/nestjs/architecture/SKILL.md +68 -0
  191. package/rules/nestjs/architecture/references/dynamic-module.md +53 -0
  192. package/rules/nestjs/caching/SKILL.md +51 -0
  193. package/rules/nestjs/caching/references/REFERENCE.md +13 -0
  194. package/rules/nestjs/caching/references/cache-patterns.md +183 -0
  195. package/rules/nestjs/configuration/SKILL.md +41 -0
  196. package/rules/nestjs/configuration/references/REFERENCE.md +13 -0
  197. package/rules/nestjs/configuration/references/config-patterns.md +184 -0
  198. package/rules/nestjs/controllers-services/SKILL.md +63 -0
  199. package/rules/nestjs/controllers-services/references/REFERENCE.md +14 -0
  200. package/rules/nestjs/controllers-services/references/controller-patterns.md +119 -0
  201. package/rules/nestjs/controllers-services/references/service-patterns.md +129 -0
  202. package/rules/nestjs/database/SKILL.md +102 -0
  203. package/rules/nestjs/database/references/REFERENCE.md +14 -0
  204. package/rules/nestjs/database/references/typeorm-patterns.md +156 -0
  205. package/rules/nestjs/deployment/SKILL.md +36 -0
  206. package/rules/nestjs/deployment/references/REFERENCE.md +13 -0
  207. package/rules/nestjs/deployment/references/deployment-patterns.md +140 -0
  208. package/rules/nestjs/documentation/SKILL.md +64 -0
  209. package/rules/nestjs/documentation/references/REFERENCE.md +13 -0
  210. package/rules/nestjs/documentation/references/swagger-patterns.md +139 -0
  211. package/rules/nestjs/error-handling/SKILL.md +55 -0
  212. package/rules/nestjs/error-handling/references/REFERENCE.md +13 -0
  213. package/rules/nestjs/error-handling/references/exception-filters.md +152 -0
  214. package/rules/nestjs/file-uploads/SKILL.md +35 -0
  215. package/rules/nestjs/file-uploads/references/REFERENCE.md +13 -0
  216. package/rules/nestjs/file-uploads/references/upload-patterns.md +125 -0
  217. package/rules/nestjs/observability/SKILL.md +39 -0
  218. package/rules/nestjs/observability/references/REFERENCE.md +13 -0
  219. package/rules/nestjs/observability/references/logging-metrics.md +175 -0
  220. package/rules/nestjs/performance/SKILL.md +60 -0
  221. package/rules/nestjs/performance/references/REFERENCE.md +13 -0
  222. package/rules/nestjs/performance/references/performance-patterns.md +107 -0
  223. package/rules/nestjs/real-time/SKILL.md +45 -0
  224. package/rules/nestjs/real-time/references/REFERENCE.md +13 -0
  225. package/rules/nestjs/real-time/references/websocket-patterns.md +121 -0
  226. package/rules/nestjs/scheduling/SKILL.md +39 -0
  227. package/rules/nestjs/scheduling/references/REFERENCE.md +13 -0
  228. package/rules/nestjs/scheduling/references/scheduling-patterns.md +137 -0
  229. package/rules/nestjs/search/SKILL.md +41 -0
  230. package/rules/nestjs/search/references/REFERENCE.md +13 -0
  231. package/rules/nestjs/search/references/search-patterns.md +137 -0
  232. package/rules/nestjs/security/SKILL.md +87 -0
  233. package/rules/nestjs/security/references/REFERENCE.md +14 -0
  234. package/rules/nestjs/security/references/authentication.md +151 -0
  235. package/rules/nestjs/testing/SKILL.md +40 -0
  236. package/rules/nestjs/testing/references/REFERENCE.md +14 -0
  237. package/rules/nestjs/testing/references/unit-testing.md +179 -0
  238. package/rules/nestjs/transport/SKILL.md +45 -0
  239. package/rules/nestjs/transport/references/REFERENCE.md +13 -0
  240. package/rules/nestjs/transport/references/microservices-patterns.md +170 -0
  241. package/rules/nextjs/app-router/SKILL.md +46 -0
  242. package/rules/nextjs/app-router/references/REFERENCE.md +14 -0
  243. package/rules/nextjs/app-router/references/routing-patterns.md +182 -0
  244. package/rules/nextjs/architecture/SKILL.md +44 -0
  245. package/rules/nextjs/architecture/references/fsd-structure.md +77 -0
  246. package/rules/nextjs/authentication/SKILL.md +29 -0
  247. package/rules/nextjs/authentication/references/auth-implementation.md +73 -0
  248. package/rules/nextjs/caching/SKILL.md +66 -0
  249. package/rules/nextjs/caching/references/REFERENCE.md +13 -0
  250. package/rules/nextjs/caching/references/cache-strategies.md +168 -0
  251. package/rules/nextjs/data-access-layer/SKILL.md +33 -0
  252. package/rules/nextjs/data-access-layer/references/patterns.md +66 -0
  253. package/rules/nextjs/data-fetching/SKILL.md +59 -0
  254. package/rules/nextjs/data-fetching/references/REFERENCE.md +13 -0
  255. package/rules/nextjs/data-fetching/references/fetch-patterns.md +160 -0
  256. package/rules/nextjs/internationalization/SKILL.md +105 -0
  257. package/rules/nextjs/internationalization/references/REFERENCE.md +13 -0
  258. package/rules/nextjs/internationalization/references/i18n-patterns.md +180 -0
  259. package/rules/nextjs/optimization/SKILL.md +64 -0
  260. package/rules/nextjs/optimization/references/REFERENCE.md +13 -0
  261. package/rules/nextjs/optimization/references/optimization-patterns.md +190 -0
  262. package/rules/nextjs/rendering/SKILL.md +91 -0
  263. package/rules/nextjs/rendering/references/REFERENCE.md +13 -0
  264. package/rules/nextjs/rendering/references/rendering-modes.md +163 -0
  265. package/rules/nextjs/server-actions/SKILL.md +46 -0
  266. package/rules/nextjs/server-actions/references/REFERENCE.md +13 -0
  267. package/rules/nextjs/server-actions/references/action-patterns.md +188 -0
  268. package/rules/nextjs/server-components/SKILL.md +52 -0
  269. package/rules/nextjs/server-components/references/REFERENCE.md +13 -0
  270. package/rules/nextjs/server-components/references/component-patterns.md +175 -0
  271. package/rules/nextjs/state-management/SKILL.md +73 -0
  272. package/rules/nextjs/state-management/references/REFERENCE.md +13 -0
  273. package/rules/nextjs/state-management/references/state-patterns.md +218 -0
  274. package/rules/nextjs/styling/SKILL.md +31 -0
  275. package/rules/nextjs/styling/references/implementation.md +56 -0
  276. package/rules/react/component-patterns/SKILL.md +66 -0
  277. package/rules/react/component-patterns/references/REFERENCE.md +126 -0
  278. package/rules/react/hooks/SKILL.md +60 -0
  279. package/rules/react/hooks/references/REFERENCE.md +132 -0
  280. package/rules/react/hooks.rule.md +79 -0
  281. package/rules/react/performance/SKILL.md +69 -0
  282. package/rules/react/performance/references/REFERENCE.md +143 -0
  283. package/rules/react/security/SKILL.md +46 -0
  284. package/rules/react/security/references/REFERENCE.md +170 -0
  285. package/rules/react/state-management/SKILL.md +56 -0
  286. package/rules/react/state-management/references/REFERENCE.md +137 -0
  287. package/rules/react/testing/SKILL.md +45 -0
  288. package/rules/react/testing/references/REFERENCE.md +149 -0
  289. package/rules/react/tooling/SKILL.md +39 -0
  290. package/rules/react/typescript/SKILL.md +53 -0
  291. package/rules/rust/actix-web/SKILL.md +160 -0
  292. package/rules/rust/actix-web/references/REFERENCE.md +13 -0
  293. package/rules/rust/actix-web/references/handler-patterns.md +198 -0
  294. package/rules/rust/async-graphql/SKILL.md +228 -0
  295. package/rules/rust/async-graphql/references/REFERENCE.md +13 -0
  296. package/rules/rust/async-graphql/references/schema-patterns.md +215 -0
  297. package/rules/rust/axum/SKILL.md +161 -0
  298. package/rules/rust/axum/references/REFERENCE.md +14 -0
  299. package/rules/rust/axum/references/handler-patterns.md +97 -0
  300. package/rules/rust/bevy/SKILL.md +206 -0
  301. package/rules/rust/bevy/references/REFERENCE.md +13 -0
  302. package/rules/rust/bevy/references/ecs-patterns.md +226 -0
  303. package/rules/rust/clap/SKILL.md +217 -0
  304. package/rules/rust/clap/references/REFERENCE.md +13 -0
  305. package/rules/rust/clap/references/derive-patterns.md +205 -0
  306. package/rules/rust/core/SKILL.md +154 -0
  307. package/rules/rust/core/references/REFERENCE.md +14 -0
  308. package/rules/rust/core/references/error-handling.md +92 -0
  309. package/rules/rust/diesel-orm/SKILL.md +176 -0
  310. package/rules/rust/diesel-orm/references/REFERENCE.md +13 -0
  311. package/rules/rust/diesel-orm/references/schema-patterns.md +206 -0
  312. package/rules/rust/rocket/SKILL.md +182 -0
  313. package/rules/rust/rocket/references/REFERENCE.md +13 -0
  314. package/rules/rust/rocket/references/handler-patterns.md +209 -0
  315. package/rules/rust/sea-orm/SKILL.md +230 -0
  316. package/rules/rust/sea-orm/references/REFERENCE.md +13 -0
  317. package/rules/rust/sea-orm/references/entity-patterns.md +221 -0
  318. package/rules/rust/serde-serialization/SKILL.md +150 -0
  319. package/rules/rust/serde-serialization/references/REFERENCE.md +13 -0
  320. package/rules/rust/serde-serialization/references/serialization-patterns.md +199 -0
  321. package/rules/rust/sqlx-database/SKILL.md +140 -0
  322. package/rules/rust/sqlx-database/references/REFERENCE.md +13 -0
  323. package/rules/rust/sqlx-database/references/query-patterns.md +210 -0
  324. package/rules/rust/tauri/SKILL.md +180 -0
  325. package/rules/rust/tauri/references/REFERENCE.md +13 -0
  326. package/rules/rust/tauri/references/command-patterns.md +209 -0
  327. package/rules/rust/tokio-runtime/SKILL.md +167 -0
  328. package/rules/rust/tokio-runtime/references/REFERENCE.md +14 -0
  329. package/rules/rust/tokio-runtime/references/async-patterns.md +137 -0
  330. package/rules/rust/tokio-runtime/references/synchronization.md +152 -0
  331. package/rules/rust/tonic/SKILL.md +231 -0
  332. package/rules/rust/tonic/references/REFERENCE.md +13 -0
  333. package/rules/rust/tonic/references/service-patterns.md +213 -0
  334. package/rules/rust/tracing/SKILL.md +214 -0
  335. package/rules/rust/tracing/references/REFERENCE.md +13 -0
  336. package/rules/rust/tracing/references/instrumentation.md +187 -0
  337. package/rules/typescript/best-practices/SKILL.md +108 -0
  338. package/rules/typescript/best-practices/references/REFERENCE.md +68 -0
  339. package/rules/typescript/language/SKILL.md +72 -0
  340. package/rules/typescript/language/references/REFERENCE.md +67 -0
  341. package/rules/typescript/patterns.rule.md +85 -0
  342. package/rules/typescript/security/SKILL.md +59 -0
  343. package/rules/typescript/security/references/REFERENCE.md +113 -0
  344. package/rules/typescript/tooling/SKILL.md +52 -0
  345. package/rules/typescript/tooling/references/REFERENCE.md +110 -0
@@ -0,0 +1,120 @@
1
+ # Widget Testing Strategies
2
+
3
+ Widget tests verify the UI and interaction of valid widgets in a simulated environment (headless).
4
+
5
+ ## Core Rules
6
+
7
+ 1. **Wrapper**: Always wrap widgets in `MaterialApp`/`CupertinoApp` to provide Theme/Navigator context.
8
+ 2. **Pump**:
9
+ - `pump()`: Triggers a frame.
10
+ - `pumpAndSettle()`: Wait for all animations to complete.
11
+ 3. **Finders**: Use semantic finders (`find.text`, `find.byKey`, `find.byType`) to locate elements.
12
+
13
+ ## Advanced: The Robot Pattern
14
+
15
+ For complex screens, avoid scattering `find.by...` references throughout your tests. Use a **Robot** to encapsulate UI interactions.
16
+
17
+ Reference: [Robot Pattern Implementation](./robot-pattern.md)
18
+
19
+ ### Updated Example: Testing a Login Screen
20
+
21
+ ```dart
22
+ import 'package:flutter_test/flutter_test.dart';
23
+ import 'package:flutter_bloc/flutter_bloc.dart';
24
+ import 'package:mocktail/mocktail.dart';
25
+ import 'robots/login_robot.dart'; // Import your robot
26
+
27
+ void main() {
28
+ late MockAuthBloc mockAuthBloc;
29
+
30
+ setUp(() {
31
+ mockAuthBloc = MockAuthBloc();
32
+ when(() => mockAuthBloc.state).thenReturn(AuthInitial());
33
+ });
34
+
35
+ Widget createWidget() {
36
+ return MaterialApp(
37
+ home: BlocProvider<AuthBloc>.value(
38
+ value: mockAuthBloc,
39
+ child: LoginScreen(),
40
+ ),
41
+ );
42
+ }
43
+
44
+ testWidgets('shows loading indicator when state is Loading', (tester) async {
45
+ // ARRANGE
46
+ when(() => mockAuthBloc.state).thenReturn(AuthLoading());
47
+ final robot = LoginRobot(tester);
48
+
49
+ // ACT
50
+ await tester.pumpWidget(createWidget());
51
+
52
+ // ASSERT
53
+ robot.expectLoadingVisible();
54
+ });
55
+
56
+ testWidgets('triggers login event on button tap', (tester) async {
57
+ // ARRANGE
58
+ final robot = LoginRobot(tester);
59
+ await tester.pumpWidget(createWidget());
60
+
61
+ // ACT
62
+ await robot.enterEmail('test@example.com');
63
+ await robot.enterPassword('password123');
64
+ await robot.tapLogin();
65
+
66
+ // ASSERT
67
+ verify(() => mockAuthBloc.add(LoginSubmitted(
68
+ email: 'test@example.com',
69
+ password: 'password123'
70
+ ))).called(1);
71
+ });
72
+ }
73
+ ```
74
+
75
+ ## Handling Screen Variability
76
+
77
+ One of the most common mistakes is testing only on the default 800x600 surface.
78
+
79
+ ### 1. Multi-Screen Golden Tests
80
+
81
+ Use `golden_toolkit` to verify responsive layouts across multiple devices.
82
+
83
+ ```dart
84
+ testGoldens('Login Screen responsive layout', (tester) async {
85
+ final builder = DeviceBuilder()
86
+ ..overrideDevicesForAllScenarios(devices: [
87
+ Device.phone,
88
+ Device.iphone11,
89
+ Device.tabletPortrait,
90
+ Device.tabletLandscape,
91
+ ])
92
+ ..addScenario(
93
+ widget: LoginScreen(),
94
+ name: 'Default State',
95
+ );
96
+
97
+ await tester.pumpDeviceBuilder(builder);
98
+ await screenMatchesGolden(tester, 'login_screen_responsive');
99
+ });
100
+ ```
101
+
102
+ ### 2. Manual Screen Resizing
103
+
104
+ If not using goldens, explicitly force screen sizes to test overflows.
105
+
106
+ ```dart
107
+ testWidgets('Login on small screen', (tester) async {
108
+ // Set Surface Size to a small phone
109
+ tester.binding.window.physicalSizeTestValue = Size(320, 480);
110
+ tester.binding.window.devicePixelRatioTestValue = 1.0;
111
+ addTearDown(tester.binding.window.clearPhysicalSizeTestValue);
112
+
113
+ await tester.pumpWidget(createWidget());
114
+
115
+ // Verify no overflow errors
116
+ expect(tester.takeException(), isNull);
117
+ // Using a custom finder to check if something is visible only on scroll
118
+ await tester.scrollUntilVisible(find.text('Login'), 50);
119
+ });
120
+ ```
@@ -0,0 +1,37 @@
1
+ ---
2
+ name: Flutter UI Widgets
3
+ description: Principles for maintainable UI components.
4
+ metadata:
5
+ labels: [ui, widgets]
6
+ triggers:
7
+ files: ['**_page.dart', '**_screen.dart', '**/widgets/**']
8
+ keywords: [StatelessWidget, const, Theme, ListView]
9
+ ---
10
+
11
+ # UI & Widgets (P1)
12
+
13
+ - **State**: Use `StatelessWidget` by default. `StatefulWidget` only for local state/controllers.
14
+ - **Composition**: Extract UI into small, atomic `const` widgets.
15
+ - **Theming**: Use `Theme.of(context)`. No hardcoded colors.
16
+ - **Layout**: Use `Flex` + `Gap/SizedBox`.
17
+ - **Specialized**:
18
+ - `SelectionArea`: For multi-widget text selection.
19
+ - `InteractiveViewer`: For zoom/pan.
20
+ - `ListWheelScrollView`: For pickers.
21
+ - `IntrinsicWidth/Height`: Avoid unless strictly required.
22
+ - **Large Lists**: Always use `ListView.builder`.
23
+
24
+ ```dart
25
+ class AppButton extends StatelessWidget {
26
+ final String label;
27
+ final VoidCallback onPressed;
28
+ const AppButton({super.key, required this.label, required this.onPressed});
29
+
30
+ @override
31
+ Widget build(BuildContext context) => ElevatedButton(onPressed: onPressed, child: Text(label));
32
+ }
33
+ ```
34
+
35
+ ## Related Topics
36
+
37
+ performance | testing
@@ -0,0 +1,219 @@
1
+ ---
2
+ name: Chi Router
3
+ description: Lightweight, composable Go HTTP router built on net/http.
4
+ metadata:
5
+ labels: [golang, chi, router, http]
6
+ triggers:
7
+ files: ['**/main.go', '**/routes.go']
8
+ keywords: [chi, chi.NewRouter, chi.Router, r.Route]
9
+ ---
10
+
11
+ # Chi Router Standards
12
+
13
+ ## Router Setup
14
+
15
+ ```go
16
+ package main
17
+
18
+ import (
19
+ "net/http"
20
+ "github.com/go-chi/chi/v5"
21
+ "github.com/go-chi/chi/v5/middleware"
22
+ )
23
+
24
+ func main() {
25
+ r := chi.NewRouter()
26
+
27
+ // Middleware
28
+ r.Use(middleware.Logger)
29
+ r.Use(middleware.Recoverer)
30
+ r.Use(middleware.RequestID)
31
+ r.Use(middleware.RealIP)
32
+
33
+ // Routes
34
+ r.Get("/", homeHandler)
35
+ r.Get("/users/{id}", getUser)
36
+ r.Post("/users", createUser)
37
+
38
+ // Sub-routers
39
+ r.Route("/api/v1", func(r chi.Router) {
40
+ r.Get("/items", listItems)
41
+ r.Post("/items", createItem)
42
+ })
43
+
44
+ http.ListenAndServe(":8080", r)
45
+ }
46
+ ```
47
+
48
+ ## Handlers
49
+
50
+ ```go
51
+ // Path parameters
52
+ func getUser(w http.ResponseWriter, r *http.Request) {
53
+ id := chi.URLParam(r, "id")
54
+ user, err := findUser(id)
55
+ if err != nil {
56
+ http.Error(w, "Not found", http.StatusNotFound)
57
+ return
58
+ }
59
+ json.NewEncoder(w).Encode(user)
60
+ }
61
+
62
+ // Query parameters
63
+ func listUsers(w http.ResponseWriter, r *http.Request) {
64
+ page := r.URL.Query().Get("page")
65
+ limit := r.URL.Query().Get("limit")
66
+ users := fetchUsers(page, limit)
67
+ json.NewEncoder(w).Encode(users)
68
+ }
69
+
70
+ // JSON body
71
+ func createUser(w http.ResponseWriter, r *http.Request) {
72
+ var req CreateUserRequest
73
+ if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
74
+ http.Error(w, err.Error(), http.StatusBadRequest)
75
+ return
76
+ }
77
+ user := insertUser(req)
78
+ w.WriteHeader(http.StatusCreated)
79
+ json.NewEncoder(w).Encode(user)
80
+ }
81
+ ```
82
+
83
+ ## Middleware
84
+
85
+ ```go
86
+ // Built-in middleware
87
+ r.Use(middleware.Logger) // Logs requests
88
+ r.Use(middleware.Recoverer) // Panic recovery
89
+ r.Use(middleware.RequestID) // Request ID header
90
+ r.Use(middleware.RealIP) // Real IP from headers
91
+ r.Use(middleware.Compress(5)) // Gzip compression
92
+ r.Use(middleware.Timeout(60 * time.Second))
93
+
94
+ // Custom middleware
95
+ func authMiddleware(next http.Handler) http.Handler {
96
+ return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
97
+ token := r.Header.Get("Authorization")
98
+ if token == "" {
99
+ http.Error(w, "Unauthorized", http.StatusUnauthorized)
100
+ return
101
+ }
102
+
103
+ user, err := validateToken(token)
104
+ if err != nil {
105
+ http.Error(w, "Invalid token", http.StatusUnauthorized)
106
+ return
107
+ }
108
+
109
+ ctx := context.WithValue(r.Context(), "user", user)
110
+ next.ServeHTTP(w, r.WithContext(ctx))
111
+ })
112
+ }
113
+
114
+ // Apply to group
115
+ r.Route("/api", func(r chi.Router) {
116
+ r.Use(authMiddleware)
117
+ r.Get("/protected", protectedHandler)
118
+ })
119
+ ```
120
+
121
+ ## Route Groups & Nesting
122
+
123
+ ```go
124
+ r.Route("/api/v1", func(r chi.Router) {
125
+ // All routes here prefixed with /api/v1
126
+
127
+ r.Route("/users", func(r chi.Router) {
128
+ r.Get("/", listUsers)
129
+ r.Post("/", createUser)
130
+
131
+ r.Route("/{id}", func(r chi.Router) {
132
+ r.Get("/", getUser)
133
+ r.Put("/", updateUser)
134
+ r.Delete("/", deleteUser)
135
+ })
136
+ })
137
+
138
+ r.Route("/items", func(r chi.Router) {
139
+ r.Get("/", listItems)
140
+ })
141
+ })
142
+ ```
143
+
144
+ ## Mount Sub-Routers
145
+
146
+ ```go
147
+ func main() {
148
+ r := chi.NewRouter()
149
+ r.Mount("/api/v1", apiRouter())
150
+ r.Mount("/admin", adminRouter())
151
+ http.ListenAndServe(":8080", r)
152
+ }
153
+
154
+ func apiRouter() chi.Router {
155
+ r := chi.NewRouter()
156
+ r.Get("/users", listUsers)
157
+ r.Post("/users", createUser)
158
+ return r
159
+ }
160
+
161
+ func adminRouter() chi.Router {
162
+ r := chi.NewRouter()
163
+ r.Use(adminAuthMiddleware)
164
+ r.Get("/stats", getStats)
165
+ return r
166
+ }
167
+ ```
168
+
169
+ ## Context Values
170
+
171
+ ```go
172
+ // Set in middleware
173
+ ctx := context.WithValue(r.Context(), "user", user)
174
+ next.ServeHTTP(w, r.WithContext(ctx))
175
+
176
+ // Get in handler
177
+ user := r.Context().Value("user").(*User)
178
+
179
+ // Type-safe context keys
180
+ type contextKey string
181
+ const userKey contextKey = "user"
182
+
183
+ ctx := context.WithValue(r.Context(), userKey, user)
184
+ user := r.Context().Value(userKey).(*User)
185
+ ```
186
+
187
+ ## Response Helpers
188
+
189
+ ```go
190
+ import "github.com/go-chi/render"
191
+
192
+ type UserResponse struct {
193
+ ID int `json:"id"`
194
+ Name string `json:"name"`
195
+ }
196
+
197
+ func (u *UserResponse) Render(w http.ResponseWriter, r *http.Request) error {
198
+ return nil
199
+ }
200
+
201
+ func getUser(w http.ResponseWriter, r *http.Request) {
202
+ user := &UserResponse{ID: 1, Name: "John"}
203
+ render.Render(w, r, user)
204
+ }
205
+
206
+ // Error response
207
+ func ErrNotFound(w http.ResponseWriter, r *http.Request, err error) {
208
+ render.Status(r, http.StatusNotFound)
209
+ render.JSON(w, r, map[string]string{"error": err.Error()})
210
+ }
211
+ ```
212
+
213
+ ## Best Practices
214
+
215
+ 1. **Standard library**: Chi uses net/http, fully compatible with standard handlers
216
+ 2. **Composition**: Use `r.Route()` for grouping, `r.Mount()` for sub-routers
217
+ 3. **Middleware order**: Apply in order of execution (outer to inner)
218
+ 4. **Context**: Use typed keys for context values
219
+ 5. **Testing**: Use `httptest` - Chi handlers are standard `http.Handler`
@@ -0,0 +1,13 @@
1
+ # Chi Router References
2
+
3
+ ## References
4
+
5
+ - [**Routing Patterns**](routing-patterns.md) - Routes, middleware, subrouters
6
+
7
+ ## Quick Checks
8
+
9
+ - [ ] Lightweight, idiomatic Go router
10
+ - [ ] Middleware chain pattern
11
+ - [ ] URL parameters via chi.URLParam
12
+ - [ ] Subrouters for modular code
13
+ - [ ] Compatible with net/http
@@ -0,0 +1,205 @@
1
+ # Chi Routing Patterns
2
+
3
+ ## Basic Setup
4
+
5
+ ```go
6
+ import (
7
+ "net/http"
8
+ "github.com/go-chi/chi/v5"
9
+ "github.com/go-chi/chi/v5/middleware"
10
+ )
11
+
12
+ func main() {
13
+ r := chi.NewRouter()
14
+
15
+ // Built-in middleware
16
+ r.Use(middleware.Logger)
17
+ r.Use(middleware.Recoverer)
18
+ r.Use(middleware.RequestID)
19
+
20
+ // Routes
21
+ r.Get("/", func(w http.ResponseWriter, r *http.Request) {
22
+ w.Write([]byte("Hello World!"))
23
+ })
24
+
25
+ r.Get("/users/{id}", getUser)
26
+ r.Post("/users", createUser)
27
+
28
+ http.ListenAndServe(":3000", r)
29
+ }
30
+ ```
31
+
32
+ ## Handlers
33
+
34
+ ```go
35
+ import (
36
+ "encoding/json"
37
+ "net/http"
38
+ "github.com/go-chi/chi/v5"
39
+ )
40
+
41
+ func getUser(w http.ResponseWriter, r *http.Request) {
42
+ id := chi.URLParam(r, "id")
43
+
44
+ user := User{ID: id, Name: "John"}
45
+
46
+ w.Header().Set("Content-Type", "application/json")
47
+ json.NewEncoder(w).Encode(user)
48
+ }
49
+
50
+ func createUser(w http.ResponseWriter, r *http.Request) {
51
+ var user User
52
+ if err := json.NewDecoder(r.Body).Decode(&user); err != nil {
53
+ http.Error(w, err.Error(), http.StatusBadRequest)
54
+ return
55
+ }
56
+
57
+ w.WriteHeader(http.StatusCreated)
58
+ json.NewEncoder(w).Encode(user)
59
+ }
60
+ ```
61
+
62
+ ## Route Groups
63
+
64
+ ```go
65
+ func main() {
66
+ r := chi.NewRouter()
67
+
68
+ // API routes
69
+ r.Route("/api", func(r chi.Router) {
70
+ r.Use(apiMiddleware)
71
+
72
+ r.Route("/v1", func(r chi.Router) {
73
+ r.Get("/users", listUsersV1)
74
+ r.Post("/users", createUserV1)
75
+
76
+ r.Route("/users/{id}", func(r chi.Router) {
77
+ r.Get("/", getUser)
78
+ r.Put("/", updateUser)
79
+ r.Delete("/", deleteUser)
80
+ })
81
+ })
82
+ })
83
+
84
+ // Admin routes with auth
85
+ r.Group(func(r chi.Router) {
86
+ r.Use(authMiddleware)
87
+ r.Get("/admin/stats", getStats)
88
+ })
89
+ }
90
+ ```
91
+
92
+ ## Subrouters
93
+
94
+ ```go
95
+ // users.go
96
+ func UsersRouter() chi.Router {
97
+ r := chi.NewRouter()
98
+
99
+ r.Get("/", listUsers)
100
+ r.Post("/", createUser)
101
+ r.Get("/{id}", getUser)
102
+ r.Put("/{id}", updateUser)
103
+ r.Delete("/{id}", deleteUser)
104
+
105
+ return r
106
+ }
107
+
108
+ // orders.go
109
+ func OrdersRouter() chi.Router {
110
+ r := chi.NewRouter()
111
+ r.Get("/", listOrders)
112
+ r.Post("/", createOrder)
113
+ return r
114
+ }
115
+
116
+ // main.go
117
+ func main() {
118
+ r := chi.NewRouter()
119
+
120
+ r.Mount("/users", UsersRouter())
121
+ r.Mount("/orders", OrdersRouter())
122
+
123
+ http.ListenAndServe(":3000", r)
124
+ }
125
+ ```
126
+
127
+ ## Middleware
128
+
129
+ ```go
130
+ // Custom middleware
131
+ func AuthMiddleware(next http.Handler) http.Handler {
132
+ return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
133
+ token := r.Header.Get("Authorization")
134
+ if token == "" {
135
+ http.Error(w, "Unauthorized", http.StatusUnauthorized)
136
+ return
137
+ }
138
+
139
+ // Validate token, add user to context
140
+ ctx := context.WithValue(r.Context(), "user", userID)
141
+ next.ServeHTTP(w, r.WithContext(ctx))
142
+ })
143
+ }
144
+
145
+ // Request-scoped middleware
146
+ func UserCtx(next http.Handler) http.Handler {
147
+ return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
148
+ id := chi.URLParam(r, "id")
149
+ user, err := findUser(id)
150
+ if err != nil {
151
+ http.Error(w, "Not Found", http.StatusNotFound)
152
+ return
153
+ }
154
+ ctx := context.WithValue(r.Context(), "user", user)
155
+ next.ServeHTTP(w, r.WithContext(ctx))
156
+ })
157
+ }
158
+
159
+ // Usage
160
+ r.Route("/users/{id}", func(r chi.Router) {
161
+ r.Use(UserCtx)
162
+ r.Get("/", getUser) // User available in context
163
+ r.Put("/", updateUser)
164
+ })
165
+ ```
166
+
167
+ ## Built-in Middleware
168
+
169
+ ```go
170
+ import "github.com/go-chi/chi/v5/middleware"
171
+
172
+ r.Use(middleware.RequestID) // X-Request-ID header
173
+ r.Use(middleware.RealIP) // X-Real-IP, X-Forwarded-For
174
+ r.Use(middleware.Logger) // Request logging
175
+ r.Use(middleware.Recoverer) // Panic recovery
176
+ r.Use(middleware.Timeout(60 * time.Second))
177
+ r.Use(middleware.Throttle(100)) // Rate limiting
178
+ r.Use(middleware.Compress(5)) // Gzip compression
179
+ r.Use(middleware.AllowContentType("application/json"))
180
+ ```
181
+
182
+ ## Pattern Matching
183
+
184
+ ```go
185
+ // Basic pattern
186
+ r.Get("/users/{id}", handler)
187
+
188
+ // Regex constraint
189
+ r.Get("/articles/{date:\\d{4}-\\d{2}-\\d{2}}", handler)
190
+
191
+ // Catch-all
192
+ r.Get("/files/*", handler) // r.URL.Path contains full path
193
+
194
+ // Not found handler
195
+ r.NotFound(func(w http.ResponseWriter, r *http.Request) {
196
+ w.WriteHeader(http.StatusNotFound)
197
+ w.Write([]byte("Not found"))
198
+ })
199
+
200
+ // Method not allowed
201
+ r.MethodNotAllowed(func(w http.ResponseWriter, r *http.Request) {
202
+ w.WriteHeader(http.StatusMethodNotAllowed)
203
+ w.Write([]byte("Method not allowed"))
204
+ })
205
+ ```