javi-forge 1.2.0 → 1.3.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/ci-local/ci-local.sh +20 -8
- package/package.json +1 -1
- package/ai-config/.skillignore +0 -15
- package/ai-config/AUTO_INVOKE.md +0 -300
- package/ai-config/agents/_TEMPLATE.md +0 -93
- package/ai-config/agents/business/api-designer.md +0 -1657
- package/ai-config/agents/business/business-analyst.md +0 -1331
- package/ai-config/agents/business/product-strategist.md +0 -206
- package/ai-config/agents/business/project-manager.md +0 -178
- package/ai-config/agents/business/requirements-analyst.md +0 -1277
- package/ai-config/agents/business/technical-writer.md +0 -1679
- package/ai-config/agents/creative/ux-designer.md +0 -205
- package/ai-config/agents/data-ai/ai-engineer.md +0 -487
- package/ai-config/agents/data-ai/analytics-engineer.md +0 -953
- package/ai-config/agents/data-ai/data-engineer.md +0 -173
- package/ai-config/agents/data-ai/data-scientist.md +0 -672
- package/ai-config/agents/data-ai/mlops-engineer.md +0 -814
- package/ai-config/agents/data-ai/prompt-engineer.md +0 -772
- package/ai-config/agents/development/angular-expert.md +0 -620
- package/ai-config/agents/development/backend-architect.md +0 -795
- package/ai-config/agents/development/database-specialist.md +0 -212
- package/ai-config/agents/development/frontend-specialist.md +0 -686
- package/ai-config/agents/development/fullstack-engineer.md +0 -668
- package/ai-config/agents/development/golang-pro.md +0 -338
- package/ai-config/agents/development/java-enterprise.md +0 -400
- package/ai-config/agents/development/javascript-pro.md +0 -422
- package/ai-config/agents/development/nextjs-pro.md +0 -474
- package/ai-config/agents/development/python-pro.md +0 -570
- package/ai-config/agents/development/react-pro.md +0 -487
- package/ai-config/agents/development/rust-pro.md +0 -246
- package/ai-config/agents/development/spring-boot-4-expert.md +0 -326
- package/ai-config/agents/development/typescript-pro.md +0 -336
- package/ai-config/agents/development/vue-specialist.md +0 -605
- package/ai-config/agents/infrastructure/cloud-architect.md +0 -472
- package/ai-config/agents/infrastructure/deployment-manager.md +0 -358
- package/ai-config/agents/infrastructure/devops-engineer.md +0 -455
- package/ai-config/agents/infrastructure/incident-responder.md +0 -519
- package/ai-config/agents/infrastructure/kubernetes-expert.md +0 -705
- package/ai-config/agents/infrastructure/monitoring-specialist.md +0 -674
- package/ai-config/agents/infrastructure/performance-engineer.md +0 -658
- package/ai-config/agents/orchestrator.md +0 -241
- package/ai-config/agents/quality/accessibility-auditor.md +0 -1204
- package/ai-config/agents/quality/code-reviewer-compact.md +0 -123
- package/ai-config/agents/quality/code-reviewer.md +0 -363
- package/ai-config/agents/quality/dependency-manager.md +0 -743
- package/ai-config/agents/quality/e2e-test-specialist.md +0 -1005
- package/ai-config/agents/quality/performance-tester.md +0 -1086
- package/ai-config/agents/quality/security-auditor.md +0 -133
- package/ai-config/agents/quality/test-engineer.md +0 -453
- package/ai-config/agents/specialists/api-designer.md +0 -87
- package/ai-config/agents/specialists/backend-architect.md +0 -73
- package/ai-config/agents/specialists/code-reviewer.md +0 -77
- package/ai-config/agents/specialists/db-optimizer.md +0 -75
- package/ai-config/agents/specialists/devops-engineer.md +0 -83
- package/ai-config/agents/specialists/documentation-writer.md +0 -78
- package/ai-config/agents/specialists/frontend-developer.md +0 -75
- package/ai-config/agents/specialists/performance-analyst.md +0 -82
- package/ai-config/agents/specialists/refactor-specialist.md +0 -74
- package/ai-config/agents/specialists/security-auditor.md +0 -74
- package/ai-config/agents/specialists/test-engineer.md +0 -81
- package/ai-config/agents/specialists/ux-consultant.md +0 -76
- package/ai-config/agents/specialized/agent-generator.md +0 -1190
- package/ai-config/agents/specialized/blockchain-developer.md +0 -149
- package/ai-config/agents/specialized/code-migrator.md +0 -892
- package/ai-config/agents/specialized/context-manager.md +0 -978
- package/ai-config/agents/specialized/documentation-writer.md +0 -1078
- package/ai-config/agents/specialized/ecommerce-expert.md +0 -1756
- package/ai-config/agents/specialized/embedded-engineer.md +0 -1714
- package/ai-config/agents/specialized/error-detective.md +0 -1034
- package/ai-config/agents/specialized/fintech-specialist.md +0 -1659
- package/ai-config/agents/specialized/freelance-project-planner-v2.md +0 -1988
- package/ai-config/agents/specialized/freelance-project-planner-v3.md +0 -2136
- package/ai-config/agents/specialized/freelance-project-planner-v4.md +0 -4503
- package/ai-config/agents/specialized/freelance-project-planner.md +0 -722
- package/ai-config/agents/specialized/game-developer.md +0 -1963
- package/ai-config/agents/specialized/healthcare-dev.md +0 -1620
- package/ai-config/agents/specialized/mobile-developer.md +0 -188
- package/ai-config/agents/specialized/parallel-plan-executor.md +0 -506
- package/ai-config/agents/specialized/plan-executor.md +0 -485
- package/ai-config/agents/specialized/solo-dev-planner-modular/00-INDEX.md +0 -485
- package/ai-config/agents/specialized/solo-dev-planner-modular/01-CORE.md +0 -3493
- package/ai-config/agents/specialized/solo-dev-planner-modular/02-SELF-CORRECTION.md +0 -778
- package/ai-config/agents/specialized/solo-dev-planner-modular/03-PROGRESSIVE-SETUP.md +0 -918
- package/ai-config/agents/specialized/solo-dev-planner-modular/04-DEPLOYMENT.md +0 -1537
- package/ai-config/agents/specialized/solo-dev-planner-modular/05-TESTING.md +0 -2633
- package/ai-config/agents/specialized/solo-dev-planner-modular/06-OPERATIONS.md +0 -5610
- package/ai-config/agents/specialized/solo-dev-planner-modular/INSTALL.md +0 -335
- package/ai-config/agents/specialized/solo-dev-planner-modular/QUICK-REFERENCE.txt +0 -215
- package/ai-config/agents/specialized/solo-dev-planner-modular/README.md +0 -260
- package/ai-config/agents/specialized/solo-dev-planner-modular/START-HERE.md +0 -379
- package/ai-config/agents/specialized/solo-dev-planner-modular/WORKFLOW-DIAGRAM.md +0 -355
- package/ai-config/agents/specialized/solo-dev-planner-modular/solo-dev-planner.md +0 -279
- package/ai-config/agents/specialized/template-writer.md +0 -347
- package/ai-config/agents/specialized/test-runner.md +0 -99
- package/ai-config/agents/specialized/vibekanban-smart-worker.md +0 -244
- package/ai-config/agents/specialized/wave-executor.md +0 -138
- package/ai-config/agents/specialized/workflow-optimizer.md +0 -1114
- package/ai-config/commands/git/changelog.md +0 -32
- package/ai-config/commands/git/ci-local.md +0 -70
- package/ai-config/commands/git/commit.md +0 -35
- package/ai-config/commands/git/fix-issue.md +0 -23
- package/ai-config/commands/git/pr-create.md +0 -42
- package/ai-config/commands/git/pr-review.md +0 -50
- package/ai-config/commands/git/worktree.md +0 -39
- package/ai-config/commands/refactoring/cleanup.md +0 -24
- package/ai-config/commands/refactoring/dead-code.md +0 -40
- package/ai-config/commands/refactoring/extract.md +0 -31
- package/ai-config/commands/testing/e2e.md +0 -30
- package/ai-config/commands/testing/tdd.md +0 -36
- package/ai-config/commands/testing/test-coverage.md +0 -30
- package/ai-config/commands/testing/test-fix.md +0 -24
- package/ai-config/commands/workflow/generate-agents-md.md +0 -85
- package/ai-config/commands/workflow/planning.md +0 -47
- package/ai-config/commands/workflows/compound.md +0 -89
- package/ai-config/commands/workflows/diagnose.md +0 -70
- package/ai-config/commands/workflows/discover.md +0 -86
- package/ai-config/commands/workflows/plan.md +0 -77
- package/ai-config/commands/workflows/review.md +0 -78
- package/ai-config/commands/workflows/work.md +0 -75
- package/ai-config/config.yaml +0 -18
- package/ai-config/hooks/_TEMPLATE.md +0 -96
- package/ai-config/hooks/block-dangerous-commands.md +0 -75
- package/ai-config/hooks/commit-guard.md +0 -90
- package/ai-config/hooks/context-loader.md +0 -73
- package/ai-config/hooks/improve-prompt.md +0 -91
- package/ai-config/hooks/learning-log.md +0 -72
- package/ai-config/hooks/model-router.md +0 -86
- package/ai-config/hooks/secret-scanner.md +0 -64
- package/ai-config/hooks/skill-validator.md +0 -102
- package/ai-config/hooks/task-artifact.md +0 -114
- package/ai-config/hooks/validate-workflow.md +0 -100
- package/ai-config/prompts/base.md +0 -71
- package/ai-config/prompts/modes/debug.md +0 -34
- package/ai-config/prompts/modes/deploy.md +0 -40
- package/ai-config/prompts/modes/research.md +0 -32
- package/ai-config/prompts/modes/review.md +0 -33
- package/ai-config/prompts/review-policy.md +0 -79
- package/ai-config/skills/_TEMPLATE.md +0 -157
- package/ai-config/skills/backend/api-gateway/SKILL.md +0 -254
- package/ai-config/skills/backend/bff-concepts/SKILL.md +0 -239
- package/ai-config/skills/backend/bff-spring/SKILL.md +0 -364
- package/ai-config/skills/backend/chi-router/SKILL.md +0 -396
- package/ai-config/skills/backend/error-handling/SKILL.md +0 -255
- package/ai-config/skills/backend/exceptions-spring/SKILL.md +0 -323
- package/ai-config/skills/backend/fastapi/SKILL.md +0 -302
- package/ai-config/skills/backend/gateway-spring/SKILL.md +0 -390
- package/ai-config/skills/backend/go-backend/SKILL.md +0 -457
- package/ai-config/skills/backend/gradle-multimodule/SKILL.md +0 -274
- package/ai-config/skills/backend/graphql-concepts/SKILL.md +0 -352
- package/ai-config/skills/backend/graphql-spring/SKILL.md +0 -398
- package/ai-config/skills/backend/grpc-concepts/SKILL.md +0 -283
- package/ai-config/skills/backend/grpc-spring/SKILL.md +0 -445
- package/ai-config/skills/backend/jwt-auth/SKILL.md +0 -412
- package/ai-config/skills/backend/notifications-concepts/SKILL.md +0 -259
- package/ai-config/skills/backend/recommendations-concepts/SKILL.md +0 -261
- package/ai-config/skills/backend/search-concepts/SKILL.md +0 -263
- package/ai-config/skills/backend/search-spring/SKILL.md +0 -375
- package/ai-config/skills/backend/spring-boot-4/SKILL.md +0 -172
- package/ai-config/skills/backend/websockets/SKILL.md +0 -532
- package/ai-config/skills/data-ai/ai-ml/SKILL.md +0 -423
- package/ai-config/skills/data-ai/analytics-concepts/SKILL.md +0 -195
- package/ai-config/skills/data-ai/analytics-spring/SKILL.md +0 -340
- package/ai-config/skills/data-ai/duckdb-analytics/SKILL.md +0 -440
- package/ai-config/skills/data-ai/langchain/SKILL.md +0 -238
- package/ai-config/skills/data-ai/mlflow/SKILL.md +0 -302
- package/ai-config/skills/data-ai/onnx-inference/SKILL.md +0 -290
- package/ai-config/skills/data-ai/powerbi/SKILL.md +0 -352
- package/ai-config/skills/data-ai/pytorch/SKILL.md +0 -274
- package/ai-config/skills/data-ai/scikit-learn/SKILL.md +0 -321
- package/ai-config/skills/data-ai/vector-db/SKILL.md +0 -301
- package/ai-config/skills/database/graph-databases/SKILL.md +0 -218
- package/ai-config/skills/database/graph-spring/SKILL.md +0 -361
- package/ai-config/skills/database/pgx-postgres/SKILL.md +0 -512
- package/ai-config/skills/database/redis-cache/SKILL.md +0 -343
- package/ai-config/skills/database/sqlite-embedded/SKILL.md +0 -388
- package/ai-config/skills/database/timescaledb/SKILL.md +0 -320
- package/ai-config/skills/docs/api-documentation/SKILL.md +0 -293
- package/ai-config/skills/docs/docs-spring/SKILL.md +0 -377
- package/ai-config/skills/docs/mustache-templates/SKILL.md +0 -190
- package/ai-config/skills/docs/technical-docs/SKILL.md +0 -447
- package/ai-config/skills/frontend/astro-ssr/SKILL.md +0 -441
- package/ai-config/skills/frontend/frontend-design/SKILL.md +0 -54
- package/ai-config/skills/frontend/frontend-web/SKILL.md +0 -368
- package/ai-config/skills/frontend/mantine-ui/SKILL.md +0 -396
- package/ai-config/skills/frontend/tanstack-query/SKILL.md +0 -439
- package/ai-config/skills/frontend/zod-validation/SKILL.md +0 -417
- package/ai-config/skills/frontend/zustand-state/SKILL.md +0 -350
- package/ai-config/skills/infrastructure/chaos-engineering/SKILL.md +0 -244
- package/ai-config/skills/infrastructure/chaos-spring/SKILL.md +0 -378
- package/ai-config/skills/infrastructure/devops-infra/SKILL.md +0 -435
- package/ai-config/skills/infrastructure/docker-containers/SKILL.md +0 -420
- package/ai-config/skills/infrastructure/kubernetes/SKILL.md +0 -456
- package/ai-config/skills/infrastructure/opentelemetry/SKILL.md +0 -546
- package/ai-config/skills/infrastructure/traefik-proxy/SKILL.md +0 -474
- package/ai-config/skills/infrastructure/woodpecker-ci/SKILL.md +0 -315
- package/ai-config/skills/mobile/ionic-capacitor/SKILL.md +0 -504
- package/ai-config/skills/mobile/mobile-ionic/SKILL.md +0 -448
- package/ai-config/skills/prompt-improver/SKILL.md +0 -125
- package/ai-config/skills/quality/ghagga-review/SKILL.md +0 -216
- package/ai-config/skills/references/hooks-patterns/SKILL.md +0 -238
- package/ai-config/skills/references/mcp-servers/SKILL.md +0 -275
- package/ai-config/skills/references/plugins-reference/SKILL.md +0 -110
- package/ai-config/skills/references/skills-reference/SKILL.md +0 -420
- package/ai-config/skills/references/subagent-templates/SKILL.md +0 -193
- package/ai-config/skills/systems-iot/modbus-protocol/SKILL.md +0 -410
- package/ai-config/skills/systems-iot/mqtt-rumqttc/SKILL.md +0 -408
- package/ai-config/skills/systems-iot/rust-systems/SKILL.md +0 -386
- package/ai-config/skills/systems-iot/tokio-async/SKILL.md +0 -324
- package/ai-config/skills/testing/playwright-e2e/SKILL.md +0 -289
- package/ai-config/skills/testing/testcontainers/SKILL.md +0 -299
- package/ai-config/skills/testing/vitest-testing/SKILL.md +0 -381
- package/ai-config/skills/workflow/ci-local-guide/SKILL.md +0 -118
- package/ai-config/skills/workflow/claude-automation-recommender/SKILL.md +0 -299
- package/ai-config/skills/workflow/claude-md-improver/SKILL.md +0 -158
- package/ai-config/skills/workflow/finishing-a-development-branch/SKILL.md +0 -117
- package/ai-config/skills/workflow/git-github/SKILL.md +0 -334
- package/ai-config/skills/workflow/git-github/references/examples.md +0 -160
- package/ai-config/skills/workflow/git-workflow/SKILL.md +0 -214
- package/ai-config/skills/workflow/ide-plugins/SKILL.md +0 -277
- package/ai-config/skills/workflow/ide-plugins-intellij/SKILL.md +0 -401
- package/ai-config/skills/workflow/obsidian-brain-workflow/SKILL.md +0 -199
- package/ai-config/skills/workflow/using-git-worktrees/SKILL.md +0 -100
- package/ai-config/skills/workflow/verification-before-completion/SKILL.md +0 -73
- package/ai-config/skills/workflow/wave-workflow/SKILL.md +0 -178
- package/schemas/agent.schema.json +0 -34
- package/schemas/ai-config.schema.json +0 -28
- package/schemas/plugin.schema.json +0 -62
- package/schemas/skill.schema.json +0 -44
|
@@ -1,377 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: docs-spring
|
|
3
|
-
description: >
|
|
4
|
-
Spring Boot API documentation. SpringDoc, Swagger UI, Redoc, custom themes.
|
|
5
|
-
Trigger: apigen-docs, SpringDoc, Swagger, OpenAPI, @Operation, @Schema
|
|
6
|
-
tools:
|
|
7
|
-
- Read
|
|
8
|
-
- Write
|
|
9
|
-
- Edit
|
|
10
|
-
- Bash
|
|
11
|
-
- Grep
|
|
12
|
-
metadata:
|
|
13
|
-
author: apigen-team
|
|
14
|
-
version: "1.0"
|
|
15
|
-
tags: [documentation, spring-boot, springdoc, java]
|
|
16
|
-
scope: ["apigen-docs/**"]
|
|
17
|
-
---
|
|
18
|
-
|
|
19
|
-
# API Documentation Spring Boot (apigen-docs)
|
|
20
|
-
|
|
21
|
-
## Configuration
|
|
22
|
-
|
|
23
|
-
```yaml
|
|
24
|
-
apigen:
|
|
25
|
-
docs:
|
|
26
|
-
enabled: true
|
|
27
|
-
|
|
28
|
-
openapi:
|
|
29
|
-
title: ${spring.application.name}
|
|
30
|
-
version: ${app.version:1.0.0}
|
|
31
|
-
description: API Documentation
|
|
32
|
-
contact:
|
|
33
|
-
name: API Support
|
|
34
|
-
email: support@example.com
|
|
35
|
-
license:
|
|
36
|
-
name: Apache 2.0
|
|
37
|
-
url: https://www.apache.org/licenses/LICENSE-2.0
|
|
38
|
-
|
|
39
|
-
swagger-ui:
|
|
40
|
-
enabled: true
|
|
41
|
-
path: /swagger-ui
|
|
42
|
-
theme: dark # default, dark, feeling-blue
|
|
43
|
-
try-it-out: true
|
|
44
|
-
|
|
45
|
-
redoc:
|
|
46
|
-
enabled: true
|
|
47
|
-
path: /redoc
|
|
48
|
-
|
|
49
|
-
graphql-playground:
|
|
50
|
-
enabled: true
|
|
51
|
-
path: /graphql-playground
|
|
52
|
-
|
|
53
|
-
springdoc:
|
|
54
|
-
api-docs:
|
|
55
|
-
path: /api-docs
|
|
56
|
-
show-actuator: false
|
|
57
|
-
packages-to-scan: com.example.api
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
## OpenAPI Configuration
|
|
61
|
-
|
|
62
|
-
```java
|
|
63
|
-
@Configuration
|
|
64
|
-
@EnableConfigurationProperties(DocsProperties.class)
|
|
65
|
-
public class OpenApiConfiguration {
|
|
66
|
-
|
|
67
|
-
@Bean
|
|
68
|
-
public OpenAPI customOpenAPI(DocsProperties props) {
|
|
69
|
-
return new OpenAPI()
|
|
70
|
-
.info(new Info()
|
|
71
|
-
.title(props.getOpenapi().getTitle())
|
|
72
|
-
.version(props.getOpenapi().getVersion())
|
|
73
|
-
.description(props.getOpenapi().getDescription())
|
|
74
|
-
.contact(new Contact()
|
|
75
|
-
.name(props.getOpenapi().getContact().getName())
|
|
76
|
-
.email(props.getOpenapi().getContact().getEmail()))
|
|
77
|
-
.license(new License()
|
|
78
|
-
.name(props.getOpenapi().getLicense().getName())
|
|
79
|
-
.url(props.getOpenapi().getLicense().getUrl())))
|
|
80
|
-
.externalDocs(new ExternalDocumentation()
|
|
81
|
-
.description("API Guide")
|
|
82
|
-
.url("https://docs.example.com"))
|
|
83
|
-
.components(new Components()
|
|
84
|
-
.addSecuritySchemes("bearerAuth", securityScheme()))
|
|
85
|
-
.security(List.of(new SecurityRequirement().addList("bearerAuth")));
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
private SecurityScheme securityScheme() {
|
|
89
|
-
return new SecurityScheme()
|
|
90
|
-
.type(SecurityScheme.Type.HTTP)
|
|
91
|
-
.scheme("bearer")
|
|
92
|
-
.bearerFormat("JWT")
|
|
93
|
-
.description("JWT token from /auth/login endpoint");
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
@Bean
|
|
97
|
-
public GroupedOpenApi publicApi() {
|
|
98
|
-
return GroupedOpenApi.builder()
|
|
99
|
-
.group("public")
|
|
100
|
-
.pathsToMatch("/api/**")
|
|
101
|
-
.pathsToExclude("/api/admin/**")
|
|
102
|
-
.build();
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
@Bean
|
|
106
|
-
public GroupedOpenApi adminApi() {
|
|
107
|
-
return GroupedOpenApi.builder()
|
|
108
|
-
.group("admin")
|
|
109
|
-
.pathsToMatch("/api/admin/**")
|
|
110
|
-
.build();
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
```
|
|
114
|
-
|
|
115
|
-
## Controller Annotations
|
|
116
|
-
|
|
117
|
-
```java
|
|
118
|
-
@RestController
|
|
119
|
-
@RequestMapping("/api/users")
|
|
120
|
-
@Tag(name = "Users", description = "User management operations")
|
|
121
|
-
@SecurityRequirement(name = "bearerAuth")
|
|
122
|
-
public class UserController {
|
|
123
|
-
|
|
124
|
-
@Operation(
|
|
125
|
-
summary = "Get user by ID",
|
|
126
|
-
description = "Retrieves a user by their unique identifier",
|
|
127
|
-
responses = {
|
|
128
|
-
@ApiResponse(
|
|
129
|
-
responseCode = "200",
|
|
130
|
-
description = "User found",
|
|
131
|
-
content = @Content(schema = @Schema(implementation = UserDTO.class))),
|
|
132
|
-
@ApiResponse(
|
|
133
|
-
responseCode = "404",
|
|
134
|
-
description = "User not found",
|
|
135
|
-
content = @Content(schema = @Schema(implementation = ProblemDetail.class)))
|
|
136
|
-
}
|
|
137
|
-
)
|
|
138
|
-
@GetMapping("/{id}")
|
|
139
|
-
public UserDTO getUser(
|
|
140
|
-
@Parameter(description = "User ID", example = "123e4567-e89b-12d3-a456-426614174000")
|
|
141
|
-
@PathVariable UUID id) {
|
|
142
|
-
return userService.findById(id);
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
@Operation(
|
|
146
|
-
summary = "Create user",
|
|
147
|
-
description = "Creates a new user account"
|
|
148
|
-
)
|
|
149
|
-
@ApiResponse(responseCode = "201", description = "User created")
|
|
150
|
-
@ApiResponse(responseCode = "400", description = "Invalid input")
|
|
151
|
-
@ApiResponse(responseCode = "409", description = "Email already exists")
|
|
152
|
-
@PostMapping
|
|
153
|
-
@ResponseStatus(HttpStatus.CREATED)
|
|
154
|
-
public UserDTO createUser(
|
|
155
|
-
@RequestBody @Valid
|
|
156
|
-
@io.swagger.v3.oas.annotations.parameters.RequestBody(
|
|
157
|
-
description = "User to create",
|
|
158
|
-
required = true,
|
|
159
|
-
content = @Content(
|
|
160
|
-
examples = @ExampleObject(
|
|
161
|
-
name = "Example user",
|
|
162
|
-
value = """
|
|
163
|
-
{
|
|
164
|
-
"email": "john@example.com",
|
|
165
|
-
"name": "John Doe",
|
|
166
|
-
"password": "SecurePass123!"
|
|
167
|
-
}
|
|
168
|
-
"""
|
|
169
|
-
)
|
|
170
|
-
)
|
|
171
|
-
)
|
|
172
|
-
CreateUserRequest request) {
|
|
173
|
-
return userService.create(request);
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
@Operation(
|
|
177
|
-
summary = "List users",
|
|
178
|
-
description = "Returns a paginated list of users"
|
|
179
|
-
)
|
|
180
|
-
@GetMapping
|
|
181
|
-
public Page<UserDTO> listUsers(
|
|
182
|
-
@Parameter(description = "Page number (0-indexed)")
|
|
183
|
-
@RequestParam(defaultValue = "0") int page,
|
|
184
|
-
|
|
185
|
-
@Parameter(description = "Page size")
|
|
186
|
-
@RequestParam(defaultValue = "20") int size,
|
|
187
|
-
|
|
188
|
-
@Parameter(description = "Filter by status")
|
|
189
|
-
@RequestParam(required = false) UserStatus status) {
|
|
190
|
-
return userService.findAll(PageRequest.of(page, size), status);
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
```
|
|
194
|
-
|
|
195
|
-
## Schema Annotations
|
|
196
|
-
|
|
197
|
-
```java
|
|
198
|
-
@Schema(description = "User data transfer object")
|
|
199
|
-
public record UserDTO(
|
|
200
|
-
@Schema(description = "Unique user identifier",
|
|
201
|
-
example = "123e4567-e89b-12d3-a456-426614174000",
|
|
202
|
-
accessMode = Schema.AccessMode.READ_ONLY)
|
|
203
|
-
UUID id,
|
|
204
|
-
|
|
205
|
-
@Schema(description = "User email address",
|
|
206
|
-
example = "john@example.com",
|
|
207
|
-
requiredMode = Schema.RequiredMode.REQUIRED)
|
|
208
|
-
String email,
|
|
209
|
-
|
|
210
|
-
@Schema(description = "User display name",
|
|
211
|
-
example = "John Doe",
|
|
212
|
-
maxLength = 100)
|
|
213
|
-
String name,
|
|
214
|
-
|
|
215
|
-
@Schema(description = "User account status",
|
|
216
|
-
defaultValue = "ACTIVE")
|
|
217
|
-
UserStatus status,
|
|
218
|
-
|
|
219
|
-
@Schema(description = "Account creation timestamp",
|
|
220
|
-
accessMode = Schema.AccessMode.READ_ONLY)
|
|
221
|
-
Instant createdAt
|
|
222
|
-
) {}
|
|
223
|
-
|
|
224
|
-
@Schema(description = "Request to create a new user")
|
|
225
|
-
public record CreateUserRequest(
|
|
226
|
-
@Schema(description = "Email address", example = "john@example.com")
|
|
227
|
-
@Email @NotBlank
|
|
228
|
-
String email,
|
|
229
|
-
|
|
230
|
-
@Schema(description = "Display name", example = "John Doe")
|
|
231
|
-
@NotBlank @Size(max = 100)
|
|
232
|
-
String name,
|
|
233
|
-
|
|
234
|
-
@Schema(description = "Password (min 8 chars, must contain uppercase, lowercase, digit)",
|
|
235
|
-
example = "SecurePass123!",
|
|
236
|
-
minLength = 8)
|
|
237
|
-
@NotBlank @Size(min = 8)
|
|
238
|
-
String password
|
|
239
|
-
) {}
|
|
240
|
-
```
|
|
241
|
-
|
|
242
|
-
## Custom Swagger UI Theme
|
|
243
|
-
|
|
244
|
-
```java
|
|
245
|
-
@Bean
|
|
246
|
-
public SwaggerUiConfigProperties swaggerUiConfig() {
|
|
247
|
-
SwaggerUiConfigProperties props = new SwaggerUiConfigProperties();
|
|
248
|
-
props.setPath("/swagger-ui");
|
|
249
|
-
props.setTryItOutEnabled(true);
|
|
250
|
-
props.setFilter(true);
|
|
251
|
-
props.setShowExtensions(true);
|
|
252
|
-
props.setPersistAuthorization(true);
|
|
253
|
-
return props;
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
// Custom CSS for dark theme
|
|
257
|
-
@Bean
|
|
258
|
-
public WebMvcConfigurer swaggerUiCustomizer() {
|
|
259
|
-
return new WebMvcConfigurer() {
|
|
260
|
-
@Override
|
|
261
|
-
public void addResourceHandlers(ResourceHandlerRegistry registry) {
|
|
262
|
-
registry.addResourceHandler("/swagger-ui/custom.css")
|
|
263
|
-
.addResourceLocations("classpath:/static/swagger/");
|
|
264
|
-
}
|
|
265
|
-
};
|
|
266
|
-
}
|
|
267
|
-
```
|
|
268
|
-
|
|
269
|
-
## Redoc Configuration
|
|
270
|
-
|
|
271
|
-
```java
|
|
272
|
-
@Controller
|
|
273
|
-
@ConditionalOnProperty(prefix = "apigen.docs.redoc", name = "enabled", havingValue = "true")
|
|
274
|
-
public class RedocController {
|
|
275
|
-
|
|
276
|
-
@GetMapping("/redoc")
|
|
277
|
-
public String redoc(Model model) {
|
|
278
|
-
model.addAttribute("specUrl", "/api-docs");
|
|
279
|
-
model.addAttribute("options", Map.of(
|
|
280
|
-
"hideDownloadButton", false,
|
|
281
|
-
"hideHostname", false,
|
|
282
|
-
"expandResponses", "200,201",
|
|
283
|
-
"theme", Map.of(
|
|
284
|
-
"colors", Map.of(
|
|
285
|
-
"primary", Map.of("main", "#1976d2")
|
|
286
|
-
)
|
|
287
|
-
)
|
|
288
|
-
));
|
|
289
|
-
return "redoc";
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
```
|
|
293
|
-
|
|
294
|
-
```html
|
|
295
|
-
<!-- templates/redoc.html -->
|
|
296
|
-
<!DOCTYPE html>
|
|
297
|
-
<html>
|
|
298
|
-
<head>
|
|
299
|
-
<title>API Documentation</title>
|
|
300
|
-
<link href="https://fonts.googleapis.com/css?family=Montserrat:300,400,700" rel="stylesheet">
|
|
301
|
-
<style>body { margin: 0; padding: 0; }</style>
|
|
302
|
-
</head>
|
|
303
|
-
<body>
|
|
304
|
-
<redoc spec-url="/api-docs" th:attr="spec-url=${specUrl}"></redoc>
|
|
305
|
-
<script src="https://cdn.redoc.ly/redoc/latest/bundles/redoc.standalone.js"></script>
|
|
306
|
-
</body>
|
|
307
|
-
</html>
|
|
308
|
-
```
|
|
309
|
-
|
|
310
|
-
## OpenAPI Customizer
|
|
311
|
-
|
|
312
|
-
```java
|
|
313
|
-
@Component
|
|
314
|
-
public class ApiDocsCustomizer implements OpenApiCustomizer {
|
|
315
|
-
|
|
316
|
-
@Override
|
|
317
|
-
public void customise(OpenAPI openApi) {
|
|
318
|
-
// Add common headers
|
|
319
|
-
openApi.getPaths().values().forEach(pathItem ->
|
|
320
|
-
pathItem.readOperations().forEach(operation -> {
|
|
321
|
-
if (operation.getParameters() == null) {
|
|
322
|
-
operation.setParameters(new ArrayList<>());
|
|
323
|
-
}
|
|
324
|
-
operation.getParameters().add(new Parameter()
|
|
325
|
-
.name("X-Request-ID")
|
|
326
|
-
.in("header")
|
|
327
|
-
.description("Request correlation ID")
|
|
328
|
-
.schema(new StringSchema().format("uuid")));
|
|
329
|
-
})
|
|
330
|
-
);
|
|
331
|
-
|
|
332
|
-
// Add server list
|
|
333
|
-
openApi.setServers(List.of(
|
|
334
|
-
new Server().url("https://api.example.com").description("Production"),
|
|
335
|
-
new Server().url("https://staging.api.example.com").description("Staging"),
|
|
336
|
-
new Server().url("http://localhost:8080").description("Local")
|
|
337
|
-
));
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
```
|
|
341
|
-
|
|
342
|
-
## REST Controller for Docs
|
|
343
|
-
|
|
344
|
-
```java
|
|
345
|
-
@RestController
|
|
346
|
-
@RequestMapping("/api/docs")
|
|
347
|
-
public class DocsController {
|
|
348
|
-
|
|
349
|
-
private final ResourceLoader resourceLoader;
|
|
350
|
-
|
|
351
|
-
@GetMapping("/openapi.yaml")
|
|
352
|
-
public ResponseEntity<Resource> getOpenApiYaml() {
|
|
353
|
-
Resource resource = resourceLoader.getResource("classpath:openapi/api.yaml");
|
|
354
|
-
return ResponseEntity.ok()
|
|
355
|
-
.contentType(MediaType.parseMediaType("application/x-yaml"))
|
|
356
|
-
.body(resource);
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
@GetMapping("/changelog")
|
|
360
|
-
public ResponseEntity<String> getChangelog() throws IOException {
|
|
361
|
-
Resource resource = resourceLoader.getResource("classpath:docs/CHANGELOG.md");
|
|
362
|
-
String content = StreamUtils.copyToString(
|
|
363
|
-
resource.getInputStream(), StandardCharsets.UTF_8);
|
|
364
|
-
return ResponseEntity.ok()
|
|
365
|
-
.contentType(MediaType.TEXT_MARKDOWN)
|
|
366
|
-
.body(content);
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
```
|
|
370
|
-
|
|
371
|
-
## Related Skills
|
|
372
|
-
|
|
373
|
-
- `api-documentation`: API documentation concepts
|
|
374
|
-
- `spring-boot-4`: Spring Boot 4.0 patterns
|
|
375
|
-
- `apigen-architecture`: Overall system architecture
|
|
376
|
-
|
|
377
|
-
|
|
@@ -1,190 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: mustache-templates
|
|
3
|
-
description: >
|
|
4
|
-
Desarrollo de templates Mustache para generación de código. Sintaxis, contextos, partials.
|
|
5
|
-
Trigger: template mustache, .mustache, generación código, template context
|
|
6
|
-
tools:
|
|
7
|
-
- Read
|
|
8
|
-
- Write
|
|
9
|
-
- Edit
|
|
10
|
-
- Grep
|
|
11
|
-
- Glob
|
|
12
|
-
metadata:
|
|
13
|
-
author: apigen-team
|
|
14
|
-
version: "1.0"
|
|
15
|
-
tags: [mustache, templates, codegen]
|
|
16
|
-
scope: ["**/templates/**/*.mustache"]
|
|
17
|
-
---
|
|
18
|
-
|
|
19
|
-
# Mustache Templates
|
|
20
|
-
|
|
21
|
-
## Ubicación
|
|
22
|
-
|
|
23
|
-
```
|
|
24
|
-
apigen-codegen/src/main/resources/templates/
|
|
25
|
-
├── java/
|
|
26
|
-
├── kotlin/
|
|
27
|
-
├── csharp/
|
|
28
|
-
├── go-chi/
|
|
29
|
-
├── go-gin/
|
|
30
|
-
├── python-fastapi/
|
|
31
|
-
├── typescript-nestjs/
|
|
32
|
-
├── php-laravel/
|
|
33
|
-
└── rust-axum/
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
## Sintaxis Quick Reference
|
|
37
|
-
|
|
38
|
-
```mustache
|
|
39
|
-
{{! Comentario }}
|
|
40
|
-
{{variable}} {{! Variable }}
|
|
41
|
-
{{{rawHtml}}} {{! Sin escape }}
|
|
42
|
-
{{#section}}...{{/section}} {{! Si truthy }}
|
|
43
|
-
{{^section}}...{{/section}} {{! Si falsy }}
|
|
44
|
-
{{#list}}{{.}}{{/list}} {{! Iterar }}
|
|
45
|
-
{{> partial}} {{! Incluir }}
|
|
46
|
-
{{#-first}}...{{/-first}} {{! Primer item }}
|
|
47
|
-
{{#-last}}...{{/-last}} {{! Último item }}
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
## Patrones Comunes
|
|
51
|
-
|
|
52
|
-
### Imports Condicionales
|
|
53
|
-
|
|
54
|
-
```mustache
|
|
55
|
-
{{#hasValidation}}
|
|
56
|
-
import jakarta.validation.constraints.*;
|
|
57
|
-
{{/hasValidation}}
|
|
58
|
-
{{#hasJpa}}
|
|
59
|
-
import jakarta.persistence.*;
|
|
60
|
-
{{/hasJpa}}
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
### Lista con Separadores
|
|
64
|
-
|
|
65
|
-
```mustache
|
|
66
|
-
{{#columns}}
|
|
67
|
-
{{propertyName}}{{^-last}},{{/-last}}
|
|
68
|
-
{{/columns}}
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
### If-Else
|
|
72
|
-
|
|
73
|
-
```mustache
|
|
74
|
-
{{#nullable}}
|
|
75
|
-
Optional<{{type}}>
|
|
76
|
-
{{/nullable}}
|
|
77
|
-
{{^nullable}}
|
|
78
|
-
{{type}}
|
|
79
|
-
{{/nullable}}
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
### Default Value
|
|
83
|
-
|
|
84
|
-
```mustache
|
|
85
|
-
{{propertyName}}{{^propertyName}}defaultValue{{/propertyName}}
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
## Context Objects (Java)
|
|
89
|
-
|
|
90
|
-
```java
|
|
91
|
-
public class EntityTemplateContext {
|
|
92
|
-
String packageName;
|
|
93
|
-
String className;
|
|
94
|
-
String tableName;
|
|
95
|
-
List<ColumnContext> columns;
|
|
96
|
-
boolean hasAuditing;
|
|
97
|
-
boolean hasSoftDelete;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
public class ColumnContext {
|
|
101
|
-
String columnName;
|
|
102
|
-
String propertyName;
|
|
103
|
-
String javaType;
|
|
104
|
-
boolean required;
|
|
105
|
-
boolean isId;
|
|
106
|
-
boolean isRelationship;
|
|
107
|
-
String relatedClassName;
|
|
108
|
-
}
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
## Template Ejemplo Completo
|
|
112
|
-
|
|
113
|
-
```mustache
|
|
114
|
-
package {{packageName}}.entity;
|
|
115
|
-
|
|
116
|
-
import jakarta.persistence.*;
|
|
117
|
-
{{#hasLombok}}
|
|
118
|
-
import lombok.*;
|
|
119
|
-
{{/hasLombok}}
|
|
120
|
-
{{#hasValidation}}
|
|
121
|
-
import jakarta.validation.constraints.*;
|
|
122
|
-
{{/hasValidation}}
|
|
123
|
-
{{#hasAuditing}}
|
|
124
|
-
import org.springframework.data.annotation.*;
|
|
125
|
-
{{/hasAuditing}}
|
|
126
|
-
|
|
127
|
-
@Entity
|
|
128
|
-
@Table(name = "{{tableName}}")
|
|
129
|
-
{{#hasLombok}}
|
|
130
|
-
@Data
|
|
131
|
-
@Builder
|
|
132
|
-
@NoArgsConstructor
|
|
133
|
-
@AllArgsConstructor
|
|
134
|
-
{{/hasLombok}}
|
|
135
|
-
public class {{className}} {
|
|
136
|
-
|
|
137
|
-
@Id
|
|
138
|
-
@GeneratedValue(strategy = GenerationType.{{idStrategy}})
|
|
139
|
-
private {{idType}} id;
|
|
140
|
-
|
|
141
|
-
{{#columns}}
|
|
142
|
-
{{^isId}}
|
|
143
|
-
{{#isRelationship}}
|
|
144
|
-
@ManyToOne(fetch = FetchType.LAZY)
|
|
145
|
-
@JoinColumn(name = "{{columnName}}")
|
|
146
|
-
private {{relatedClassName}} {{propertyName}};
|
|
147
|
-
{{/isRelationship}}
|
|
148
|
-
{{^isRelationship}}
|
|
149
|
-
@Column(name = "{{columnName}}"{{#required}}, nullable = false{{/required}})
|
|
150
|
-
private {{javaType}} {{propertyName}};
|
|
151
|
-
{{/isRelationship}}
|
|
152
|
-
|
|
153
|
-
{{/isId}}
|
|
154
|
-
{{/columns}}
|
|
155
|
-
{{#hasAuditing}}
|
|
156
|
-
@CreatedDate
|
|
157
|
-
private Instant createdAt;
|
|
158
|
-
|
|
159
|
-
@LastModifiedDate
|
|
160
|
-
private Instant updatedAt;
|
|
161
|
-
{{/hasAuditing}}
|
|
162
|
-
}
|
|
163
|
-
```
|
|
164
|
-
|
|
165
|
-
## Testing Templates
|
|
166
|
-
|
|
167
|
-
```java
|
|
168
|
-
@Test
|
|
169
|
-
void shouldRenderEntity() {
|
|
170
|
-
var context = new EntityTemplateContext();
|
|
171
|
-
context.setClassName("User");
|
|
172
|
-
context.setTableName("users");
|
|
173
|
-
context.setColumns(List.of(
|
|
174
|
-
column("name", "String", false)
|
|
175
|
-
));
|
|
176
|
-
|
|
177
|
-
String result = engine.render("java/entity.mustache", context);
|
|
178
|
-
|
|
179
|
-
assertThat(result)
|
|
180
|
-
.contains("public class User")
|
|
181
|
-
.contains("@Table(name = \"users\")")
|
|
182
|
-
.contains("private String name");
|
|
183
|
-
}
|
|
184
|
-
```
|
|
185
|
-
|
|
186
|
-
## Related Skills
|
|
187
|
-
|
|
188
|
-
- `codegen-patterns`: Patrones de generación
|
|
189
|
-
- `apigen-codegen-dev`: Desarrollo del módulo
|
|
190
|
-
|