@corbat-tech/coding-standards-mcp 1.0.3 → 2.0.0
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.
- package/README.md +233 -337
- package/dist/agent.d.ts +5 -6
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +95 -217
- package/dist/agent.js.map +1 -1
- package/dist/analysis/code-analyzer.d.ts +44 -0
- package/dist/analysis/code-analyzer.d.ts.map +1 -0
- package/dist/analysis/code-analyzer.js +528 -0
- package/dist/analysis/code-analyzer.js.map +1 -0
- package/dist/errors.d.ts +58 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +112 -0
- package/dist/errors.js.map +1 -0
- package/dist/guardrails.d.ts +35 -0
- package/dist/guardrails.d.ts.map +1 -0
- package/dist/guardrails.js +303 -0
- package/dist/guardrails.js.map +1 -0
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/logger.d.ts +36 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +63 -0
- package/dist/logger.js.map +1 -0
- package/dist/metrics.d.ts +40 -0
- package/dist/metrics.d.ts.map +1 -0
- package/dist/metrics.js +97 -0
- package/dist/metrics.js.map +1 -0
- package/dist/profiles.d.ts +1 -1
- package/dist/profiles.d.ts.map +1 -1
- package/dist/profiles.js +239 -108
- package/dist/profiles.js.map +1 -1
- package/dist/prompts.js +1 -1
- package/dist/prompts.js.map +1 -1
- package/dist/tools/definitions.d.ts +143 -0
- package/dist/tools/definitions.d.ts.map +1 -0
- package/dist/tools/definitions.js +229 -0
- package/dist/tools/definitions.js.map +1 -0
- package/dist/tools/handlers/get-context.d.ts +12 -0
- package/dist/tools/handlers/get-context.d.ts.map +1 -0
- package/dist/tools/handlers/get-context.js +233 -0
- package/dist/tools/handlers/get-context.js.map +1 -0
- package/dist/tools/handlers/health.d.ts +11 -0
- package/dist/tools/handlers/health.d.ts.map +1 -0
- package/dist/tools/handlers/health.js +57 -0
- package/dist/tools/handlers/health.js.map +1 -0
- package/dist/tools/handlers/index.d.ts +12 -0
- package/dist/tools/handlers/index.d.ts.map +1 -0
- package/dist/tools/handlers/index.js +12 -0
- package/dist/tools/handlers/index.js.map +1 -0
- package/dist/tools/handlers/init.d.ts +12 -0
- package/dist/tools/handlers/init.d.ts.map +1 -0
- package/dist/tools/handlers/init.js +102 -0
- package/dist/tools/handlers/init.js.map +1 -0
- package/dist/tools/handlers/profiles.d.ts +11 -0
- package/dist/tools/handlers/profiles.d.ts.map +1 -0
- package/dist/tools/handlers/profiles.js +25 -0
- package/dist/tools/handlers/profiles.js.map +1 -0
- package/dist/tools/handlers/search.d.ts +12 -0
- package/dist/tools/handlers/search.d.ts.map +1 -0
- package/dist/tools/handlers/search.js +58 -0
- package/dist/tools/handlers/search.js.map +1 -0
- package/dist/tools/handlers/validate.d.ts +15 -0
- package/dist/tools/handlers/validate.d.ts.map +1 -0
- package/dist/tools/handlers/validate.js +71 -0
- package/dist/tools/handlers/validate.js.map +1 -0
- package/dist/tools/handlers/verify.d.ts +38 -0
- package/dist/tools/handlers/verify.d.ts.map +1 -0
- package/dist/tools/handlers/verify.js +172 -0
- package/dist/tools/handlers/verify.js.map +1 -0
- package/dist/tools/index.d.ts +22 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +75 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/schemas.d.ts +29 -0
- package/dist/tools/schemas.d.ts.map +1 -0
- package/dist/tools/schemas.js +20 -0
- package/dist/tools/schemas.js.map +1 -0
- package/dist/tools.js +2 -2
- package/dist/tools.js.map +1 -1
- package/dist/types.d.ts +141 -71
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +92 -40
- package/dist/types.js.map +1 -1
- package/package.json +2 -2
- package/profiles/examples/microservice-kafka.yaml +122 -0
- package/profiles/examples/startup-fast.yaml +67 -0
- package/profiles/examples/strict-enterprise.yaml +62 -0
- package/profiles/templates/angular.yaml +614 -0
- package/profiles/templates/csharp-dotnet.yaml +529 -0
- package/profiles/templates/flutter.yaml +547 -0
- package/profiles/templates/go.yaml +1276 -0
- package/profiles/templates/java-spring-backend.yaml +326 -0
- package/profiles/templates/kotlin-spring.yaml +417 -0
- package/profiles/templates/nextjs.yaml +536 -0
- package/profiles/templates/nodejs.yaml +594 -0
- package/profiles/templates/python.yaml +546 -0
- package/profiles/templates/react.yaml +456 -0
- package/profiles/templates/rust.yaml +508 -0
- package/profiles/templates/vue.yaml +483 -0
|
@@ -0,0 +1,417 @@
|
|
|
1
|
+
# ============================================================================
|
|
2
|
+
# CORBAT MCP - Kotlin + Spring Boot Profile
|
|
3
|
+
# ============================================================================
|
|
4
|
+
# Production-ready standards for Kotlin Spring Boot backend applications.
|
|
5
|
+
# Leverages Kotlin's null safety, coroutines, and functional features.
|
|
6
|
+
# ============================================================================
|
|
7
|
+
|
|
8
|
+
name: "Kotlin Spring Boot Standards"
|
|
9
|
+
description: "Production-ready standards for Kotlin Spring Boot with coroutines, null safety, and idiomatic Kotlin patterns"
|
|
10
|
+
|
|
11
|
+
# ----------------------------------------------------------------------------
|
|
12
|
+
# ARCHITECTURE
|
|
13
|
+
# ----------------------------------------------------------------------------
|
|
14
|
+
architecture:
|
|
15
|
+
type: hexagonal
|
|
16
|
+
enforceLayerDependencies: true
|
|
17
|
+
layers:
|
|
18
|
+
- name: domain
|
|
19
|
+
description: "Core business logic. Pure Kotlin with no external dependencies. Contains entities, value objects, and domain interfaces."
|
|
20
|
+
allowedDependencies: []
|
|
21
|
+
packages:
|
|
22
|
+
- "*.domain"
|
|
23
|
+
- "*.domain.model"
|
|
24
|
+
- "*.domain.event"
|
|
25
|
+
- "*.domain.exception"
|
|
26
|
+
- "*.domain.port"
|
|
27
|
+
- "*.domain.service"
|
|
28
|
+
|
|
29
|
+
- name: application
|
|
30
|
+
description: "Use cases and application services. Orchestrates domain objects. Contains commands, queries, and handlers."
|
|
31
|
+
allowedDependencies:
|
|
32
|
+
- domain
|
|
33
|
+
packages:
|
|
34
|
+
- "*.application"
|
|
35
|
+
- "*.application.usecase"
|
|
36
|
+
- "*.application.service"
|
|
37
|
+
|
|
38
|
+
- name: infrastructure
|
|
39
|
+
description: "External adapters: REST controllers, database repositories, messaging, external APIs."
|
|
40
|
+
allowedDependencies:
|
|
41
|
+
- domain
|
|
42
|
+
- application
|
|
43
|
+
packages:
|
|
44
|
+
- "*.infrastructure"
|
|
45
|
+
- "*.infrastructure.adapter"
|
|
46
|
+
- "*.infrastructure.config"
|
|
47
|
+
- "*.infrastructure.persistence"
|
|
48
|
+
|
|
49
|
+
# ----------------------------------------------------------------------------
|
|
50
|
+
# KOTLIN FEATURES
|
|
51
|
+
# ----------------------------------------------------------------------------
|
|
52
|
+
kotlinFeatures:
|
|
53
|
+
enabled: true
|
|
54
|
+
|
|
55
|
+
nullSafety:
|
|
56
|
+
enforced: true
|
|
57
|
+
avoidDoubleBang: true
|
|
58
|
+
preferSafeCall: true
|
|
59
|
+
useElvisOperator: true
|
|
60
|
+
useLetForNullable: true
|
|
61
|
+
examples:
|
|
62
|
+
- "Use ?. instead of !!"
|
|
63
|
+
- "Use ?: for default values"
|
|
64
|
+
- "Use ?.let { } for nullable transformations"
|
|
65
|
+
- "Use requireNotNull() only when null is a bug"
|
|
66
|
+
|
|
67
|
+
coroutines:
|
|
68
|
+
enabled: true
|
|
69
|
+
framework: "kotlinx-coroutines"
|
|
70
|
+
structuredConcurrency: true
|
|
71
|
+
patterns:
|
|
72
|
+
suspendFunctions: true
|
|
73
|
+
flowForStreams: true
|
|
74
|
+
asyncAwait: true
|
|
75
|
+
withContext: true
|
|
76
|
+
supervisorScope: true
|
|
77
|
+
springIntegration:
|
|
78
|
+
webFlux: true
|
|
79
|
+
r2dbc: true
|
|
80
|
+
coRouter: true
|
|
81
|
+
avoid:
|
|
82
|
+
- "runBlocking in production code"
|
|
83
|
+
- "GlobalScope"
|
|
84
|
+
- "Blocking calls in coroutines"
|
|
85
|
+
examples:
|
|
86
|
+
- |
|
|
87
|
+
suspend fun getOrder(id: OrderId): Order {
|
|
88
|
+
return withContext(Dispatchers.IO) {
|
|
89
|
+
orderRepository.findById(id)
|
|
90
|
+
?: throw OrderNotFoundException(id)
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
dataClasses:
|
|
95
|
+
useForDTOs: true
|
|
96
|
+
useForValueObjects: true
|
|
97
|
+
useForEvents: true
|
|
98
|
+
immutableByDefault: true
|
|
99
|
+
examples:
|
|
100
|
+
- "data class OrderCreatedEvent(val orderId: OrderId, val createdAt: Instant)"
|
|
101
|
+
- "data class CreateOrderRequest(val customerId: CustomerId, val items: List<OrderItem>)"
|
|
102
|
+
|
|
103
|
+
sealedClasses:
|
|
104
|
+
useForDomainStates: true
|
|
105
|
+
useForResults: true
|
|
106
|
+
useForErrors: true
|
|
107
|
+
examples:
|
|
108
|
+
- |
|
|
109
|
+
sealed class OrderStatus {
|
|
110
|
+
data object Pending : OrderStatus()
|
|
111
|
+
data class Confirmed(val confirmedAt: Instant) : OrderStatus()
|
|
112
|
+
data class Shipped(val trackingNumber: String) : OrderStatus()
|
|
113
|
+
data class Delivered(val deliveredAt: Instant) : OrderStatus()
|
|
114
|
+
data class Cancelled(val reason: String) : OrderStatus()
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
extensionFunctions:
|
|
118
|
+
useForUtilities: true
|
|
119
|
+
useForDSLs: true
|
|
120
|
+
avoidOveruse: true
|
|
121
|
+
examples:
|
|
122
|
+
- "fun String.toOrderId(): OrderId = OrderId(this)"
|
|
123
|
+
- "fun Order.isShippable(): Boolean = status == OrderStatus.Confirmed"
|
|
124
|
+
|
|
125
|
+
scopeFunctions:
|
|
126
|
+
let: "Nullable transformations and scope limiting"
|
|
127
|
+
run: "Object configuration and computing result"
|
|
128
|
+
with: "Grouping function calls on an object"
|
|
129
|
+
apply: "Object configuration returning the object"
|
|
130
|
+
also: "Additional actions (logging, validation)"
|
|
131
|
+
examples:
|
|
132
|
+
- "order?.let { repository.save(it) }"
|
|
133
|
+
- "Order().apply { addItem(item); setCustomer(customer) }"
|
|
134
|
+
|
|
135
|
+
# ----------------------------------------------------------------------------
|
|
136
|
+
# CODE QUALITY
|
|
137
|
+
# ----------------------------------------------------------------------------
|
|
138
|
+
codeQuality:
|
|
139
|
+
maxMethodLines: 20
|
|
140
|
+
maxClassLines: 200
|
|
141
|
+
maxFileLines: 400
|
|
142
|
+
maxMethodParameters: 4
|
|
143
|
+
maxCyclomaticComplexity: 10
|
|
144
|
+
requireDocumentation: true
|
|
145
|
+
requireTests: true
|
|
146
|
+
minimumTestCoverage: 80
|
|
147
|
+
|
|
148
|
+
principles:
|
|
149
|
+
- "Prefer val over var"
|
|
150
|
+
- "Prefer immutability"
|
|
151
|
+
- "Leverage the type system"
|
|
152
|
+
- "Use sealed classes for finite states"
|
|
153
|
+
- "Prefer expressions over statements"
|
|
154
|
+
- "Use data classes for data"
|
|
155
|
+
- "Favor composition over inheritance"
|
|
156
|
+
|
|
157
|
+
linting:
|
|
158
|
+
tools:
|
|
159
|
+
- "ktlint"
|
|
160
|
+
- "detekt"
|
|
161
|
+
detektConfig:
|
|
162
|
+
complexity:
|
|
163
|
+
maxComplexity: 10
|
|
164
|
+
maxNestingDepth: 4
|
|
165
|
+
naming:
|
|
166
|
+
enforceNamingConventions: true
|
|
167
|
+
style:
|
|
168
|
+
enforceDataClassImmutability: true
|
|
169
|
+
|
|
170
|
+
# ----------------------------------------------------------------------------
|
|
171
|
+
# NAMING CONVENTIONS
|
|
172
|
+
# ----------------------------------------------------------------------------
|
|
173
|
+
naming:
|
|
174
|
+
general:
|
|
175
|
+
class: PascalCase
|
|
176
|
+
interface: PascalCase
|
|
177
|
+
function: camelCase
|
|
178
|
+
property: camelCase
|
|
179
|
+
constant: SCREAMING_SNAKE_CASE
|
|
180
|
+
package: lowercase.dot.separated
|
|
181
|
+
file: PascalCase.kt
|
|
182
|
+
|
|
183
|
+
suffixes:
|
|
184
|
+
controller: "Controller"
|
|
185
|
+
service: "Service"
|
|
186
|
+
repository: "Repository"
|
|
187
|
+
useCase: "UseCase"
|
|
188
|
+
handler: "Handler"
|
|
189
|
+
mapper: "Mapper"
|
|
190
|
+
dto: "Request|Response|Dto"
|
|
191
|
+
exception: "Exception"
|
|
192
|
+
config: "Config|Configuration"
|
|
193
|
+
|
|
194
|
+
testing:
|
|
195
|
+
testClass: "Test"
|
|
196
|
+
integrationTest: "IT"
|
|
197
|
+
testMethod: "should verb when condition"
|
|
198
|
+
fixture: "Fixtures|TestBuilder"
|
|
199
|
+
|
|
200
|
+
# ----------------------------------------------------------------------------
|
|
201
|
+
# TESTING
|
|
202
|
+
# ----------------------------------------------------------------------------
|
|
203
|
+
testing:
|
|
204
|
+
framework: "JUnit5"
|
|
205
|
+
assertionLibrary: "Kotest assertions"
|
|
206
|
+
mockingLibrary: "MockK"
|
|
207
|
+
coroutineTesting: "kotlinx-coroutines-test"
|
|
208
|
+
|
|
209
|
+
types:
|
|
210
|
+
unit:
|
|
211
|
+
suffix: "Test"
|
|
212
|
+
location: "src/test/kotlin"
|
|
213
|
+
coverage: 80
|
|
214
|
+
parallel: true
|
|
215
|
+
annotations:
|
|
216
|
+
- "@Test"
|
|
217
|
+
- "@ParameterizedTest"
|
|
218
|
+
|
|
219
|
+
integration:
|
|
220
|
+
suffix: "IT"
|
|
221
|
+
location: "src/test/kotlin"
|
|
222
|
+
annotations:
|
|
223
|
+
- "@SpringBootTest"
|
|
224
|
+
- "@Testcontainers"
|
|
225
|
+
useTestcontainers: true
|
|
226
|
+
useWebTestClient: true
|
|
227
|
+
|
|
228
|
+
architecture:
|
|
229
|
+
tool: "ArchUnit"
|
|
230
|
+
location: "src/test/kotlin/**/architecture"
|
|
231
|
+
|
|
232
|
+
patterns:
|
|
233
|
+
kotestStyle: true
|
|
234
|
+
mockk:
|
|
235
|
+
relaxed: false
|
|
236
|
+
confirmVerified: true
|
|
237
|
+
examples:
|
|
238
|
+
- |
|
|
239
|
+
@Test
|
|
240
|
+
fun `should create order when items are valid`() = runTest {
|
|
241
|
+
// Given
|
|
242
|
+
val customerId = CustomerId.generate()
|
|
243
|
+
val items = listOf(OrderItem(productId, quantity = 2))
|
|
244
|
+
coEvery { customerRepository.findById(customerId) } returns customer
|
|
245
|
+
|
|
246
|
+
// When
|
|
247
|
+
val result = createOrderUseCase.execute(customerId, items)
|
|
248
|
+
|
|
249
|
+
// Then
|
|
250
|
+
result.shouldBeSuccess()
|
|
251
|
+
coVerify { orderRepository.save(any()) }
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
testcontainers:
|
|
255
|
+
enabled: true
|
|
256
|
+
containers:
|
|
257
|
+
- "PostgreSQLContainer"
|
|
258
|
+
- "KafkaContainer"
|
|
259
|
+
- "RedisContainer"
|
|
260
|
+
|
|
261
|
+
# ----------------------------------------------------------------------------
|
|
262
|
+
# SPRING KOTLIN FEATURES
|
|
263
|
+
# ----------------------------------------------------------------------------
|
|
264
|
+
springKotlin:
|
|
265
|
+
beanDsl:
|
|
266
|
+
enabled: true
|
|
267
|
+
example: |
|
|
268
|
+
fun beans() = beans {
|
|
269
|
+
bean<OrderService>()
|
|
270
|
+
bean { OrderRepository(ref()) }
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
routerDsl:
|
|
274
|
+
enabled: true
|
|
275
|
+
coRouter: true
|
|
276
|
+
example: |
|
|
277
|
+
fun routes(handler: OrderHandler) = coRouter {
|
|
278
|
+
"/api/orders".nest {
|
|
279
|
+
GET("/{id}", handler::getOrder)
|
|
280
|
+
POST("", handler::createOrder)
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
configurationProperties:
|
|
285
|
+
enabled: true
|
|
286
|
+
example: |
|
|
287
|
+
@ConfigurationProperties(prefix = "app.orders")
|
|
288
|
+
data class OrderProperties(
|
|
289
|
+
val maxItems: Int = 100,
|
|
290
|
+
val defaultCurrency: Currency = Currency.USD
|
|
291
|
+
)
|
|
292
|
+
|
|
293
|
+
constructorInjection:
|
|
294
|
+
preferred: true
|
|
295
|
+
avoid:
|
|
296
|
+
- "Field injection"
|
|
297
|
+
- "lateinit var for dependencies"
|
|
298
|
+
|
|
299
|
+
# ----------------------------------------------------------------------------
|
|
300
|
+
# ERROR HANDLING
|
|
301
|
+
# ----------------------------------------------------------------------------
|
|
302
|
+
errorHandling:
|
|
303
|
+
format: "RFC 7807 Problem Details"
|
|
304
|
+
globalHandler: "@ControllerAdvice"
|
|
305
|
+
|
|
306
|
+
resultType:
|
|
307
|
+
enabled: true
|
|
308
|
+
library: "kotlin-result or Arrow"
|
|
309
|
+
example: |
|
|
310
|
+
sealed class OrderResult {
|
|
311
|
+
data class Success(val order: Order) : OrderResult()
|
|
312
|
+
data class NotFound(val orderId: OrderId) : OrderResult()
|
|
313
|
+
data class ValidationError(val errors: List<String>) : OrderResult()
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
customExceptions:
|
|
317
|
+
domain:
|
|
318
|
+
- "DomainException (sealed)"
|
|
319
|
+
- "EntityNotFoundException"
|
|
320
|
+
- "BusinessRuleViolationException"
|
|
321
|
+
application:
|
|
322
|
+
- "ValidationException"
|
|
323
|
+
- "UnauthorizedException"
|
|
324
|
+
|
|
325
|
+
# ----------------------------------------------------------------------------
|
|
326
|
+
# OBSERVABILITY
|
|
327
|
+
# ----------------------------------------------------------------------------
|
|
328
|
+
observability:
|
|
329
|
+
enabled: true
|
|
330
|
+
|
|
331
|
+
logging:
|
|
332
|
+
framework: "kotlin-logging + SLF4J"
|
|
333
|
+
format: "JSON"
|
|
334
|
+
structuredLogging: true
|
|
335
|
+
correlationId: true
|
|
336
|
+
example: |
|
|
337
|
+
private val logger = KotlinLogging.logger {}
|
|
338
|
+
|
|
339
|
+
suspend fun processOrder(order: Order) {
|
|
340
|
+
logger.info { "Processing order ${order.id}" }
|
|
341
|
+
withLoggingContext("orderId" to order.id.value) {
|
|
342
|
+
// processing...
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
metrics:
|
|
347
|
+
framework: "Micrometer"
|
|
348
|
+
registry: "prometheus"
|
|
349
|
+
|
|
350
|
+
tracing:
|
|
351
|
+
framework: "Micrometer Tracing"
|
|
352
|
+
propagation: "W3C"
|
|
353
|
+
|
|
354
|
+
# ----------------------------------------------------------------------------
|
|
355
|
+
# DATABASE
|
|
356
|
+
# ----------------------------------------------------------------------------
|
|
357
|
+
database:
|
|
358
|
+
reactive:
|
|
359
|
+
enabled: true
|
|
360
|
+
driver: "R2DBC"
|
|
361
|
+
repository: "CoroutineCrudRepository"
|
|
362
|
+
|
|
363
|
+
blocking:
|
|
364
|
+
driver: "JDBC"
|
|
365
|
+
orm: "Spring Data JPA"
|
|
366
|
+
|
|
367
|
+
migrations:
|
|
368
|
+
tool: "Flyway"
|
|
369
|
+
location: "db/migration"
|
|
370
|
+
naming: "V{version}__{description}.sql"
|
|
371
|
+
|
|
372
|
+
patterns:
|
|
373
|
+
repository: true
|
|
374
|
+
useCoroutines: true
|
|
375
|
+
example: |
|
|
376
|
+
interface OrderRepository : CoroutineCrudRepository<OrderEntity, Long> {
|
|
377
|
+
suspend fun findByCustomerId(customerId: CustomerId): Flow<OrderEntity>
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
# ----------------------------------------------------------------------------
|
|
381
|
+
# TECHNOLOGIES
|
|
382
|
+
# ----------------------------------------------------------------------------
|
|
383
|
+
technologies:
|
|
384
|
+
- name: kotlin
|
|
385
|
+
version: "1.9+"
|
|
386
|
+
specificRules:
|
|
387
|
+
useDataClasses: true
|
|
388
|
+
useSealedClasses: true
|
|
389
|
+
preferValOverVar: true
|
|
390
|
+
useExtensionFunctions: true
|
|
391
|
+
useCoroutines: true
|
|
392
|
+
avoidDoubleBang: true
|
|
393
|
+
useNullSafetyFeatures: true
|
|
394
|
+
|
|
395
|
+
- name: spring-boot
|
|
396
|
+
version: "3.x"
|
|
397
|
+
specificRules:
|
|
398
|
+
useConstructorInjection: true
|
|
399
|
+
useKotlinDSLs: true
|
|
400
|
+
useCoRouter: true
|
|
401
|
+
useConfigurationProperties: true
|
|
402
|
+
|
|
403
|
+
- name: coroutines
|
|
404
|
+
version: "1.7+"
|
|
405
|
+
specificRules:
|
|
406
|
+
useStructuredConcurrency: true
|
|
407
|
+
useSuspendFunctions: true
|
|
408
|
+
useFlowForStreams: true
|
|
409
|
+
avoidGlobalScope: true
|
|
410
|
+
avoidRunBlocking: true
|
|
411
|
+
|
|
412
|
+
- name: testing
|
|
413
|
+
specificRules:
|
|
414
|
+
useKotestAssertions: true
|
|
415
|
+
useMockK: true
|
|
416
|
+
useCoroutinesTest: true
|
|
417
|
+
useTestcontainers: true
|