@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.
Files changed (99) hide show
  1. package/README.md +233 -337
  2. package/dist/agent.d.ts +5 -6
  3. package/dist/agent.d.ts.map +1 -1
  4. package/dist/agent.js +95 -217
  5. package/dist/agent.js.map +1 -1
  6. package/dist/analysis/code-analyzer.d.ts +44 -0
  7. package/dist/analysis/code-analyzer.d.ts.map +1 -0
  8. package/dist/analysis/code-analyzer.js +528 -0
  9. package/dist/analysis/code-analyzer.js.map +1 -0
  10. package/dist/errors.d.ts +58 -0
  11. package/dist/errors.d.ts.map +1 -0
  12. package/dist/errors.js +112 -0
  13. package/dist/errors.js.map +1 -0
  14. package/dist/guardrails.d.ts +35 -0
  15. package/dist/guardrails.d.ts.map +1 -0
  16. package/dist/guardrails.js +303 -0
  17. package/dist/guardrails.js.map +1 -0
  18. package/dist/index.js +1 -1
  19. package/dist/index.js.map +1 -1
  20. package/dist/logger.d.ts +36 -0
  21. package/dist/logger.d.ts.map +1 -0
  22. package/dist/logger.js +63 -0
  23. package/dist/logger.js.map +1 -0
  24. package/dist/metrics.d.ts +40 -0
  25. package/dist/metrics.d.ts.map +1 -0
  26. package/dist/metrics.js +97 -0
  27. package/dist/metrics.js.map +1 -0
  28. package/dist/profiles.d.ts +1 -1
  29. package/dist/profiles.d.ts.map +1 -1
  30. package/dist/profiles.js +239 -108
  31. package/dist/profiles.js.map +1 -1
  32. package/dist/prompts.js +1 -1
  33. package/dist/prompts.js.map +1 -1
  34. package/dist/tools/definitions.d.ts +143 -0
  35. package/dist/tools/definitions.d.ts.map +1 -0
  36. package/dist/tools/definitions.js +229 -0
  37. package/dist/tools/definitions.js.map +1 -0
  38. package/dist/tools/handlers/get-context.d.ts +12 -0
  39. package/dist/tools/handlers/get-context.d.ts.map +1 -0
  40. package/dist/tools/handlers/get-context.js +233 -0
  41. package/dist/tools/handlers/get-context.js.map +1 -0
  42. package/dist/tools/handlers/health.d.ts +11 -0
  43. package/dist/tools/handlers/health.d.ts.map +1 -0
  44. package/dist/tools/handlers/health.js +57 -0
  45. package/dist/tools/handlers/health.js.map +1 -0
  46. package/dist/tools/handlers/index.d.ts +12 -0
  47. package/dist/tools/handlers/index.d.ts.map +1 -0
  48. package/dist/tools/handlers/index.js +12 -0
  49. package/dist/tools/handlers/index.js.map +1 -0
  50. package/dist/tools/handlers/init.d.ts +12 -0
  51. package/dist/tools/handlers/init.d.ts.map +1 -0
  52. package/dist/tools/handlers/init.js +102 -0
  53. package/dist/tools/handlers/init.js.map +1 -0
  54. package/dist/tools/handlers/profiles.d.ts +11 -0
  55. package/dist/tools/handlers/profiles.d.ts.map +1 -0
  56. package/dist/tools/handlers/profiles.js +25 -0
  57. package/dist/tools/handlers/profiles.js.map +1 -0
  58. package/dist/tools/handlers/search.d.ts +12 -0
  59. package/dist/tools/handlers/search.d.ts.map +1 -0
  60. package/dist/tools/handlers/search.js +58 -0
  61. package/dist/tools/handlers/search.js.map +1 -0
  62. package/dist/tools/handlers/validate.d.ts +15 -0
  63. package/dist/tools/handlers/validate.d.ts.map +1 -0
  64. package/dist/tools/handlers/validate.js +71 -0
  65. package/dist/tools/handlers/validate.js.map +1 -0
  66. package/dist/tools/handlers/verify.d.ts +38 -0
  67. package/dist/tools/handlers/verify.d.ts.map +1 -0
  68. package/dist/tools/handlers/verify.js +172 -0
  69. package/dist/tools/handlers/verify.js.map +1 -0
  70. package/dist/tools/index.d.ts +22 -0
  71. package/dist/tools/index.d.ts.map +1 -0
  72. package/dist/tools/index.js +75 -0
  73. package/dist/tools/index.js.map +1 -0
  74. package/dist/tools/schemas.d.ts +29 -0
  75. package/dist/tools/schemas.d.ts.map +1 -0
  76. package/dist/tools/schemas.js +20 -0
  77. package/dist/tools/schemas.js.map +1 -0
  78. package/dist/tools.js +2 -2
  79. package/dist/tools.js.map +1 -1
  80. package/dist/types.d.ts +141 -71
  81. package/dist/types.d.ts.map +1 -1
  82. package/dist/types.js +92 -40
  83. package/dist/types.js.map +1 -1
  84. package/package.json +2 -2
  85. package/profiles/examples/microservice-kafka.yaml +122 -0
  86. package/profiles/examples/startup-fast.yaml +67 -0
  87. package/profiles/examples/strict-enterprise.yaml +62 -0
  88. package/profiles/templates/angular.yaml +614 -0
  89. package/profiles/templates/csharp-dotnet.yaml +529 -0
  90. package/profiles/templates/flutter.yaml +547 -0
  91. package/profiles/templates/go.yaml +1276 -0
  92. package/profiles/templates/java-spring-backend.yaml +326 -0
  93. package/profiles/templates/kotlin-spring.yaml +417 -0
  94. package/profiles/templates/nextjs.yaml +536 -0
  95. package/profiles/templates/nodejs.yaml +594 -0
  96. package/profiles/templates/python.yaml +546 -0
  97. package/profiles/templates/react.yaml +456 -0
  98. package/profiles/templates/rust.yaml +508 -0
  99. 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