@corbat-tech/coding-standards-mcp 1.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 (89) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +371 -0
  3. package/assets/demo.gif +0 -0
  4. package/dist/agent.d.ts +53 -0
  5. package/dist/agent.d.ts.map +1 -0
  6. package/dist/agent.js +629 -0
  7. package/dist/agent.js.map +1 -0
  8. package/dist/cli/init.d.ts +3 -0
  9. package/dist/cli/init.d.ts.map +1 -0
  10. package/dist/cli/init.js +651 -0
  11. package/dist/cli/init.js.map +1 -0
  12. package/dist/config.d.ts +73 -0
  13. package/dist/config.d.ts.map +1 -0
  14. package/dist/config.js +105 -0
  15. package/dist/config.js.map +1 -0
  16. package/dist/index.d.ts +3 -0
  17. package/dist/index.d.ts.map +1 -0
  18. package/dist/index.js +73 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/profiles.d.ts +39 -0
  21. package/dist/profiles.d.ts.map +1 -0
  22. package/dist/profiles.js +526 -0
  23. package/dist/profiles.js.map +1 -0
  24. package/dist/prompts-legacy.d.ts +25 -0
  25. package/dist/prompts-legacy.d.ts.map +1 -0
  26. package/dist/prompts-legacy.js +600 -0
  27. package/dist/prompts-legacy.js.map +1 -0
  28. package/dist/prompts-v2.d.ts +30 -0
  29. package/dist/prompts-v2.d.ts.map +1 -0
  30. package/dist/prompts-v2.js +310 -0
  31. package/dist/prompts-v2.js.map +1 -0
  32. package/dist/prompts.d.ts +30 -0
  33. package/dist/prompts.d.ts.map +1 -0
  34. package/dist/prompts.js +310 -0
  35. package/dist/prompts.js.map +1 -0
  36. package/dist/resources.d.ts +18 -0
  37. package/dist/resources.d.ts.map +1 -0
  38. package/dist/resources.js +95 -0
  39. package/dist/resources.js.map +1 -0
  40. package/dist/tools-legacy.d.ts +196 -0
  41. package/dist/tools-legacy.d.ts.map +1 -0
  42. package/dist/tools-legacy.js +1230 -0
  43. package/dist/tools-legacy.js.map +1 -0
  44. package/dist/tools-v2.d.ts +92 -0
  45. package/dist/tools-v2.d.ts.map +1 -0
  46. package/dist/tools-v2.js +410 -0
  47. package/dist/tools-v2.js.map +1 -0
  48. package/dist/tools.d.ts +92 -0
  49. package/dist/tools.d.ts.map +1 -0
  50. package/dist/tools.js +410 -0
  51. package/dist/tools.js.map +1 -0
  52. package/dist/types.d.ts +3054 -0
  53. package/dist/types.d.ts.map +1 -0
  54. package/dist/types.js +515 -0
  55. package/dist/types.js.map +1 -0
  56. package/dist/utils/index.d.ts +6 -0
  57. package/dist/utils/index.d.ts.map +1 -0
  58. package/dist/utils/index.js +5 -0
  59. package/dist/utils/index.js.map +1 -0
  60. package/dist/utils/retry.d.ts +44 -0
  61. package/dist/utils/retry.d.ts.map +1 -0
  62. package/dist/utils/retry.js +74 -0
  63. package/dist/utils/retry.js.map +1 -0
  64. package/package.json +79 -0
  65. package/profiles/README.md +199 -0
  66. package/profiles/custom/.gitkeep +2 -0
  67. package/profiles/templates/_template.yaml +159 -0
  68. package/profiles/templates/angular.yaml +494 -0
  69. package/profiles/templates/java-spring-backend.yaml +512 -0
  70. package/profiles/templates/minimal.yaml +102 -0
  71. package/profiles/templates/nodejs.yaml +338 -0
  72. package/profiles/templates/python.yaml +340 -0
  73. package/profiles/templates/react.yaml +331 -0
  74. package/profiles/templates/vue.yaml +598 -0
  75. package/standards/architecture/ddd.md +173 -0
  76. package/standards/architecture/hexagonal.md +97 -0
  77. package/standards/cicd/github-actions.md +567 -0
  78. package/standards/clean-code/naming.md +175 -0
  79. package/standards/clean-code/principles.md +179 -0
  80. package/standards/containerization/dockerfile.md +419 -0
  81. package/standards/database/selection-guide.md +443 -0
  82. package/standards/documentation/guidelines.md +189 -0
  83. package/standards/event-driven/domain-events.md +527 -0
  84. package/standards/kubernetes/deployment.md +518 -0
  85. package/standards/observability/guidelines.md +665 -0
  86. package/standards/project-setup/initialization-checklist.md +650 -0
  87. package/standards/spring-boot/best-practices.md +598 -0
  88. package/standards/testing/guidelines.md +559 -0
  89. package/standards/workflow/llm-development-workflow.md +542 -0
@@ -0,0 +1,419 @@
1
+ # Containerization Guidelines
2
+
3
+ ## Overview
4
+
5
+ Guidelines for containerizing Spring Boot applications following security best practices, multi-stage builds, and optimization techniques.
6
+
7
+ ## Dockerfile Best Practices
8
+
9
+ ### Multi-Stage Build (Recommended)
10
+
11
+ ```dockerfile
12
+ # ============================================
13
+ # Stage 1: Build
14
+ # ============================================
15
+ FROM eclipse-temurin:21-jdk-alpine AS builder
16
+
17
+ WORKDIR /app
18
+
19
+ # Copy Maven wrapper and pom.xml first (better caching)
20
+ COPY mvnw .
21
+ COPY .mvn .mvn
22
+ COPY pom.xml .
23
+
24
+ # Download dependencies (cached if pom.xml unchanged)
25
+ RUN chmod +x mvnw && ./mvnw dependency:go-offline -B
26
+
27
+ # Copy source code
28
+ COPY src src
29
+
30
+ # Build the application
31
+ RUN ./mvnw package -DskipTests -B
32
+
33
+ # Extract layers for better caching
34
+ RUN java -Djarmode=layertools -jar target/*.jar extract --destination extracted
35
+
36
+ # ============================================
37
+ # Stage 2: Runtime
38
+ # ============================================
39
+ FROM eclipse-temurin:21-jre-alpine AS runtime
40
+
41
+ # Security: Run as non-root user
42
+ RUN addgroup -S appgroup && adduser -S appuser -G appgroup
43
+ USER appuser
44
+
45
+ WORKDIR /app
46
+
47
+ # Copy layers in order of change frequency
48
+ COPY --from=builder /app/extracted/dependencies/ ./
49
+ COPY --from=builder /app/extracted/spring-boot-loader/ ./
50
+ COPY --from=builder /app/extracted/snapshot-dependencies/ ./
51
+ COPY --from=builder /app/extracted/application/ ./
52
+
53
+ # Health check
54
+ HEALTHCHECK --interval=30s --timeout=3s --start-period=30s --retries=3 \
55
+ CMD wget --quiet --tries=1 --spider http://localhost:8080/actuator/health || exit 1
56
+
57
+ # Expose port
58
+ EXPOSE 8080
59
+
60
+ # JVM optimization flags
61
+ ENV JAVA_OPTS="-XX:+UseContainerSupport \
62
+ -XX:MaxRAMPercentage=75.0 \
63
+ -XX:InitialRAMPercentage=50.0 \
64
+ -XX:+ExitOnOutOfMemoryError \
65
+ -Djava.security.egd=file:/dev/./urandom"
66
+
67
+ # Run with Spring Boot launcher
68
+ ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS org.springframework.boot.loader.launch.JarLauncher"]
69
+ ```
70
+
71
+ ### Alternative: Simple Dockerfile
72
+
73
+ For simpler cases:
74
+
75
+ ```dockerfile
76
+ FROM eclipse-temurin:21-jre-alpine
77
+
78
+ # Security
79
+ RUN addgroup -S appgroup && adduser -S appuser -G appgroup
80
+ USER appuser
81
+
82
+ WORKDIR /app
83
+
84
+ # Copy pre-built JAR
85
+ COPY --chown=appuser:appgroup target/*.jar app.jar
86
+
87
+ HEALTHCHECK --interval=30s --timeout=3s --start-period=30s --retries=3 \
88
+ CMD wget --quiet --tries=1 --spider http://localhost:8080/actuator/health || exit 1
89
+
90
+ EXPOSE 8080
91
+
92
+ ENV JAVA_OPTS="-XX:+UseContainerSupport -XX:MaxRAMPercentage=75.0"
93
+
94
+ ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]
95
+ ```
96
+
97
+ ### With Buildpacks (No Dockerfile)
98
+
99
+ Use Cloud Native Buildpacks via Spring Boot Maven plugin:
100
+
101
+ ```xml
102
+ <plugin>
103
+ <groupId>org.springframework.boot</groupId>
104
+ <artifactId>spring-boot-maven-plugin</artifactId>
105
+ <configuration>
106
+ <image>
107
+ <name>${project.artifactId}:${project.version}</name>
108
+ <env>
109
+ <BP_JVM_VERSION>21</BP_JVM_VERSION>
110
+ </env>
111
+ </image>
112
+ </configuration>
113
+ </plugin>
114
+ ```
115
+
116
+ ```bash
117
+ ./mvnw spring-boot:build-image
118
+ ```
119
+
120
+ ## Base Image Selection
121
+
122
+ | Image | Size | Use Case |
123
+ |-------|------|----------|
124
+ | `eclipse-temurin:21-jre-alpine` | ~180MB | Production (smallest) |
125
+ | `eclipse-temurin:21-jre` | ~280MB | Production (more compatible) |
126
+ | `eclipse-temurin:21-jdk-alpine` | ~340MB | Build stage only |
127
+ | `amazoncorretto:21-alpine` | ~190MB | AWS environments |
128
+ | `gcr.io/distroless/java21-debian12` | ~220MB | Maximum security |
129
+
130
+ ### Distroless Image (Most Secure)
131
+
132
+ ```dockerfile
133
+ FROM eclipse-temurin:21-jdk-alpine AS builder
134
+ WORKDIR /app
135
+ COPY . .
136
+ RUN ./mvnw package -DskipTests
137
+
138
+ FROM gcr.io/distroless/java21-debian12
139
+ COPY --from=builder /app/target/*.jar /app.jar
140
+ EXPOSE 8080
141
+ ENTRYPOINT ["java", "-jar", "/app.jar"]
142
+ ```
143
+
144
+ ## Docker Compose
145
+
146
+ ### Development Environment
147
+
148
+ ```yaml
149
+ # docker-compose.yml
150
+ version: '3.8'
151
+
152
+ services:
153
+ app:
154
+ build:
155
+ context: .
156
+ dockerfile: Dockerfile
157
+ ports:
158
+ - "8080:8080"
159
+ environment:
160
+ - SPRING_PROFILES_ACTIVE=local
161
+ - DATABASE_URL=jdbc:postgresql://postgres:5432/orderdb
162
+ - DATABASE_USERNAME=postgres
163
+ - DATABASE_PASSWORD=postgres
164
+ - KAFKA_BOOTSTRAP_SERVERS=kafka:9092
165
+ depends_on:
166
+ postgres:
167
+ condition: service_healthy
168
+ kafka:
169
+ condition: service_healthy
170
+ networks:
171
+ - app-network
172
+
173
+ postgres:
174
+ image: postgres:15-alpine
175
+ environment:
176
+ POSTGRES_DB: orderdb
177
+ POSTGRES_USER: postgres
178
+ POSTGRES_PASSWORD: postgres
179
+ ports:
180
+ - "5432:5432"
181
+ volumes:
182
+ - postgres-data:/var/lib/postgresql/data
183
+ healthcheck:
184
+ test: ["CMD-SHELL", "pg_isready -U postgres"]
185
+ interval: 5s
186
+ timeout: 5s
187
+ retries: 5
188
+ networks:
189
+ - app-network
190
+
191
+ kafka:
192
+ image: confluentinc/cp-kafka:7.4.0
193
+ environment:
194
+ KAFKA_BROKER_ID: 1
195
+ KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
196
+ KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092
197
+ KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
198
+ depends_on:
199
+ - zookeeper
200
+ healthcheck:
201
+ test: ["CMD", "kafka-topics", "--bootstrap-server", "localhost:9092", "--list"]
202
+ interval: 10s
203
+ timeout: 10s
204
+ retries: 5
205
+ networks:
206
+ - app-network
207
+
208
+ zookeeper:
209
+ image: confluentinc/cp-zookeeper:7.4.0
210
+ environment:
211
+ ZOOKEEPER_CLIENT_PORT: 2181
212
+ networks:
213
+ - app-network
214
+
215
+ # Observability stack
216
+ prometheus:
217
+ image: prom/prometheus:latest
218
+ ports:
219
+ - "9090:9090"
220
+ volumes:
221
+ - ./infrastructure/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
222
+ networks:
223
+ - app-network
224
+
225
+ grafana:
226
+ image: grafana/grafana:latest
227
+ ports:
228
+ - "3000:3000"
229
+ environment:
230
+ - GF_SECURITY_ADMIN_PASSWORD=admin
231
+ volumes:
232
+ - grafana-data:/var/lib/grafana
233
+ networks:
234
+ - app-network
235
+
236
+ jaeger:
237
+ image: jaegertracing/all-in-one:latest
238
+ ports:
239
+ - "16686:16686"
240
+ - "4317:4317"
241
+ environment:
242
+ - COLLECTOR_OTLP_ENABLED=true
243
+ networks:
244
+ - app-network
245
+
246
+ networks:
247
+ app-network:
248
+ driver: bridge
249
+
250
+ volumes:
251
+ postgres-data:
252
+ grafana-data:
253
+ ```
254
+
255
+ ### Production-Like Environment
256
+
257
+ ```yaml
258
+ # docker-compose.prod.yml
259
+ version: '3.8'
260
+
261
+ services:
262
+ app:
263
+ image: ${DOCKER_REGISTRY}/order-service:${VERSION}
264
+ deploy:
265
+ replicas: 2
266
+ resources:
267
+ limits:
268
+ cpus: '1'
269
+ memory: 1G
270
+ reservations:
271
+ cpus: '0.5'
272
+ memory: 512M
273
+ restart_policy:
274
+ condition: on-failure
275
+ max_attempts: 3
276
+ environment:
277
+ - SPRING_PROFILES_ACTIVE=production
278
+ - DATABASE_URL=${DATABASE_URL}
279
+ - DATABASE_USERNAME=${DATABASE_USERNAME}
280
+ - DATABASE_PASSWORD=${DATABASE_PASSWORD}
281
+ - KAFKA_BOOTSTRAP_SERVERS=${KAFKA_BOOTSTRAP_SERVERS}
282
+ healthcheck:
283
+ test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:8080/actuator/health"]
284
+ interval: 30s
285
+ timeout: 10s
286
+ retries: 3
287
+ start_period: 40s
288
+ logging:
289
+ driver: json-file
290
+ options:
291
+ max-size: "10m"
292
+ max-file: "3"
293
+ ```
294
+
295
+ ## .dockerignore
296
+
297
+ ```
298
+ # Build artifacts
299
+ target/
300
+ !target/*.jar
301
+ build/
302
+ *.class
303
+
304
+ # IDE
305
+ .idea/
306
+ *.iml
307
+ .vscode/
308
+ *.swp
309
+
310
+ # Git
311
+ .git
312
+ .gitignore
313
+
314
+ # Documentation
315
+ *.md
316
+ docs/
317
+
318
+ # Tests
319
+ src/test/
320
+ tests/
321
+
322
+ # CI/CD
323
+ .github/
324
+ .gitlab-ci.yml
325
+ Jenkinsfile
326
+
327
+ # Docker
328
+ Dockerfile*
329
+ docker-compose*
330
+ .docker/
331
+
332
+ # Misc
333
+ *.log
334
+ *.tmp
335
+ .env
336
+ .env.*
337
+ ```
338
+
339
+ ## Security Checklist
340
+
341
+ - [ ] Use non-root user (`USER appuser`)
342
+ - [ ] Use specific image tags (not `latest`)
343
+ - [ ] Minimize image size (Alpine, multi-stage)
344
+ - [ ] Don't copy secrets into image
345
+ - [ ] Enable health checks
346
+ - [ ] Scan for vulnerabilities (`docker scan`, `trivy`)
347
+ - [ ] Use read-only filesystem where possible
348
+ - [ ] Limit resource usage (CPU, memory)
349
+ - [ ] Don't expose unnecessary ports
350
+
351
+ ## JVM Container Settings
352
+
353
+ ```dockerfile
354
+ ENV JAVA_OPTS="\
355
+ # Use container limits
356
+ -XX:+UseContainerSupport \
357
+ # Memory settings (percentage of container limit)
358
+ -XX:MaxRAMPercentage=75.0 \
359
+ -XX:InitialRAMPercentage=50.0 \
360
+ # Fail fast on OOM
361
+ -XX:+ExitOnOutOfMemoryError \
362
+ # Faster startup with entropy
363
+ -Djava.security.egd=file:/dev/./urandom \
364
+ # GC settings (G1 is default in JDK 21)
365
+ -XX:+UseG1GC \
366
+ -XX:MaxGCPauseMillis=200 \
367
+ # Better container awareness
368
+ -XX:+UseStringDeduplication"
369
+ ```
370
+
371
+ ## Local Development Commands
372
+
373
+ ```bash
374
+ # Build image
375
+ docker build -t order-service:latest .
376
+
377
+ # Run container
378
+ docker run -p 8080:8080 \
379
+ -e SPRING_PROFILES_ACTIVE=local \
380
+ -e DATABASE_URL=jdbc:postgresql://host.docker.internal:5432/orderdb \
381
+ order-service:latest
382
+
383
+ # Build and run with compose
384
+ docker-compose up --build
385
+
386
+ # Run specific service
387
+ docker-compose up -d postgres kafka
388
+
389
+ # View logs
390
+ docker-compose logs -f app
391
+
392
+ # Clean up
393
+ docker-compose down -v
394
+ ```
395
+
396
+ ## Image Optimization Tips
397
+
398
+ 1. **Order layers by change frequency**: Dependencies change less than code
399
+ 2. **Use multi-stage builds**: Smaller final image
400
+ 3. **Leverage Spring Boot layered JARs**: Better Docker layer caching
401
+ 4. **Use Alpine images**: Smaller base image
402
+ 5. **Clean up in same layer**: `RUN apt-get install && apt-get clean && rm -rf /var/lib/apt/lists/*`
403
+ 6. **Minimize number of layers**: Combine related commands
404
+
405
+ ## CI/CD Integration
406
+
407
+ ```yaml
408
+ # Build and push in GitHub Actions
409
+ - name: Build and push Docker image
410
+ uses: docker/build-push-action@v5
411
+ with:
412
+ context: .
413
+ push: true
414
+ tags: |
415
+ ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.sha }}
416
+ ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest
417
+ cache-from: type=gha
418
+ cache-to: type=gha,mode=max
419
+ ```