geneseed 4.9.4 → 4.10.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/CHANGELOG.md +21 -0
- package/README.md +13 -0
- package/SHIPPED.md +1 -1
- package/docs/README.md +1 -1
- package/docs/concepts/collaboration.md +1 -1
- package/docs/concepts/enforcement-table.md +1 -1
- package/docs/concepts/foreman-mode.md +1 -1
- package/docs/concepts/kits.md +79 -0
- package/docs/concepts/loop-branch.md +1 -1
- package/docs/concepts/loop-bricks.md +1 -1
- package/docs/concepts/loop-contracts.md +1 -1
- package/docs/concepts/loop-gates.md +1 -1
- package/docs/concepts/loop-notes.md +1 -1
- package/docs/concepts/loop-risk.md +1 -1
- package/docs/concepts/loop-templates.md +1 -1
- package/docs/concepts/loops.md +1 -1
- package/docs/concepts/lsp.md +1 -1
- package/docs/extending.md +108 -4
- package/docs/guides/install-scripted.md +1 -1
- package/docs/reference/glossary.md +1 -0
- package/docs/web-ui.md +4 -0
- package/harness.config.json +1 -1
- package/js/build/args.mjs +27 -6
- package/js/build/driver.mjs +29 -8
- package/js/build/emit-claude.mjs +3 -1
- package/js/build/generate.mjs +10 -5
- package/js/build/render.mjs +94 -11
- package/js/build/source.mjs +117 -4
- package/js/cli-table.json +15 -0
- package/js/hosts/installs.mjs +35 -2
- package/js/hosts/native.mjs +14 -4
- package/js/inspect/checks-authoring.mjs +6 -3
- package/js/inspect/checks-build.mjs +7 -1
- package/js/inspect/checks-counts.mjs +153 -6
- package/js/inspect/checks-repo.mjs +95 -20
- package/js/inspect/diff.mjs +3 -1
- package/js/inspect/inventory.mjs +1 -0
- package/js/inspect/status.mjs +44 -3
- package/js/inspect/validate.mjs +3 -3
- package/js/maintain/setup.mjs +30 -6
- package/js/maintain/update.mjs +1 -1
- package/js/web/actions.mjs +30 -6
- package/js/web/api.mjs +40 -3
- package/js/web/routes.mjs +2 -1
- package/package.json +1 -1
- package/registry.json +63 -0
- package/src/AGENT.md.tmpl +2 -2
- package/src/agents/devops-engineer.md +45 -0
- package/src/agents/docker-expert.md +45 -0
- package/src/agents/kubernetes-specialist.md +45 -0
- package/src/agents/reviewer.md +2 -0
- package/src/agents/spring-boot-engineer.md +48 -0
- package/src/agents/spring-reviewer.md +49 -0
- package/src/agents/spring-security.md +50 -0
- package/src/kits/spring-boot/rules.md +10 -0
- package/src/kits/spring-boot.json +23 -0
- package/src/licenses/mattpocock-skills.txt +21 -0
- package/src/licenses/piomin-spring-boot.txt +190 -0
- package/src/licenses/superpowers.txt +21 -0
- package/src/licenses/vibe-wise.txt +21 -0
- package/src/skills/brainstorm/builder-check.md +2 -0
- package/src/skills/brainstorm.md +4 -0
- package/src/skills/codebase-design.md +4 -0
- package/src/skills/daydream/VENDOR.md +7 -7
- package/src/skills/debug.md +5 -1
- package/src/skills/develop.md +2 -0
- package/src/skills/geneseed-code-review.md +6 -2
- package/src/skills/git-history.md +2 -0
- package/src/skills/handoff.md +2 -0
- package/src/skills/learn-mode.md +3 -2
- package/src/skills/parallel-agents.md +2 -0
- package/src/skills/pipeline.md +2 -0
- package/src/skills/plan.md +4 -0
- package/src/skills/prototype.md +2 -0
- package/src/skills/react-view-transitions/AGENTS.md +646 -221
- package/src/skills/react-view-transitions/SKILL.md +28 -16
- package/src/skills/react-view-transitions/VENDOR.md +10 -8
- package/src/skills/react-view-transitions/references/css-recipes.md +72 -2
- package/src/skills/react-view-transitions/references/implementation.md +14 -26
- package/src/skills/react-view-transitions/references/nextjs.md +94 -37
- package/src/skills/react-view-transitions/references/patterns.md +60 -48
- package/src/skills/react-view-transitions/references/troubleshooting.md +47 -0
- package/src/skills/research.md +2 -0
- package/src/skills/review-response.md +2 -0
- package/src/skills/rule.md +2 -0
- package/src/skills/ship.md +2 -0
- package/src/skills/skill-forge.md +1 -0
- package/src/skills/spring-boot/cloud.md +103 -0
- package/src/skills/spring-boot/java-modern.md +71 -0
- package/src/skills/spring-boot/logging.md +89 -0
- package/src/skills/spring-boot/security.md +112 -0
- package/src/skills/spring-boot/web.md +112 -0
- package/src/skills/spring-boot.md +57 -0
- package/src/skills/spring-data-jpa/patterns.md +68 -0
- package/src/skills/spring-data-jpa.md +81 -0
- package/src/skills/spring-testing.md +93 -0
- package/src/skills/wayfinder.md +2 -0
- package/src/upstreams.json +59 -0
- package/themes/_TEMPLATE.json +9 -0
- package/themes/biker.json +9 -0
- package/themes/commentator.json +9 -0
- package/themes/cyberpunk.json +9 -0
- package/themes/gamer.json +9 -0
- package/themes/imperial.json +9 -0
- package/themes/joker.json +9 -0
- package/themes/marvin.json +9 -0
- package/themes/mean.json +9 -0
- package/themes/military.json +9 -0
- package/themes/neutral.json +9 -0
- package/themes/pirate.json +9 -0
- package/themes/sports.json +9 -0
- package/themes/verstappen.json +9 -0
- package/themes/wizard.json +9 -0
- package/web/dist/assets/{Activity-C8sZVIUU.js → Activity-BjyJaf8e.js} +1 -1
- package/web/dist/assets/{ActivityDetail-Cc6vWUS4.js → ActivityDetail-Bo9nRDNV.js} +1 -1
- package/web/dist/assets/{Dashboard-C5ATa3ow.js → Dashboard-BQJGU7vE.js} +2 -2
- package/web/dist/assets/{Docs-tDW7i7mo.js → Docs-DLVckkew.js} +1 -1
- package/web/dist/assets/{GreenhouseView-zk2Uzc3A.js → GreenhouseView--DML7CW3.js} +1 -1
- package/web/dist/assets/{Installs-CB_rvbBP.js → Installs-CxCiln1F.js} +2 -2
- package/web/dist/assets/{JournalView-Bfj27XHC.js → JournalView-ymgZleHi.js} +1 -1
- package/web/dist/assets/{Laws-BA3CzUf5.js → Laws-BkKnZOBI.js} +1 -1
- package/web/dist/assets/Library-C8ercIZv.js +1 -0
- package/web/dist/assets/{Loops-DaPk-ckL.js → Loops-C95zhbFl.js} +1 -1
- package/web/dist/assets/{OperatorHudView-CyiGhiHk.js → OperatorHudView-B9qwc3w3.js} +1 -1
- package/web/dist/assets/{Personal-Bwd27CmT.js → Personal-DyR72AF-.js} +1 -1
- package/web/dist/assets/{Tabs-BOD7Kaz1.js → Tabs-ChCr_HqV.js} +1 -1
- package/web/dist/assets/api-BfpZmUMI.js +1 -0
- package/web/dist/assets/{drawable-CyLe1gtW.js → drawable-CgYi0Dtg.js} +1 -1
- package/web/dist/assets/index-B32EvfDT.js +2 -0
- package/web/dist/index.html +2 -2
- package/web/dist/assets/Library-BWwiy9Vb.js +0 -1
- package/web/dist/assets/api-CiXlkbe0.js +0 -1
- package/web/dist/assets/index-DQXG_mqo.js +0 -2
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# {{SKILL}}: spring-boot — web layer
|
|
2
|
+
|
|
3
|
+
{{CREDIT:piomin-spring-boot:skills/spring-boot/references/web.md}}
|
|
4
|
+
|
|
5
|
+
Controllers, validation, error handling and outbound HTTP for a Spring MVC service.
|
|
6
|
+
|
|
7
|
+
## Controller
|
|
8
|
+
Thin: bind, validate, delegate, shape the response. Create returns `201` with a `Location` header; delete returns `204`.
|
|
9
|
+
|
|
10
|
+
```java
|
|
11
|
+
@RestController
|
|
12
|
+
@RequestMapping("/api/v1/users")
|
|
13
|
+
class UserController {
|
|
14
|
+
private final UserService service;
|
|
15
|
+
|
|
16
|
+
UserController(UserService service) { this.service = service; }
|
|
17
|
+
|
|
18
|
+
@GetMapping
|
|
19
|
+
PagedModel<UserResponse> list(@PageableDefault(size = 20, sort = "createdAt") Pageable pageable) {
|
|
20
|
+
return new PagedModel<>(service.findAll(pageable));
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
@PostMapping
|
|
24
|
+
ResponseEntity<UserResponse> create(@Valid @RequestBody UserCreateRequest request) {
|
|
25
|
+
UserResponse user = service.create(request);
|
|
26
|
+
URI location = ServletUriComponentsBuilder.fromCurrentRequest()
|
|
27
|
+
.path("/{id}").buildAndExpand(user.id()).toUri();
|
|
28
|
+
return ResponseEntity.created(location).body(user);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
@DeleteMapping("/{id}")
|
|
32
|
+
@ResponseStatus(HttpStatus.NO_CONTENT)
|
|
33
|
+
void delete(@PathVariable Long id) { service.delete(id); }
|
|
34
|
+
}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Version the path (`/api/v1`). Use GET for reads, POST/PUT/PATCH/DELETE for state changes; never change state on GET.
|
|
38
|
+
|
|
39
|
+
## DTOs and validation
|
|
40
|
+
Records for request and response. Constraints sit on the record components (`jakarta.validation.constraints`); `@Valid` on the controller parameter triggers them. Put the entity-to-DTO mapping in a static factory or a mapper, not in the controller.
|
|
41
|
+
|
|
42
|
+
```java
|
|
43
|
+
public record UserCreateRequest(
|
|
44
|
+
@NotBlank @Email String email,
|
|
45
|
+
@NotBlank @Size(min = 8, max = 100) String password,
|
|
46
|
+
@Min(18) Integer age) {}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
A custom constraint is an annotation with `@Constraint(validatedBy = ...)` plus a `ConstraintValidator`; the validator may be a Spring bean and inject a repository. A uniqueness check in a validator is advisory only; the database constraint is the truth, so also handle `DataIntegrityViolationException` (409).
|
|
50
|
+
|
|
51
|
+
## Errors: Problem Details
|
|
52
|
+
Enable RFC 9457 responses for Spring's own exceptions:
|
|
53
|
+
|
|
54
|
+
```yaml
|
|
55
|
+
spring:
|
|
56
|
+
mvc:
|
|
57
|
+
problemdetails:
|
|
58
|
+
enabled: true
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Return `ProblemDetail` from your own handlers so every error shares one shape. Extending `ResponseEntityExceptionHandler` keeps the framework exceptions on that shape too.
|
|
62
|
+
|
|
63
|
+
```java
|
|
64
|
+
@RestControllerAdvice
|
|
65
|
+
class ApiExceptionHandler extends ResponseEntityExceptionHandler {
|
|
66
|
+
|
|
67
|
+
@ExceptionHandler(ResourceNotFoundException.class)
|
|
68
|
+
ProblemDetail notFound(ResourceNotFoundException ex) {
|
|
69
|
+
return ProblemDetail.forStatusAndDetail(HttpStatus.NOT_FOUND, ex.getMessage());
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
@ExceptionHandler(DataIntegrityViolationException.class)
|
|
73
|
+
ProblemDetail conflict(DataIntegrityViolationException ex) {
|
|
74
|
+
return ProblemDetail.forStatusAndDetail(HttpStatus.CONFLICT, "Resource already exists");
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
A domain exception can carry its own problem by extending `ErrorResponseException`. Never put stack traces or SQL text in `detail`; log the exception server-side and return a generic message for the catch-all 500.
|
|
80
|
+
|
|
81
|
+
## Outbound HTTP
|
|
82
|
+
Blocking calls use `RestClient`; build it from the injected `RestClient.Builder` so Boot's customizers (timeouts, SSL, observability) apply.
|
|
83
|
+
|
|
84
|
+
```java
|
|
85
|
+
@Bean
|
|
86
|
+
RestClient pricingClient(RestClient.Builder builder) {
|
|
87
|
+
return builder.baseUrl("https://api.example.com").build();
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
Quote fetch(String id) {
|
|
91
|
+
return pricingClient.get().uri("/quotes/{id}", id)
|
|
92
|
+
.retrieve()
|
|
93
|
+
.onStatus(status -> status.value() == 404, (req, res) -> {
|
|
94
|
+
throw new ResourceNotFoundException("Quote " + id);
|
|
95
|
+
})
|
|
96
|
+
.body(Quote.class);
|
|
97
|
+
}
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Prefer an `@HttpExchange` interface when the remote API has several operations (see [spring-boot/cloud.md](cloud.md)). `WebClient` is for reactive or streaming code only.
|
|
101
|
+
|
|
102
|
+
## CORS
|
|
103
|
+
Prefer one bean over scattered annotations. With Spring Security on the classpath configure CORS in the security chain ([spring-boot/security.md](security.md)); otherwise `WebMvcConfigurer.addCorsMappings`. List explicit origins; `allowedOrigins("*")` cannot be combined with credentials.
|
|
104
|
+
|
|
105
|
+
## Quick reference
|
|
106
|
+
| Need | Use |
|
|
107
|
+
|------|-----|
|
|
108
|
+
| Page and sort | `Pageable` + `@PageableDefault` |
|
|
109
|
+
| Bad input | `@Valid` -> 400 Problem Details |
|
|
110
|
+
| Missing resource | 404 via your exception handler |
|
|
111
|
+
| Duplicate | 409 from the DB constraint |
|
|
112
|
+
| Slow upstream | `spring.http.clients.connect-timeout` / `read-timeout` |
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# {{SKILL}}: spring-boot
|
|
2
|
+
|
|
3
|
+
> {{DESC_SPRING_BOOT}}
|
|
4
|
+
|
|
5
|
+
{{CREDIT:piomin-spring-boot:skills/spring-boot/SKILL.md}}
|
|
6
|
+
|
|
7
|
+
{{CREDIT:piomin-spring-boot:skills/conventions/SKILL.md}}
|
|
8
|
+
|
|
9
|
+
**Trigger:** writing or changing a Spring Boot application (Spring Boot 4, Spring Framework 7, Java 21+) — controllers, services, configuration, security, HTTP clients, logging, cloud-native deployment. Load it for any Spring Boot task, then read the side file the task needs. It does not replace the core review or refactor skills; for a Spring review or refactor, load those and use this one for the framework facts.
|
|
10
|
+
|
|
11
|
+
Target stack: Spring Boot 4 / Spring Framework 7 / Spring Security 7 / Hibernate 7 / Jakarta EE 11 / Java 21+. Check the project's actual versions first (`pom.xml` or `build.gradle`); if it is still on Boot 3, say so and do not apply the Boot 4 rows below blindly.
|
|
12
|
+
|
|
13
|
+
## Working loop
|
|
14
|
+
1. Read the build file, `application.yml` and the existing package layout. Match what the project already does (Maven or Gradle, its CI, its test style) before adding anything.
|
|
15
|
+
2. Confirm the design for anything beyond a small change: endpoints, DTOs, transaction boundaries, who authenticates.
|
|
16
|
+
3. Implement in layers, then run the project's own test command and read the output.
|
|
17
|
+
|
|
18
|
+
## Conventions
|
|
19
|
+
- Layering: controller (HTTP, validation) -> service (business logic, transactions) -> repository. Keep the package layout the project already has; for a new app a flat feature-or-layer split under one root package is fine (`com.example.<app>`).
|
|
20
|
+
- Constructor injection only; one constructor needs no `@Autowired`. Lombok is allowed where the project uses it.
|
|
21
|
+
- DTOs are records. JPA entities are not records. Never return an entity from a controller.
|
|
22
|
+
- `@Valid` on every request body; `@Transactional(readOnly = true)` on read services, `@Transactional` on mutating methods.
|
|
23
|
+
- Typed config: `@ConfigurationProperties` records instead of scattered `@Value`.
|
|
24
|
+
- Errors: one `@RestControllerAdvice`, Problem Details responses.
|
|
25
|
+
- Blocking outbound HTTP: `RestClient`, or an `@HttpExchange` interface. `WebClient` only for reactive or streaming code. Do not mix blocking and reactive in one call path.
|
|
26
|
+
- Jakarta namespaces only (`jakarta.persistence`, `jakarta.validation`, `jakarta.servlet`).
|
|
27
|
+
- Secrets from the environment or mounted files, never committed config.
|
|
28
|
+
- Tests: positive and negative cases; Testcontainers with `@ServiceConnection`; `@MockitoBean` for slice-test collaborators.
|
|
29
|
+
- Baseline properties worth enabling: `spring.threads.virtual.enabled: true`, `spring.mvc.problemdetails.enabled: true`, `server.shutdown: graceful`.
|
|
30
|
+
|
|
31
|
+
## Boot 4 pitfalls
|
|
32
|
+
Removed or renamed in Boot 4 (do not write them): `@MockBean` and `@SpyBean`, `ClientHttpRequestFactories`, `javax.persistence` (now `jakarta.persistence`), Spring Security 6 idioms such as `authorizeRequests` and `.and()` chains. <!-- banned: ok -->
|
|
33
|
+
|
|
34
|
+
| Old habit | Boot 4 / Framework 7 reality |
|
|
35
|
+
|-----------|------------------------------|
|
|
36
|
+
| Mock beans in slice tests | `@MockitoBean`, `@MockitoSpyBean` (`org.springframework.test.context.bean.override.mockito`) |
|
|
37
|
+
| Hand-built request factories | `ClientHttpRequestFactoryBuilder` with `HttpClientSettings` |
|
|
38
|
+
| Security configuration | Spring Security 7: lambda DSL, `authorizeHttpRequests` |
|
|
39
|
+
| `org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest` | `org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest`: slices moved to per-technology modules; import from the new packages |
|
|
40
|
+
| Jackson 2 (`com.fasterxml.jackson`) | Jackson 3 is the default (`tools.jackson`); Jackson 2 support is deprecated, `spring.jackson.use-jackson2-defaults` eases migration |
|
|
41
|
+
| `@DynamicPropertySource` for container URLs | `@ServiceConnection` on the container |
|
|
42
|
+
| MockMvc status assertions via Hamcrest | `MockMvcTester` (AssertJ) or `RestTestClient` with `@AutoConfigureRestTestClient` |
|
|
43
|
+
| OpenFeign for declarative clients | `@HttpExchange` interfaces, registered with `@ImportHttpServices` |
|
|
44
|
+
| Zipkin-only tracing setup | `spring-boot-starter-opentelemetry`, `management.opentelemetry.tracing.export.otlp.*` |
|
|
45
|
+
| Starters assumed to pull everything | Boot 4 starters are modular; add the matching starter or test starter for each technology, and read the migration guide when a class vanishes |
|
|
46
|
+
|
|
47
|
+
## Side files
|
|
48
|
+
- **Web/REST** -> read [spring-boot/web.md](spring-boot/web.md) and follow it.
|
|
49
|
+
- **Security (OAuth2 resource server, method security, SSL bundles)** -> read [spring-boot/security.md](spring-boot/security.md) and follow it.
|
|
50
|
+
- **Cloud-native (config, gateway, resilience, tracing, Kubernetes, images)** -> read [spring-boot/cloud.md](spring-boot/cloud.md) and follow it.
|
|
51
|
+
- **Modern Java in Spring code (records, sealed types, pattern matching, null safety)** -> read [spring-boot/java-modern.md](spring-boot/java-modern.md) and follow it.
|
|
52
|
+
- **Logging and structured logs** -> read [spring-boot/logging.md](spring-boot/logging.md) and follow it.
|
|
53
|
+
|
|
54
|
+
## Done when
|
|
55
|
+
- The project's build and tests pass, read from real output; no deprecated Boot 2/3 idiom was introduced; every new endpoint validates input and has a negative test.
|
|
56
|
+
|
|
57
|
+
<!-- INCLUDE: skills/_self-improvement.md -->
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# {{SKILL}}: spring-data-jpa — outbox, saga, CQRS
|
|
2
|
+
|
|
3
|
+
{{CREDIT:piomin-spring-boot:skills/design-patterns/SKILL.md}}
|
|
4
|
+
|
|
5
|
+
Use when a write must also publish an event, a business process spans services, or reads and writes need separate models. If a plain `@Transactional` method does the job, do not add these.
|
|
6
|
+
|
|
7
|
+
## Transactional outbox
|
|
8
|
+
|
|
9
|
+
Dual write (save, then publish to a broker) can lose or duplicate the event. Write the event row in the same transaction as the state change; a separate relay publishes it.
|
|
10
|
+
|
|
11
|
+
```java
|
|
12
|
+
@Entity
|
|
13
|
+
public class OutboxEvent {
|
|
14
|
+
@Id @GeneratedValue(strategy = GenerationType.UUID) UUID id;
|
|
15
|
+
String aggregateId;
|
|
16
|
+
String type;
|
|
17
|
+
@Column(columnDefinition = "text") String payload;
|
|
18
|
+
boolean published;
|
|
19
|
+
// constructor, getters
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
@Service
|
|
23
|
+
class OrderService {
|
|
24
|
+
@Transactional
|
|
25
|
+
public Order place(OrderRequest req) {
|
|
26
|
+
Order order = orders.save(Order.from(req));
|
|
27
|
+
outbox.save(new OutboxEvent(order.getId().toString(), "OrderPlaced", json(order)));
|
|
28
|
+
return order; // both rows commit or neither does
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
@Component
|
|
33
|
+
class OutboxRelay {
|
|
34
|
+
@Scheduled(fixedDelay = 1000) // needs @EnableScheduling on a config class
|
|
35
|
+
@Transactional
|
|
36
|
+
void relay() {
|
|
37
|
+
for (OutboxEvent e : outbox.findTop100ByPublishedFalseOrderByIdAsc()) {
|
|
38
|
+
publisher.send(e); // broker client; may throw, row stays unpublished
|
|
39
|
+
e.setPublished(true);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
- Delivery is at-least-once: consumers dedupe on the event id.
|
|
46
|
+
- Several relay instances will pick the same rows. Use a single relay, or a row-claiming query verified for your database (not covered here), or a lock.
|
|
47
|
+
- Delete or archive published rows on a schedule.
|
|
48
|
+
- In-process alternative: publish a Spring `ApplicationEvent` and handle it with `@TransactionalEventListener` (default phase `AFTER_COMMIT`). The handler runs only if the transaction commits, and it is not durable: a crash after commit loses the event. Use it for in-JVM side effects, the outbox table for anything that must survive a crash. If the listener must write to the database again, annotate it `@Transactional(propagation = Propagation.REQUIRES_NEW)`.
|
|
49
|
+
|
|
50
|
+
## Saga
|
|
51
|
+
|
|
52
|
+
| Style | Mechanism | Pick when |
|
|
53
|
+
|-------|-----------|-----------|
|
|
54
|
+
| Choreography | each service reacts to the previous service's event and emits its own (events through the outbox) | few steps, no central owner |
|
|
55
|
+
| Orchestration | one `OrderSaga` component sends commands, tracks state in its own table, issues compensations | many steps, branching, need to see where a flow is stuck |
|
|
56
|
+
|
|
57
|
+
- Every step has a compensating action (cancel, refund, release); compensations must be idempotent.
|
|
58
|
+
- Persist saga state (`STARTED`, `PAYMENT_DONE`, `FAILED`, ...) with `@Version` so concurrent events cannot both advance it.
|
|
59
|
+
- Timeouts are events too: a scheduled job moves stale sagas to compensation.
|
|
60
|
+
- Messaging infrastructure (Spring Cloud Stream, plain Kafka or AMQP clients) is project-specific and not verified here; keep the saga logic behind a small publisher interface.
|
|
61
|
+
|
|
62
|
+
## CQRS
|
|
63
|
+
|
|
64
|
+
Split only when read and write shapes diverge. Smallest useful form, same database:
|
|
65
|
+
|
|
66
|
+
- Write side: aggregate entities and `@Transactional` command services.
|
|
67
|
+
- Read side: projection or DTO-record repository methods (or a view) behind a `@Transactional(readOnly = true)` query service; never return entities.
|
|
68
|
+
- A separate read store fed by outbox events adds eventual consistency: show it in the API (version or timestamp) and accept stale reads.
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# {{SKILL}}: spring-data-jpa
|
|
2
|
+
|
|
3
|
+
> {{DESC_SPRING_DATA_JPA}}
|
|
4
|
+
|
|
5
|
+
{{CREDIT:piomin-spring-boot:skills/jpa-patterns/SKILL.md}}
|
|
6
|
+
|
|
7
|
+
{{CREDIT:piomin-spring-boot:skills/spring-boot/references/data.md}}
|
|
8
|
+
|
|
9
|
+
**Trigger:** a Spring Data JPA / Hibernate task in a Spring Boot project: entities, repositories, N+1 queries, `LazyInitializationException`, transactions, locking, projections, Flyway or Liquibase migrations, soft delete, or a transactional outbox. Spring-specific; for generic query or schema work outside Spring, do not load it.
|
|
10
|
+
|
|
11
|
+
Target stack: Spring Boot 4, Hibernate 7, Jakarta Persistence (`jakarta.persistence.*` only).
|
|
12
|
+
|
|
13
|
+
## Symptom to fix
|
|
14
|
+
|
|
15
|
+
| Symptom | Fix |
|
|
16
|
+
|---------|-----|
|
|
17
|
+
| N+1 SELECTs | `@EntityGraph(attributePaths = "books")` or `JOIN FETCH`; as a mitigation only, `hibernate.default_batch_fetch_size` (batch fetching mitigates N+1, it does not solve it) |
|
|
18
|
+
| `LazyInitializationException` | fetch what the use case needs inside the transaction (graph / `JOIN FETCH`) or return a DTO; do not flip associations to `EAGER` |
|
|
19
|
+
| Slow list endpoints | `Pageable` (`Slice` when no total is needed), interface or record projections, indexes |
|
|
20
|
+
| Lost updates | `@Version` (optimistic); `@Lock(LockModeType.PESSIMISTIC_WRITE)` only for hot rows |
|
|
21
|
+
| Slow read-only service | `@Transactional(readOnly = true)` on the class, override on writes |
|
|
22
|
+
| Transaction ignored | self-invocation bypasses the proxy: call through another bean |
|
|
23
|
+
|
|
24
|
+
## Entities
|
|
25
|
+
|
|
26
|
+
```java
|
|
27
|
+
@Entity
|
|
28
|
+
@SoftDelete // Hibernate: adds a deleted-flag column, filters reads
|
|
29
|
+
public class Author {
|
|
30
|
+
@Id @GeneratedValue(strategy = GenerationType.UUID)
|
|
31
|
+
private UUID id;
|
|
32
|
+
@Version private long version;
|
|
33
|
+
@OneToMany(mappedBy = "author", fetch = FetchType.LAZY)
|
|
34
|
+
private List<Book> books = new ArrayList<>();
|
|
35
|
+
// getters/setters, or Lombok if the project uses it
|
|
36
|
+
}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
- Every to-one and to-many is `LAZY`; decide fetching per query, not on the mapping.
|
|
40
|
+
- `@SoftDelete(strategy = ...)` takes `ACTIVE`, `DELETED`, or `TIMESTAMP`; the default stores a deleted flag.
|
|
41
|
+
- `GenerationType.UUID` generates the id in Java; `IDENTITY` and `SEQUENCE` need the database.
|
|
42
|
+
- Equality on entities: id-based with a stable hash, or business key. Never include lazy collections in `equals`/`toString`.
|
|
43
|
+
|
|
44
|
+
## Repositories and projections
|
|
45
|
+
|
|
46
|
+
```java
|
|
47
|
+
public interface AuthorRepository extends JpaRepository<Author, UUID> {
|
|
48
|
+
@EntityGraph(attributePaths = "books")
|
|
49
|
+
List<Author> findByNameStartingWith(String prefix);
|
|
50
|
+
|
|
51
|
+
record AuthorName(UUID id, String name) {}
|
|
52
|
+
List<AuthorName> findAllBy(Pageable pageable); // DTO projection
|
|
53
|
+
|
|
54
|
+
@Modifying(clearAutomatically = true)
|
|
55
|
+
@Query("update Author a set a.name = :name where a.id = :id")
|
|
56
|
+
int rename(UUID id, String name);
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
- Interface projections are built from tuple queries; DTO records need an all-args constructor and no column aliases in `@Query` JPQL.
|
|
61
|
+
- Bulk `@Modifying` queries bypass the persistence context: `clearAutomatically = true` or reload.
|
|
62
|
+
- Return DTOs from the web layer, never entities.
|
|
63
|
+
|
|
64
|
+
## Transactions and open-in-view
|
|
65
|
+
|
|
66
|
+
- Put `@Transactional` on service methods, not repositories or controllers.
|
|
67
|
+
- `spring.jpa.open-in-view` defaults to `true` in a web app (the EntityManager stays open through view rendering). Set it to `false` and fetch explicitly; it hides N+1 otherwise.
|
|
68
|
+
- Detect N+1: `spring.jpa.show-sql=true` is enough for a quick look; assert query counts in a `@DataJpaTest` for regressions.
|
|
69
|
+
|
|
70
|
+
## Migrations
|
|
71
|
+
|
|
72
|
+
Schema is owned by migrations, not `ddl-auto`: `spring.jpa.hibernate.ddl-auto=validate` (or `none`) with Flyway or Liquibase, whichever the project already uses. In Boot 4 add the starter (`spring-boot-starter-flyway`), not just the Flyway core jar, or auto-configuration does not apply; Postgres and MySQL also need `flyway-database-postgresql` / `flyway-mysql`. Migration files are immutable once merged; add a new one.
|
|
73
|
+
|
|
74
|
+
## Outbox, saga, CQRS
|
|
75
|
+
|
|
76
|
+
Event-publishing alongside a DB write (dual-write problem), distributed workflows, read/write model split: read [spring-data-jpa/patterns.md](spring-data-jpa/patterns.md).
|
|
77
|
+
|
|
78
|
+
## Done when
|
|
79
|
+
- No lazy collection is touched outside a transaction; hot queries show one SELECT per use case in the SQL log; schema changes ship as a migration; imports are `jakarta.persistence`.
|
|
80
|
+
|
|
81
|
+
<!-- INCLUDE: skills/_self-improvement.md -->
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# {{SKILL}}: spring-testing
|
|
2
|
+
|
|
3
|
+
> {{DESC_SPRING_TESTING}}
|
|
4
|
+
|
|
5
|
+
{{CREDIT:piomin-spring-boot:skills/testing-patterns/SKILL.md}}
|
|
6
|
+
|
|
7
|
+
{{CREDIT:piomin-spring-boot:skills/spring-boot/references/testing.md}}
|
|
8
|
+
|
|
9
|
+
**Trigger:** writing or fixing tests in a Spring Boot project: unit tests of services, `@WebMvcTest` / `@DataJpaTest` slices, `@SpringBootTest` integration tests, Testcontainers, mocking beans. Spring-specific; core test discipline lives in the test-gates and develop skills.
|
|
10
|
+
|
|
11
|
+
Target stack: Spring Boot 4, JUnit 5, Mockito, AssertJ.
|
|
12
|
+
|
|
13
|
+
## Pick the narrowest test
|
|
14
|
+
|
|
15
|
+
| Goal | Tool |
|
|
16
|
+
|------|------|
|
|
17
|
+
| Service logic | plain JUnit + `@ExtendWith(MockitoExtension.class)`, no Spring context |
|
|
18
|
+
| Controller mapping, validation, serialization | `@WebMvcTest(X.class)` + `MockMvcTester` + `@MockitoBean` |
|
|
19
|
+
| Repository queries, mappings | `@DataJpaTest` against the real database engine |
|
|
20
|
+
| Whole app over HTTP | `@SpringBootTest(webEnvironment = RANDOM_PORT)` + `@AutoConfigureRestTestClient` |
|
|
21
|
+
| Whole app, no server | `@SpringBootTest` + `@AutoConfigureMockMvc` |
|
|
22
|
+
|
|
23
|
+
Boot 4 split the test support into modules: slice annotations live in `org.springframework.boot.<module>.test.autoconfigure` (e.g. `org.springframework.boot.data.jpa.test.autoconfigure.DataJpaTest`); `@AutoConfigureTestDatabase` is in `org.springframework.boot.jdbc.test.autoconfigure`. Let the IDE import them. Use the matching test starter (`spring-boot-starter-data-jpa-test`, and so on) so each slice is on the classpath.
|
|
24
|
+
|
|
25
|
+
## Mocking beans
|
|
26
|
+
|
|
27
|
+
The Boot-era mock-bean annotations are gone in Boot 4. Use `@MockitoBean` and `@MockitoSpyBean` (from `org.springframework.test.context.bean.override.mockito`).
|
|
28
|
+
|
|
29
|
+
```java
|
|
30
|
+
@WebMvcTest(UserController.class)
|
|
31
|
+
class UserControllerTests {
|
|
32
|
+
@Autowired MockMvcTester mvc;
|
|
33
|
+
@MockitoBean UserService users;
|
|
34
|
+
|
|
35
|
+
@Test
|
|
36
|
+
void unknownUserIs404() {
|
|
37
|
+
given(users.find("x")).willThrow(new UserNotFoundException("x"));
|
|
38
|
+
assertThat(mvc.get().uri("/users/x")).hasStatus(HttpStatus.NOT_FOUND);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
`MockMvcTester` is AssertJ-based (`assertThat(mvc.get().uri(...)).hasStatusOk()`); do not mix it with the `expectStatus()` chain, which belongs to the other clients. Security: `@WithMockUser` still works on slices; `@Import` your security config.
|
|
44
|
+
|
|
45
|
+
## Full-server test
|
|
46
|
+
|
|
47
|
+
```java
|
|
48
|
+
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
|
|
49
|
+
@AutoConfigureRestTestClient
|
|
50
|
+
class UserApiTests {
|
|
51
|
+
@Autowired RestTestClient client;
|
|
52
|
+
|
|
53
|
+
@Test
|
|
54
|
+
void createReturns201() {
|
|
55
|
+
client.post().uri("/users").contentType(MediaType.APPLICATION_JSON)
|
|
56
|
+
.body(new UserRequest("a@example.com"))
|
|
57
|
+
.exchange()
|
|
58
|
+
.expectStatus().isCreated();
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
`RestTestClient` resolves relative URIs against the running server; it also supports AssertJ-style assertions through its response type. Customize through a `RestTestClientBuilderCustomizer` bean.
|
|
64
|
+
|
|
65
|
+
## Real dependencies with Testcontainers
|
|
66
|
+
|
|
67
|
+
Prefer `@ServiceConnection`: Boot derives connection details, no property wiring.
|
|
68
|
+
|
|
69
|
+
```java
|
|
70
|
+
@TestConfiguration(proxyBeanMethods = false)
|
|
71
|
+
class ContainersConfig {
|
|
72
|
+
@Bean @ServiceConnection
|
|
73
|
+
PostgreSQLContainer postgres() { return new PostgreSQLContainer("postgres:16"); }
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
@DataJpaTest
|
|
77
|
+
@Import(ContainersConfig.class)
|
|
78
|
+
class AuthorRepositoryTests { /* ... */ }
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
- Testcontainers 2 containers are non-generic and live in per-module packages (`org.testcontainers.postgresql.PostgreSQLContainer`, artifact `testcontainers-postgresql`).
|
|
82
|
+
- The default `replace = NON_TEST` already keeps a `@ServiceConnection` data source; `replace = NONE` is only needed for a non-test `DataSource` you defined yourself.
|
|
83
|
+
- Where `@ServiceConnection` has no support for the container, use `@Testcontainers` + `@Container static` + `@DynamicPropertySource` to register the properties.
|
|
84
|
+
- Share one container configuration across tests so the context cache is reused.
|
|
85
|
+
|
|
86
|
+
## Rules
|
|
87
|
+
|
|
88
|
+
- Test behaviour through the public seam; do not assert on mock call counts unless the call is the behaviour.
|
|
89
|
+
- Slice tests load only what they need; reaching for `@SpringBootTest` to test one controller is a smell.
|
|
90
|
+
- Never replace the database engine with H2 when production runs another one; dialect differences hide bugs.
|
|
91
|
+
- No `Thread.sleep`: wait on the condition with a bounded timeout.
|
|
92
|
+
|
|
93
|
+
<!-- INCLUDE: skills/_self-improvement.md -->
|
package/src/skills/wayfinder.md
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
> {{DESC_WAYFINDER}}
|
|
4
4
|
|
|
5
|
+
{{CREDIT:mattpocock-skills:skills/engineering/wayfinder/SKILL.md}}
|
|
6
|
+
|
|
5
7
|
**Trigger:** a piece of work too large for one session and still in the fog —
|
|
6
8
|
the destination can be named but the route to it cannot; the user says
|
|
7
9
|
"wayfinder" or asks to chart a big effort before building anything.
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
{
|
|
2
|
+
"daydream": {
|
|
3
|
+
"repo": "glebis/claude-skills",
|
|
4
|
+
"commit": "b8e34966661bd7b6834af6a0548ce3ccd371ee30",
|
|
5
|
+
"author": "Gleb Kalinin",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"licenseFile": "skills/daydream/LICENSE"
|
|
8
|
+
},
|
|
9
|
+
"react-view-transitions": {
|
|
10
|
+
"repo": "vercel-labs/agent-skills",
|
|
11
|
+
"commit": "063bee94c3f4df8453406c830b0a7df0f2860278",
|
|
12
|
+
"author": "Vercel Engineering",
|
|
13
|
+
"license": "MIT",
|
|
14
|
+
"licenseFile": null
|
|
15
|
+
},
|
|
16
|
+
"mattpocock-skills": {
|
|
17
|
+
"repo": "mattpocock/skills",
|
|
18
|
+
"commit": "5beb35b040e3de97e54fa9e386d7e42d15c295c2",
|
|
19
|
+
"author": "Matt Pocock",
|
|
20
|
+
"license": "MIT",
|
|
21
|
+
"licenseFile": "licenses/mattpocock-skills.txt"
|
|
22
|
+
},
|
|
23
|
+
"superpowers": {
|
|
24
|
+
"repo": "obra/superpowers",
|
|
25
|
+
"commit": "bb92a77741419a4ab5f06e711a283343f1ada0c3",
|
|
26
|
+
"author": "Jesse Vincent",
|
|
27
|
+
"license": "MIT",
|
|
28
|
+
"licenseFile": "licenses/superpowers.txt"
|
|
29
|
+
},
|
|
30
|
+
"vibe-wise": {
|
|
31
|
+
"repo": "nykooi1/vibe-wise",
|
|
32
|
+
"commit": "eefb53df406ab89e31444684ff32c1df205221f8",
|
|
33
|
+
"author": "Noah Kim",
|
|
34
|
+
"license": "MIT",
|
|
35
|
+
"licenseFile": "licenses/vibe-wise.txt"
|
|
36
|
+
},
|
|
37
|
+
"mattpocock-skills-frozen": {
|
|
38
|
+
"repo": "mattpocock/skills",
|
|
39
|
+
"commit": "391a2701dd948f94f56a39f7533f8eea9a859c87",
|
|
40
|
+
"author": "Matt Pocock",
|
|
41
|
+
"license": "MIT",
|
|
42
|
+
"licenseFile": "licenses/mattpocock-skills.txt",
|
|
43
|
+
"frozen": true
|
|
44
|
+
},
|
|
45
|
+
"mattpocock-skills-2509": {
|
|
46
|
+
"repo": "mattpocock/skills",
|
|
47
|
+
"commit": "5beb35b040e3de97e54fa9e386d7e42d15c295c2",
|
|
48
|
+
"author": "Matt Pocock",
|
|
49
|
+
"license": "MIT",
|
|
50
|
+
"licenseFile": "licenses/mattpocock-skills.txt"
|
|
51
|
+
},
|
|
52
|
+
"piomin-spring-boot": {
|
|
53
|
+
"repo": "piomin/claude-ai-spring-boot",
|
|
54
|
+
"commit": "cf876a1041ac4692f32422261f6d67d7f12140d5",
|
|
55
|
+
"author": "Piotr Mińkowski",
|
|
56
|
+
"license": "Apache-2.0",
|
|
57
|
+
"licenseFile": "licenses/piomin-spring-boot.txt"
|
|
58
|
+
}
|
|
59
|
+
}
|
package/themes/_TEMPLATE.json
CHANGED
|
@@ -34,6 +34,12 @@
|
|
|
34
34
|
"DESC_EMPIRICIST": "<council seat: holds every claim to evidence, for and against>",
|
|
35
35
|
"DESC_OPERATOR": "<council seat: speaks for running it in production — reliability, on-call>",
|
|
36
36
|
"DESC_HISTORIAN": "<council seat: brings the precedent — what was tried before>",
|
|
37
|
+
"DESC_SPRING_BOOT_ENGINEER": "<one-line description: implements a Spring Boot feature or service end to end in a Java codebase>",
|
|
38
|
+
"DESC_SPRING_REVIEWER": "<one-line description: reviews a Spring Boot change with framework knowledge — layering, transactions, JPA, configuration, test slices>",
|
|
39
|
+
"DESC_SPRING_SECURITY": "<one-line description: security pass over a Spring Security change — filter chain, method security, OAuth2/JWT, CORS/CSRF>",
|
|
40
|
+
"DESC_KUBERNETES_SPECIALIST": "<one-line description: writes or reviews Kubernetes manifests, probes, resources and rollout for a Spring Boot service>",
|
|
41
|
+
"DESC_DOCKER_EXPERT": "<one-line description: writes or reviews the Dockerfile and image build (layered or native) of a Spring Boot service>",
|
|
42
|
+
"DESC_DEVOPS_ENGINEER": "<one-line description: reviews or improves the build and delivery pipeline of a Spring Boot service on the CI already in use>",
|
|
37
43
|
"DESC_PLAN": "<one-line description: write a plan before a non-trivial task; track progress>",
|
|
38
44
|
"DESC_DEPENDENCIES": "<one-line description: audit dependencies — outdated, vulnerable, abandoned, unused — into a risk-ordered plan, then upgrade one change at a time, tests green between>",
|
|
39
45
|
"DESC_GIT_HISTORY": "<one-line description: learn from git history read-only — bisect, blame, pickaxe — or recover/rewrite it safely behind a backup branch>",
|
|
@@ -144,6 +150,9 @@
|
|
|
144
150
|
"DESC_FRONTEND_DESIGN": "<one-line description: design a UI with intent — palette/type/layout chosen for the brief, not templated defaults; plan tokens, critique against the brief, keep one bold move>",
|
|
145
151
|
"DESC_DECK": "<one-line description: build slides or a presentation as one self-contained offline HTML file — short interview, outline approved first, keys, URL hash, one slide per printed page>",
|
|
146
152
|
"DESC_WORKFLOW": "<one-line description: run a saved, code-driven workflow that orchestrates subagents deterministically>",
|
|
153
|
+
"DESC_SPRING_BOOT": "<one-line description: build or change a Spring Boot service — controllers, configuration, REST clients, error handling, observability, packaging>",
|
|
154
|
+
"DESC_SPRING_DATA_JPA": "<one-line description: Spring Data JPA and Hibernate work — entities, repositories, queries, transactions, migrations, N+1 and fetch problems>",
|
|
155
|
+
"DESC_SPRING_TESTING": "<one-line description: write or fix Spring Boot tests — slices, MockMvc, Testcontainers with service connections, mocking beans>",
|
|
147
156
|
"AGENT_COLORS": {
|
|
148
157
|
"architect": "primary",
|
|
149
158
|
"reviewer": "warning",
|
package/themes/biker.json
CHANGED
|
@@ -34,6 +34,12 @@
|
|
|
34
34
|
"DESC_EMPIRICIST": "Wants the proof — holds every claim, for and against, to the odometer, trials, or precedent.",
|
|
35
35
|
"DESC_OPERATOR": "Speaks for the bike on the road — how it holds under load, the watch, and the on-call burden of keeping it running.",
|
|
36
36
|
"DESC_HISTORIAN": "Brings the old miles — what was tried before, how it went, and the lesson for this run.",
|
|
37
|
+
"DESC_SPRING_BOOT_ENGINEER": "Builds a Spring Boot feature or service end to end in a Java codebase, frame to finish.",
|
|
38
|
+
"DESC_SPRING_REVIEWER": "Walks a Spring Boot change over like a bike before a ride — layering, transactions, JPA, configuration, test slices.",
|
|
39
|
+
"DESC_SPRING_SECURITY": "Goes over Spring Security changes bolt by bolt — filter chain, method security, OAuth2/JWT, CORS/CSRF.",
|
|
40
|
+
"DESC_KUBERNETES_SPECIALIST": "Sets up the Kubernetes manifests for a Spring Boot service — probes, resources, rollout — so it holds on the highway.",
|
|
41
|
+
"DESC_DOCKER_EXPERT": "Packs the Docker image of a Spring Boot service lean, layered or native, ready to roll.",
|
|
42
|
+
"DESC_DEVOPS_ENGINEER": "Tunes the build and delivery pipeline of a Spring Boot service, on whatever CI the shop already runs.",
|
|
37
43
|
"DESC_PLAN": "Map the route before a non-trivial run; mark your progress mile by mile.",
|
|
38
44
|
"DESC_DEPENDENCIES": "Inspect every part on the bike — worn, recalled, discontinued, dead weight — into a risk-ordered replacement plan, then fit one part at a time, trials green between each.",
|
|
39
45
|
"DESC_GIT_HISTORY": "Trace the roadbook to find when it broke or why a part was fitted — bisect, blame, the pickaxe, hands off the bike — or recover a wrecked run and rewrite the history safely, reflog and rebase behind a backup.",
|
|
@@ -144,6 +150,9 @@
|
|
|
144
150
|
"DESC_FRONTEND_DESIGN": "Design a UI with real attitude — pick palette, type, and layout for this job, not the stock defaults, then trim it down to one bold move.",
|
|
145
151
|
"DESC_DECK": "Build slides or a presentation as one offline HTML file — a quick interview, the outline signed off first, then a deck that rides on arrow keys and prints clean.",
|
|
146
152
|
"DESC_WORKFLOW": "Run a saved route that sends your riders by script — many rolled out at once, their findings gathered and checked in one clean run.",
|
|
153
|
+
"DESC_SPRING_BOOT": "Build or change a Spring Boot service — controllers, configuration, REST clients, error handling, observability, packaging — and keep it on the road.",
|
|
154
|
+
"DESC_SPRING_DATA_JPA": "Wrench on Spring Data JPA and Hibernate — entities, repositories, queries, transactions, migrations, N+1 and fetch trouble.",
|
|
155
|
+
"DESC_SPRING_TESTING": "Write or fix Spring Boot tests — slices, MockMvc, Testcontainers with service connections, mocked beans — before the ride.",
|
|
147
156
|
"AGENT_COLORS": {
|
|
148
157
|
"architect": "primary",
|
|
149
158
|
"reviewer": "warning",
|
package/themes/commentator.json
CHANGED
|
@@ -34,6 +34,12 @@
|
|
|
34
34
|
"DESC_EMPIRICIST": "Demands the data — holds every claim, for and against, to telemetry, trials, or precedent.",
|
|
35
35
|
"DESC_OPERATOR": "Speaks for the car at racing speed — its reliability under load, its watch, and the on-call burden of running it.",
|
|
36
36
|
"DESC_HISTORIAN": "Brings the form book — what was tried in past races, how it went, and the lesson for this call.",
|
|
37
|
+
"DESC_SPRING_BOOT_ENGINEER": "Builds a Spring Boot feature or service end to end in a Java codebase — lights out and away it goes.",
|
|
38
|
+
"DESC_SPRING_REVIEWER": "Runs the scrutineering on a Spring Boot change with framework know-how — layering, transactions, JPA, configuration, test slices.",
|
|
39
|
+
"DESC_SPRING_SECURITY": "Checks the Spring Security barriers — filter chain, method security, OAuth2/JWT, CORS/CSRF — on any change that touches them.",
|
|
40
|
+
"DESC_KUBERNETES_SPECIALIST": "Sets the pit wall for a Spring Boot service on Kubernetes — manifests, probes, resources, rollout.",
|
|
41
|
+
"DESC_DOCKER_EXPERT": "Preps the Docker image of a Spring Boot service, layered or native, ready for the grid.",
|
|
42
|
+
"DESC_DEVOPS_ENGINEER": "Works the pit lane of build and delivery for a Spring Boot service, on whatever CI the team already runs.",
|
|
37
43
|
"DESC_PLAN": "Plot the strategy before a non-trivial stint; call your progress lap by lap.",
|
|
38
44
|
"DESC_DEPENDENCIES": "Survey every component — outdated, on recall, discontinued, dead weight — into a risk-ordered upgrade plan, then fit one change at a time, trials green between each.",
|
|
39
45
|
"DESC_GIT_HISTORY": "Replay the data to find when the lap fell apart or why a line was driven — bisect, blame, the pickaxe, hands off the car — or recover a crashed session and rewrite the history safely, reflog and rebase behind a backup lap.",
|
|
@@ -144,6 +150,9 @@
|
|
|
144
150
|
"DESC_FRONTEND_DESIGN": "Design a UI with a point of view — palette, type, and layout built for this brief, not the templated defaults, then critique and cut to one bold move.",
|
|
145
151
|
"DESC_DECK": "Build slides or a presentation as one offline HTML file — a short interview, the outline approved first, then a deck that runs on arrow keys and prints one slide a page.",
|
|
146
152
|
"DESC_WORKFLOW": "Run a saved race plan that drives your team by script — many sent out at once, their results gathered and checked in one clean grand prix.",
|
|
153
|
+
"DESC_SPRING_BOOT": "Build or change a Spring Boot service — controllers, configuration, REST clients, error handling, observability, packaging — lap after lap.",
|
|
154
|
+
"DESC_SPRING_DATA_JPA": "Work the Spring Data JPA and Hibernate setup — entities, repositories, queries, transactions, migrations, N+1 and fetch problems.",
|
|
155
|
+
"DESC_SPRING_TESTING": "Write or fix Spring Boot tests — slices, MockMvc, Testcontainers with service connections, mocked beans — before the lights go out.",
|
|
147
156
|
"AGENT_COLORS": {
|
|
148
157
|
"architect": "primary",
|
|
149
158
|
"reviewer": "warning",
|
package/themes/cyberpunk.json
CHANGED
|
@@ -34,6 +34,12 @@
|
|
|
34
34
|
"DESC_EMPIRICIST": "Demands proof — holds every claim, for and against, to data, tests, or precedent.",
|
|
35
35
|
"DESC_OPERATOR": "Speaks for it live on the grid — uptime, telemetry, rollback, and the on-call burn.",
|
|
36
36
|
"DESC_HISTORIAN": "Pulls the old logs — what was run before, how it crashed, and the lesson for this call.",
|
|
37
|
+
"DESC_SPRING_BOOT_ENGINEER": "Jacks into a Java codebase and ships a Spring Boot feature or service end to end.",
|
|
38
|
+
"DESC_SPRING_REVIEWER": "Scans a Spring Boot change with framework-aware eyes — layering, transactions, JPA, configuration, test slices.",
|
|
39
|
+
"DESC_SPRING_SECURITY": "Probes the ICE around Spring Security changes — filter chain, method security, OAuth2/JWT, CORS/CSRF.",
|
|
40
|
+
"DESC_KUBERNETES_SPECIALIST": "Deploys and audits the Kubernetes manifests of a Spring Boot service — probes, resources, rollout — across the grid.",
|
|
41
|
+
"DESC_DOCKER_EXPERT": "Packs the Docker image of a Spring Boot service, layered or native, lean for the net.",
|
|
42
|
+
"DESC_DEVOPS_ENGINEER": "Tunes the build and delivery pipeline of a Spring Boot service, on whatever CI the crew already runs.",
|
|
37
43
|
"DESC_PLAN": "Map the run before a non-trivial job; track progress as it executes.",
|
|
38
44
|
"DESC_DEPENDENCIES": "Scan every dependency on the rig — outdated, exploitable, abandoned, dead weight — into a risk-ordered plan, then jack in each upgrade one swap at a time, tests green between.",
|
|
39
45
|
"DESC_GIT_HISTORY": "Trace the history read-only — bisect, blame, pickaxe — or recover a corrupted repo and rewrite it clean — reflog, undo, rebase behind a backup branch.",
|
|
@@ -144,6 +150,9 @@
|
|
|
144
150
|
"DESC_FRONTEND_DESIGN": "Design a UI with edge — palette, type, and layout forged for this brief, not the stock defaults; plan, critique, and keep one bold move.",
|
|
145
151
|
"DESC_DECK": "Build slides or a presentation as one self-contained offline HTML file — short interview, outline cleared first, keyboard-driven, no CDN, prints one slide per page.",
|
|
146
152
|
"DESC_WORKFLOW": "Jack in a saved routine that drives your daemons on rails — parallel forks, staged pipelines, and verification, all in one deterministic run.",
|
|
153
|
+
"DESC_SPRING_BOOT": "Build or change a Spring Boot service — controllers, configuration, REST clients, error handling, observability, packaging — and push it live.",
|
|
154
|
+
"DESC_SPRING_DATA_JPA": "Run Spring Data JPA and Hibernate jobs — entities, repositories, queries, transactions, migrations, N+1 and fetch glitches.",
|
|
155
|
+
"DESC_SPRING_TESTING": "Write or fix Spring Boot tests — slices, MockMvc, Testcontainers with service connections, mocked beans — before the run.",
|
|
147
156
|
"AGENT_COLORS": {
|
|
148
157
|
"architect": "primary",
|
|
149
158
|
"reviewer": "warning",
|
package/themes/gamer.json
CHANGED
|
@@ -34,6 +34,12 @@
|
|
|
34
34
|
"DESC_EMPIRICIST": "Demands the receipts — holds every claim, for and against, to stats, tests, or precedent.",
|
|
35
35
|
"DESC_OPERATOR": "Speaks for it live on the server — uptime, lag, rollback, and the on-call grind.",
|
|
36
36
|
"DESC_HISTORIAN": "Reads the old runs — what was tried before, how it wiped, and the lesson for this call.",
|
|
37
|
+
"DESC_SPRING_BOOT_ENGINEER": "Builds a Spring Boot feature or service end to end in a Java codebase, full clear.",
|
|
38
|
+
"DESC_SPRING_REVIEWER": "Runs a framework-aware review of a Spring Boot change — layering, transactions, JPA, configuration, test slices.",
|
|
39
|
+
"DESC_SPRING_SECURITY": "Runs the anti-cheat pass on Spring Security changes — filter chain, method security, OAuth2/JWT, CORS/CSRF.",
|
|
40
|
+
"DESC_KUBERNETES_SPECIALIST": "Sets up the Kubernetes manifests for a Spring Boot service — probes, resources, rollout — so the raid does not wipe.",
|
|
41
|
+
"DESC_DOCKER_EXPERT": "Builds the Docker image of a Spring Boot service lean, layered or native, ready to spawn.",
|
|
42
|
+
"DESC_DEVOPS_ENGINEER": "Tunes the build and delivery pipeline of a Spring Boot service, on whatever CI the party already uses.",
|
|
37
43
|
"DESC_PLAN": "Plot the route before a non-trivial run; track progress at each checkpoint.",
|
|
38
44
|
"DESC_DEPENDENCIES": "Audit the loadout — outdated, exploitable, abandoned, dead weight — into a risk-ordered upgrade plan, then patch one change at a time, tests green between.",
|
|
39
45
|
"DESC_GIT_HISTORY": "Replay the history read-only — bisect, blame, pickaxe — or recover a corrupted save and rewrite it clean — reflog, undo, rebase behind a backup branch.",
|
|
@@ -144,6 +150,9 @@
|
|
|
144
150
|
"DESC_FRONTEND_DESIGN": "Design a UI with a real identity — palette, type, and layout picked for this brief, not the default skin, then cut it down to one bold move.",
|
|
145
151
|
"DESC_DECK": "Build slides or a presentation as one offline HTML file — a quick setup interview, outline locked first, then a deck that plays on arrow keys and prints one slide a page.",
|
|
146
152
|
"DESC_WORKFLOW": "Run a saved combo that scripts your party — fan out, chain the stages, and verify the clear, all in one deterministic rotation.",
|
|
153
|
+
"DESC_SPRING_BOOT": "Build or change a Spring Boot service — controllers, configuration, REST clients, error handling, observability, packaging — level by level.",
|
|
154
|
+
"DESC_SPRING_DATA_JPA": "Handle Spring Data JPA and Hibernate — entities, repositories, queries, transactions, migrations, N+1 and fetch bugs.",
|
|
155
|
+
"DESC_SPRING_TESTING": "Write or fix Spring Boot tests — slices, MockMvc, Testcontainers with service connections, mocked beans — before the boss fight.",
|
|
147
156
|
"AGENT_COLORS": {
|
|
148
157
|
"architect": "primary",
|
|
149
158
|
"reviewer": "warning",
|
package/themes/imperial.json
CHANGED
|
@@ -34,6 +34,12 @@
|
|
|
34
34
|
"DESC_EMPIRICIST": "Demands proof — holds every claim, for and against, to evidence, trial, or precedent.",
|
|
35
35
|
"DESC_OPERATOR": "Speaks for the work in the field — its endurance under fire, its watch, and the cost borne by those who keep it.",
|
|
36
36
|
"DESC_HISTORIAN": "Bears the chronicle — what was attempted before, how it fared, and the lesson for this decree.",
|
|
37
|
+
"DESC_SPRING_BOOT_ENGINEER": "Forges a Spring Boot feature or service end to end within a Java codex, from first rite to last.",
|
|
38
|
+
"DESC_SPRING_REVIEWER": "Sits in judgement of a Spring Boot change with knowledge of the framework — layering, transactions, JPA, configuration, test slices.",
|
|
39
|
+
"DESC_SPRING_SECURITY": "Wards the Spring Security gates — filter chain, method security, OAuth2/JWT, CORS/CSRF — and pronounces on any change that touches them.",
|
|
40
|
+
"DESC_KUBERNETES_SPECIALIST": "Inscribes and inspects the Kubernetes manifests of a Spring Boot service — probes, resources, rollout — so the cluster holds the line.",
|
|
41
|
+
"DESC_DOCKER_EXPERT": "Forges and inspects the Docker image of a Spring Boot service, layered or native, sealed for deployment.",
|
|
42
|
+
"DESC_DEVOPS_ENGINEER": "Tends the build and delivery pipeline of a Spring Boot service, upon whatever CI the project already keeps.",
|
|
37
43
|
"DESC_PLAN": "Set down the campaign-plan before the non-trivial task; mark your progress as the battle turns.",
|
|
38
44
|
"DESC_DEPENDENCIES": "Survey every dependency of the machine — outdated, corrupted, abandoned, dead weight — into a risk-ordered plan, then ascend one change at a time, the trials green between.",
|
|
39
45
|
"DESC_GIT_HISTORY": "Interrogate the chronicle, touching nothing — bisect, blame, and pickaxe — or reclaim a ruined archive and rewrite it without ruin — by reflog and undo, every rite warded by a backup.",
|
|
@@ -144,6 +150,9 @@
|
|
|
144
150
|
"DESC_FRONTEND_DESIGN": "Design an interface with intent — palette, type, and layout forged for this brief, not the common defaults; plan, scrutinise, and keep one bold stroke.",
|
|
145
151
|
"DESC_DECK": "Forge slides or a presentation as one self-contained offline HTML scroll — a brief interrogation, the outline sanctioned first, arrow-key navigation, one slide per printed page.",
|
|
146
152
|
"DESC_WORKFLOW": "Unleash a sealed battle-rite that marshals your Adepts by iron script — many loosed at once, their findings martialled and proven in one disciplined campaign.",
|
|
153
|
+
"DESC_SPRING_BOOT": "Raise or reshape a Spring Boot service — controllers, configuration, REST clients, error handling, observability, packaging — by the rites of Boot 4.",
|
|
154
|
+
"DESC_SPRING_DATA_JPA": "Conduct Spring Data JPA and Hibernate rites — entities, repositories, queries, transactions, migrations, the N+1 heresy and fetch ills.",
|
|
155
|
+
"DESC_SPRING_TESTING": "Forge and mend Spring Boot trials — slices, MockMvc, Testcontainers with service connections, mocked beans.",
|
|
147
156
|
"AGENT_COLORS": {
|
|
148
157
|
"architect": "primary",
|
|
149
158
|
"reviewer": "warning",
|