[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M70G8PCX5Q52DRABVA3MCEST":3,"skill-same:01M70G8PCX5Q52DRABVA3MCEST":68},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":39,"linkOnly":40,"markdownContent":41,"markdownBody":42,"frontMatter":43,"refName":46,"commitSha":47,"skillDirectory":48,"forksCount":49,"repositoryHtmlUrl":50,"repositoryHomepageUrl":6,"ownerHtmlUrl":51,"ownerBlogUrl":6,"ownerDescription":52,"updatedAt":53,"install":54,"resources":67},"01M70G8PCX5Q52DRABVA3MCEST","java-coding-standards",null,"Java coding standards for Spring Boot and Quarkus services: naming, immutability, Optional usage, streams, exceptions, generics, CDI, reactive patterns, and project layout. Automatically applies framework-specific conventions. Use when writing or reviewing Java in a Spring Boot or Quarkus service.","mdnaimul22\u002Fhuman-skills","mdnaimul22","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F64520358?v=4","01M70FH95MH2H796Q01TYSFZ03","Naimul","01M70FH96798CQR4YHA13F17GA",3,"MIT","https:\u002F\u002Fgithub.com\u002Fmdnaimul22\u002Fhuman-skills\u002Fblob\u002Fmain\u002Fskills\u002Fstorage\u002Faffaan-m_ECC\u002Fjava-coding-standards\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"coding standards","java","java coding standards","coding","standards","when","writing","reactive","framework-specific","for","usage","streams","layout","project","patterns","use","spring","spring boot","framework","boot","2026-11-10 10:12:30",false,"---\nname: java-coding-standards\ndescription: \"Java coding standards for Spring Boot and Quarkus services: naming, immutability, Optional usage, streams, exceptions, generics, CDI, reactive patterns, and project layout. Automatically applies framework-specific conventions. Use when writing or reviewing Java in a Spring Boot or Quarkus service.\"\nmetadata:\n  origin: ECC\n---\n\n# Java Coding Standards\n\nStandards for readable, maintainable Java (17+) code in Spring Boot and Quarkus services.\n\n## When to Use\n\n- Writing or reviewing Java code in Spring Boot or Quarkus projects\n- Enforcing naming, immutability, or exception handling conventions\n- Working with records, sealed classes, or pattern matching (Java 17+)\n- Reviewing use of Optional, streams, or generics\n- Structuring packages and project layout\n- **[QUARKUS]**: Working with CDI scopes, Panache entities, or reactive pipelines\n\n## How It Works\n\n### Framework Detection\n\nBefore applying standards, determine the framework from the build file:\n\n- Build file contains `quarkus` → apply **[QUARKUS]** conventions\n- Build file contains `spring-boot` → apply **[SPRING]** conventions\n- Neither detected → apply shared conventions only\n\n## Core Principles\n\n- Prefer clarity over cleverness\n- Immutable by default; minimize shared mutable state\n- Fail fast with meaningful exceptions\n- Consistent naming and package structure\n- **[QUARKUS]**: Favor build-time over runtime processing; avoid runtime reflection where possible\n\n## Examples\n\nThe sections below show concrete Spring Boot, Quarkus, and shared Java examples\nfor naming, immutability, dependency injection, reactive code, exceptions,\nproject layout, logging, configuration, and tests.\n\n## Naming\n\n```java\n\u002F\u002F PASS: Classes\u002FRecords: PascalCase\npublic class MarketService {}\npublic record Money(BigDecimal amount, Currency currency) {}\n\n\u002F\u002F PASS: Methods\u002Ffields: camelCase\nprivate final MarketRepository marketRepository;\npublic Market findBySlug(String slug) {}\n\n\u002F\u002F PASS: Constants: UPPER_SNAKE_CASE\nprivate static final int MAX_PAGE_SIZE = 100;\n\n\u002F\u002F PASS: [QUARKUS] JAX-RS resources named as *Resource, not *Controller\npublic class MarketResource {}\n\n\u002F\u002F PASS: [SPRING] REST controllers named as *Controller\npublic class MarketController {}\n```\n\n## Immutability\n\n```java\n\u002F\u002F PASS: Favor records and final fields\npublic record MarketDto(Long id, String name, MarketStatus status) {}\n\npublic class Market {\n  private final Long id;\n  private final String name;\n  \u002F\u002F getters only, no setters\n}\n\n\u002F\u002F PASS: [QUARKUS] Panache active-record entities use public fields (Quarkus convention)\n@Entity\npublic class Market extends PanacheEntity {\n  public String name;\n  public MarketStatus status;\n  \u002F\u002F Panache generates accessors at build time; public fields are idiomatic here\n}\n\n\u002F\u002F PASS: [QUARKUS] Panache MongoDB entities\n@MongoEntity(collection = \"markets\")\npublic class Market extends PanacheMongoEntity {\n  public String name;\n  public MarketStatus status;\n}\n```\n\n## Optional Usage\n\n```java\n\u002F\u002F PASS: Return Optional from find* methods\n\u002F\u002F [SPRING]\nOptional\u003CMarket> market = marketRepository.findBySlug(slug);\n\n\u002F\u002F [QUARKUS] Panache\nOptional\u003CMarket> market = Market.find(\"slug\", slug).firstResultOptional();\n\n\u002F\u002F PASS: Map\u002FflatMap instead of get()\nreturn market\n    .map(MarketResponse::from)\n    .orElseThrow(() -> new EntityNotFoundException(\"Market not found\"));\n```\n\n## Streams Best Practices\n\n```java\n\u002F\u002F PASS: Use streams for transformations, keep pipelines short\nList\u003CString> names = markets.stream()\n    .map(Market::name)\n    .filter(Objects::nonNull)\n    .toList();\n\n\u002F\u002F FAIL: Avoid complex nested streams; prefer loops for clarity\n```\n\n## Dependency Injection\n\n```java\n\u002F\u002F PASS: [SPRING] Constructor injection (preferred over @Autowired on fields)\n@Service\npublic class MarketService {\n  private final MarketRepository marketRepository;\n\n  public MarketService(MarketRepository marketRepository) {\n    this.marketRepository = marketRepository;\n  }\n}\n\n\u002F\u002F PASS: [QUARKUS] Constructor injection\n@ApplicationScoped\npublic class MarketService {\n  private final MarketRepository marketRepository;\n\n  @Inject\n  public MarketService(MarketRepository marketRepository) {\n    this.marketRepository = marketRepository;\n  }\n}\n\n\u002F\u002F PASS: [QUARKUS] Package-private field injection (acceptable in Quarkus — avoids proxy issues)\n@ApplicationScoped\npublic class MarketService {\n  @Inject\n  MarketRepository marketRepository;\n}\n\n\u002F\u002F FAIL: [SPRING] Field injection with @Autowired\n@Autowired\nprivate MarketRepository marketRepository; \u002F\u002F use constructor injection\n\n\u002F\u002F FAIL: [QUARKUS] @Singleton when interception or lazy init is needed\n@Singleton \u002F\u002F non-proxyable — use @ApplicationScoped instead\npublic class MarketService {}\n```\n\n## Reactive Patterns [QUARKUS]\n\n```java\n\u002F\u002F PASS: Return Uni\u002FMulti from reactive endpoints\n@GET\n@Path(\"\u002F{slug}\")\npublic Uni\u003CMarket> findBySlug(@PathParam(\"slug\") String slug) {\n  return Market.find(\"slug\", slug)\n      .\u003CMarket>firstResult()\n      .onItem().ifNull().failWith(() -> new MarketNotFoundException(slug));\n}\n\n\u002F\u002F PASS: Non-blocking pipeline composition\npublic Uni\u003COrderConfirmation> placeOrder(OrderRequest req) {\n  return validateOrder(req)\n      .chain(valid -> persistOrder(valid))\n      .chain(order -> notifyFulfillment(order));\n}\n\n\u002F\u002F FAIL: Blocking call inside a Uni\u002FMulti pipeline\npublic Uni\u003CMarket> find(String slug) {\n  Market m = Market.find(\"slug\", slug).firstResult(); \u002F\u002F BLOCKING — breaks event loop\n  return Uni.createFrom().item(m);\n}\n\n\u002F\u002F FAIL: Subscribing more than once to a shared Uni\nUni\u003CMarket> shared = fetchMarket(slug);\nshared.subscribe().with(m -> log(m));\nshared.subscribe().with(m -> cache(m)); \u002F\u002F double subscribe — use Uni.memoize()\n```\n\n## Exceptions\n\n- Use unchecked exceptions for domain errors; wrap technical exceptions with context\n- Create domain-specific exceptions (e.g., `MarketNotFoundException`)\n- Avoid broad `catch (Exception ex)` unless rethrowing\u002Flogging centrally\n\n```java\nthrow new MarketNotFoundException(slug);\n```\n\n### Centralised Exception Handling\n\n```java\n\u002F\u002F [SPRING]\n@RestControllerAdvice\npublic class GlobalExceptionHandler {\n  @ExceptionHandler(MarketNotFoundException.class)\n  public ResponseEntity\u003CErrorResponse> handle(MarketNotFoundException ex) {\n    return ResponseEntity.status(404).body(ErrorResponse.from(ex));\n  }\n}\n\n\u002F\u002F [QUARKUS] Option A: ExceptionMapper\n@Provider\npublic class MarketNotFoundMapper implements ExceptionMapper\u003CMarketNotFoundException> {\n  @Override\n  public Response toResponse(MarketNotFoundException ex) {\n    return Response.status(404).entity(ErrorResponse.from(ex)).build();\n  }\n}\n\n\u002F\u002F [QUARKUS] Option B: @ServerExceptionMapper (RESTEasy Reactive)\n@ServerExceptionMapper\npublic RestResponse\u003CErrorResponse> handle(MarketNotFoundException ex) {\n  return RestResponse.status(Status.NOT_FOUND, ErrorResponse.from(ex));\n}\n```\n\n## Generics and Type Safety\n\n- Avoid raw types; declare generic parameters\n- Prefer bounded generics for reusable utilities\n\n```java\npublic \u003CT extends Identifiable> Map\u003CLong, T> indexById(Collection\u003CT> items) { ... }\n```\n\n## Project Structure\n\n### [SPRING] Maven\u002FGradle\n\n```\nsrc\u002Fmain\u002Fjava\u002Fcom\u002Fexample\u002Fapp\u002F\n  config\u002F\n  controller\u002F\n  service\u002F\n  repository\u002F\n  domain\u002F\n  dto\u002F\n  util\u002F\nsrc\u002Fmain\u002Fresources\u002F\n  application.yml\nsrc\u002Ftest\u002Fjava\u002F... (mirrors main)\n```\n\n### [QUARKUS] Maven\u002FGradle\n\n```\nsrc\u002Fmain\u002Fjava\u002Fcom\u002Fexample\u002Fapp\u002F\n  config\u002F              # @ConfigMapping, @ConfigProperty beans, Producers\n  resource\u002F            # JAX-RS resources (not \"controller\")\n  service\u002F\n  repository\u002F          # PanacheRepository implementations (if not using active record)\n  domain\u002F              # JPA\u002FPanache entities, MongoDB entities\n  dto\u002F\n  util\u002F\n  mapper\u002F              # MapStruct mappers (if used)\nsrc\u002Fmain\u002Fresources\u002F\n  application.properties   # Quarkus convention (YAML supported with quarkus-config-yaml)\n  import.sql               # Hibernate auto-import for dev\u002Ftest\nsrc\u002Ftest\u002Fjava\u002F... (mirrors main)\n```\n\n## Formatting and Style\n\n- Use 2 or 4 spaces consistently (project standard)\n- One public top-level type per file\n- Keep methods short and focused; extract helpers\n- Order members: constants, fields, constructors, public methods, protected, private\n\n## Code Smells to Avoid\n\n- Long parameter lists → use DTO\u002Fbuilders\n- Deep nesting → early returns\n- Magic numbers → named constants\n- Static mutable state → prefer dependency injection\n- Silent catch blocks → log and act or rethrow\n- **[QUARKUS]**: `@Singleton` where `@ApplicationScoped` is intended — breaks proxying and interception\n- **[QUARKUS]**: Mixing `quarkus-resteasy-reactive` and `quarkus-resteasy` (classic) — pick one stack\n- **[QUARKUS]**: Panache active-record + repository pattern in the same bounded context — pick one\n\n## Logging\n\n```java\n\u002F\u002F [SPRING] SLF4J\nprivate static final Logger log = LoggerFactory.getLogger(MarketService.class);\nlog.info(\"fetch_market slug={}\", slug);\nlog.error(\"failed_fetch_market slug={}\", slug, ex);\n\n\u002F\u002F [QUARKUS] JBoss Logging (default, zero-cost at build time)\nprivate static final Logger log = Logger.getLogger(MarketService.class);\nlog.infof(\"fetch_market slug=%s\", slug);\nlog.errorf(ex, \"failed_fetch_market slug=%s\", slug);\n\n\u002F\u002F [QUARKUS] Alternative: simplified logging with @Inject\n@Inject\nLogger log; \u002F\u002F CDI-injected, scoped to declaring class\n```\n\n## Null Handling\n\n- Accept `@Nullable` only when unavoidable; otherwise use `@NonNull`\n- Use Bean Validation (`@NotNull`, `@NotBlank`) on inputs\n- **[QUARKUS]**: Apply `@Valid` on `@BeanParam`, `@RestForm`, and request body parameters\n\n## Configuration\n\n```java\n\u002F\u002F [SPRING] @ConfigurationProperties\n@ConfigurationProperties(prefix = \"market\")\npublic record MarketProperties(int maxPageSize, Duration cacheTtl) {}\n\n\u002F\u002F [QUARKUS] @ConfigMapping (type-safe, build-time validated)\n@ConfigMapping(prefix = \"market\")\npublic interface MarketConfig {\n  int maxPageSize();\n  Duration cacheTtl();\n}\n\n\u002F\u002F [QUARKUS] Simple values with @ConfigProperty\n@ConfigProperty(name = \"market.max-page-size\", defaultValue = \"100\")\nint maxPageSize;\n```\n\n## Testing Expectations\n\n### Shared\n- JUnit 5 + AssertJ for fluent assertions\n- Mockito for mocking; avoid partial mocks where possible\n- Favor deterministic tests; no hidden sleeps\n\n### [SPRING]\n- `@WebMvcTest` for controller slices, `@DataJpaTest` for repository slices\n- `@SpringBootTest` reserved for full integration tests\n- `@MockBean` for replacing beans in Spring context\n\n### [QUARKUS]\n- Plain JUnit 5 + Mockito for unit tests (no `@QuarkusTest`)\n- `@QuarkusTest` reserved for CDI integration tests\n- `@InjectMock` for replacing CDI beans in integration tests\n- Dev Services for database\u002FKafka\u002FRedis — avoid manual Testcontainers setup when Dev Services suffice\n- `@QuarkusTestResource` for custom external service lifecycle\n\n```java\n\u002F\u002F [SPRING] Controller test\n@WebMvcTest(MarketController.class)\nclass MarketControllerTest {\n  @Autowired MockMvc mockMvc;\n  @MockBean MarketService marketService;\n}\n\n\u002F\u002F [QUARKUS] Integration test\n@QuarkusTest\nclass MarketResourceTest {\n  @InjectMock\n  MarketService marketService;\n\n  @Test\n  void should_return_404_when_market_not_found() {\n    given().when().get(\"\u002Fmarkets\u002Funknown\").then().statusCode(404);\n  }\n}\n\n\u002F\u002F [QUARKUS] Unit test (no CDI, no @QuarkusTest)\n@ExtendWith(MockitoExtension.class)\nclass MarketServiceTest {\n  @Mock MarketRepository marketRepository;\n  @InjectMocks MarketService marketService;\n}\n```\n\n**Remember**: Keep code intentional, typed, and observable. Optimize for maintainability over micro-optimizations unless proven necessary.\n","# Java Coding Standards\n\nStandards for readable, maintainable Java (17+) code in Spring Boot and Quarkus services.\n\n## When to Use\n\n- Writing or reviewing Java code in Spring Boot or Quarkus projects\n- Enforcing naming, immutability, or exception handling conventions\n- Working with records, sealed classes, or pattern matching (Java 17+)\n- Reviewing use of Optional, streams, or generics\n- Structuring packages and project layout\n- **[QUARKUS]**: Working with CDI scopes, Panache entities, or reactive pipelines\n\n## How It Works\n\n### Framework Detection\n\nBefore applying standards, determine the framework from the build file:\n\n- Build file contains `quarkus` → apply **[QUARKUS]** conventions\n- Build file contains `spring-boot` → apply **[SPRING]** conventions\n- Neither detected → apply shared conventions only\n\n## Core Principles\n\n- Prefer clarity over cleverness\n- Immutable by default; minimize shared mutable state\n- Fail fast with meaningful exceptions\n- Consistent naming and package structure\n- **[QUARKUS]**: Favor build-time over runtime processing; avoid runtime reflection where possible\n\n## Examples\n\nThe sections below show concrete Spring Boot, Quarkus, and shared Java examples\nfor naming, immutability, dependency injection, reactive code, exceptions,\nproject layout, logging, configuration, and tests.\n\n## Naming\n\n```java\n\u002F\u002F PASS: Classes\u002FRecords: PascalCase\npublic class MarketService {}\npublic record Money(BigDecimal amount, Currency currency) {}\n\n\u002F\u002F PASS: Methods\u002Ffields: camelCase\nprivate final MarketRepository marketRepository;\npublic Market findBySlug(String slug) {}\n\n\u002F\u002F PASS: Constants: UPPER_SNAKE_CASE\nprivate static final int MAX_PAGE_SIZE = 100;\n\n\u002F\u002F PASS: [QUARKUS] JAX-RS resources named as *Resource, not *Controller\npublic class MarketResource {}\n\n\u002F\u002F PASS: [SPRING] REST controllers named as *Controller\npublic class MarketController {}\n```\n\n## Immutability\n\n```java\n\u002F\u002F PASS: Favor records and final fields\npublic record MarketDto(Long id, String name, MarketStatus status) {}\n\npublic class Market {\n  private final Long id;\n  private final String name;\n  \u002F\u002F getters only, no setters\n}\n\n\u002F\u002F PASS: [QUARKUS] Panache active-record entities use public fields (Quarkus convention)\n@Entity\npublic class Market extends PanacheEntity {\n  public String name;\n  public MarketStatus status;\n  \u002F\u002F Panache generates accessors at build time; public fields are idiomatic here\n}\n\n\u002F\u002F PASS: [QUARKUS] Panache MongoDB entities\n@MongoEntity(collection = \"markets\")\npublic class Market extends PanacheMongoEntity {\n  public String name;\n  public MarketStatus status;\n}\n```\n\n## Optional Usage\n\n```java\n\u002F\u002F PASS: Return Optional from find* methods\n\u002F\u002F [SPRING]\nOptional\u003CMarket> market = marketRepository.findBySlug(slug);\n\n\u002F\u002F [QUARKUS] Panache\nOptional\u003CMarket> market = Market.find(\"slug\", slug).firstResultOptional();\n\n\u002F\u002F PASS: Map\u002FflatMap instead of get()\nreturn market\n    .map(MarketResponse::from)\n    .orElseThrow(() -> new EntityNotFoundException(\"Market not found\"));\n```\n\n## Streams Best Practices\n\n```java\n\u002F\u002F PASS: Use streams for transformations, keep pipelines short\nList\u003CString> names = markets.stream()\n    .map(Market::name)\n    .filter(Objects::nonNull)\n    .toList();\n\n\u002F\u002F FAIL: Avoid complex nested streams; prefer loops for clarity\n```\n\n## Dependency Injection\n\n```java\n\u002F\u002F PASS: [SPRING] Constructor injection (preferred over @Autowired on fields)\n@Service\npublic class MarketService {\n  private final MarketRepository marketRepository;\n\n  public MarketService(MarketRepository marketRepository) {\n    this.marketRepository = marketRepository;\n  }\n}\n\n\u002F\u002F PASS: [QUARKUS] Constructor injection\n@ApplicationScoped\npublic class MarketService {\n  private final MarketRepository marketRepository;\n\n  @Inject\n  public MarketService(MarketRepository marketRepository) {\n    this.marketRepository = marketRepository;\n  }\n}\n\n\u002F\u002F PASS: [QUARKUS] Package-private field injection (acceptable in Quarkus — avoids proxy issues)\n@ApplicationScoped\npublic class MarketService {\n  @Inject\n  MarketRepository marketRepository;\n}\n\n\u002F\u002F FAIL: [SPRING] Field injection with @Autowired\n@Autowired\nprivate MarketRepository marketRepository; \u002F\u002F use constructor injection\n\n\u002F\u002F FAIL: [QUARKUS] @Singleton when interception or lazy init is needed\n@Singleton \u002F\u002F non-proxyable — use @ApplicationScoped instead\npublic class MarketService {}\n```\n\n## Reactive Patterns [QUARKUS]\n\n```java\n\u002F\u002F PASS: Return Uni\u002FMulti from reactive endpoints\n@GET\n@Path(\"\u002F{slug}\")\npublic Uni\u003CMarket> findBySlug(@PathParam(\"slug\") String slug) {\n  return Market.find(\"slug\", slug)\n      .\u003CMarket>firstResult()\n      .onItem().ifNull().failWith(() -> new MarketNotFoundException(slug));\n}\n\n\u002F\u002F PASS: Non-blocking pipeline composition\npublic Uni\u003COrderConfirmation> placeOrder(OrderRequest req) {\n  return validateOrder(req)\n      .chain(valid -> persistOrder(valid))\n      .chain(order -> notifyFulfillment(order));\n}\n\n\u002F\u002F FAIL: Blocking call inside a Uni\u002FMulti pipeline\npublic Uni\u003CMarket> find(String slug) {\n  Market m = Market.find(\"slug\", slug).firstResult(); \u002F\u002F BLOCKING — breaks event loop\n  return Uni.createFrom().item(m);\n}\n\n\u002F\u002F FAIL: Subscribing more than once to a shared Uni\nUni\u003CMarket> shared = fetchMarket(slug);\nshared.subscribe().with(m -> log(m));\nshared.subscribe().with(m -> cache(m)); \u002F\u002F double subscribe — use Uni.memoize()\n```\n\n## Exceptions\n\n- Use unchecked exceptions for domain errors; wrap technical exceptions with context\n- Create domain-specific exceptions (e.g., `MarketNotFoundException`)\n- Avoid broad `catch (Exception ex)` unless rethrowing\u002Flogging centrally\n\n```java\nthrow new MarketNotFoundException(slug);\n```\n\n### Centralised Exception Handling\n\n```java\n\u002F\u002F [SPRING]\n@RestControllerAdvice\npublic class GlobalExceptionHandler {\n  @ExceptionHandler(MarketNotFoundException.class)\n  public ResponseEntity\u003CErrorResponse> handle(MarketNotFoundException ex) {\n    return ResponseEntity.status(404).body(ErrorResponse.from(ex));\n  }\n}\n\n\u002F\u002F [QUARKUS] Option A: ExceptionMapper\n@Provider\npublic class MarketNotFoundMapper implements ExceptionMapper\u003CMarketNotFoundException> {\n  @Override\n  public Response toResponse(MarketNotFoundException ex) {\n    return Response.status(404).entity(ErrorResponse.from(ex)).build();\n  }\n}\n\n\u002F\u002F [QUARKUS] Option B: @ServerExceptionMapper (RESTEasy Reactive)\n@ServerExceptionMapper\npublic RestResponse\u003CErrorResponse> handle(MarketNotFoundException ex) {\n  return RestResponse.status(Status.NOT_FOUND, ErrorResponse.from(ex));\n}\n```\n\n## Generics and Type Safety\n\n- Avoid raw types; declare generic parameters\n- Prefer bounded generics for reusable utilities\n\n```java\npublic \u003CT extends Identifiable> Map\u003CLong, T> indexById(Collection\u003CT> items) { ... }\n```\n\n## Project Structure\n\n### [SPRING] Maven\u002FGradle\n\n```\nsrc\u002Fmain\u002Fjava\u002Fcom\u002Fexample\u002Fapp\u002F\n  config\u002F\n  controller\u002F\n  service\u002F\n  repository\u002F\n  domain\u002F\n  dto\u002F\n  util\u002F\nsrc\u002Fmain\u002Fresources\u002F\n  application.yml\nsrc\u002Ftest\u002Fjava\u002F... (mirrors main)\n```\n\n### [QUARKUS] Maven\u002FGradle\n\n```\nsrc\u002Fmain\u002Fjava\u002Fcom\u002Fexample\u002Fapp\u002F\n  config\u002F              # @ConfigMapping, @ConfigProperty beans, Producers\n  resource\u002F            # JAX-RS resources (not \"controller\")\n  service\u002F\n  repository\u002F          # PanacheRepository implementations (if not using active record)\n  domain\u002F              # JPA\u002FPanache entities, MongoDB entities\n  dto\u002F\n  util\u002F\n  mapper\u002F              # MapStruct mappers (if used)\nsrc\u002Fmain\u002Fresources\u002F\n  application.properties   # Quarkus convention (YAML supported with quarkus-config-yaml)\n  import.sql               # Hibernate auto-import for dev\u002Ftest\nsrc\u002Ftest\u002Fjava\u002F... (mirrors main)\n```\n\n## Formatting and Style\n\n- Use 2 or 4 spaces consistently (project standard)\n- One public top-level type per file\n- Keep methods short and focused; extract helpers\n- Order members: constants, fields, constructors, public methods, protected, private\n\n## Code Smells to Avoid\n\n- Long parameter lists → use DTO\u002Fbuilders\n- Deep nesting → early returns\n- Magic numbers → named constants\n- Static mutable state → prefer dependency injection\n- Silent catch blocks → log and act or rethrow\n- **[QUARKUS]**: `@Singleton` where `@ApplicationScoped` is intended — breaks proxying and interception\n- **[QUARKUS]**: Mixing `quarkus-resteasy-reactive` and `quarkus-resteasy` (classic) — pick one stack\n- **[QUARKUS]**: Panache active-record + repository pattern in the same bounded context — pick one\n\n## Logging\n\n```java\n\u002F\u002F [SPRING] SLF4J\nprivate static final Logger log = LoggerFactory.getLogger(MarketService.class);\nlog.info(\"fetch_market slug={}\", slug);\nlog.error(\"failed_fetch_market slug={}\", slug, ex);\n\n\u002F\u002F [QUARKUS] JBoss Logging (default, zero-cost at build time)\nprivate static final Logger log = Logger.getLogger(MarketService.class);\nlog.infof(\"fetch_market slug=%s\", slug);\nlog.errorf(ex, \"failed_fetch_market slug=%s\", slug);\n\n\u002F\u002F [QUARKUS] Alternative: simplified logging with @Inject\n@Inject\nLogger log; \u002F\u002F CDI-injected, scoped to declaring class\n```\n\n## Null Handling\n\n- Accept `@Nullable` only when unavoidable; otherwise use `@NonNull`\n- Use Bean Validation (`@NotNull`, `@NotBlank`) on inputs\n- **[QUARKUS]**: Apply `@Valid` on `@BeanParam`, `@RestForm`, and request body parameters\n\n## Configuration\n\n```java\n\u002F\u002F [SPRING] @ConfigurationProperties\n@ConfigurationProperties(prefix = \"market\")\npublic record MarketProperties(int maxPageSize, Duration cacheTtl) {}\n\n\u002F\u002F [QUARKUS] @ConfigMapping (type-safe, build-time validated)\n@ConfigMapping(prefix = \"market\")\npublic interface MarketConfig {\n  int maxPageSize();\n  Duration cacheTtl();\n}\n\n\u002F\u002F [QUARKUS] Simple values with @ConfigProperty\n@ConfigProperty(name = \"market.max-page-size\", defaultValue = \"100\")\nint maxPageSize;\n```\n\n## Testing Expectations\n\n### Shared\n- JUnit 5 + AssertJ for fluent assertions\n- Mockito for mocking; avoid partial mocks where possible\n- Favor deterministic tests; no hidden sleeps\n\n### [SPRING]\n- `@WebMvcTest` for controller slices, `@DataJpaTest` for repository slices\n- `@SpringBootTest` reserved for full integration tests\n- `@MockBean` for replacing beans in Spring context\n\n### [QUARKUS]\n- Plain JUnit 5 + Mockito for unit tests (no `@QuarkusTest`)\n- `@QuarkusTest` reserved for CDI integration tests\n- `@InjectMock` for replacing CDI beans in integration tests\n- Dev Services for database\u002FKafka\u002FRedis — avoid manual Testcontainers setup when Dev Services suffice\n- `@QuarkusTestResource` for custom external service lifecycle\n\n```java\n\u002F\u002F [SPRING] Controller test\n@WebMvcTest(MarketController.class)\nclass MarketControllerTest {\n  @Autowired MockMvc mockMvc;\n  @MockBean MarketService marketService;\n}\n\n\u002F\u002F [QUARKUS] Integration test\n@QuarkusTest\nclass MarketResourceTest {\n  @InjectMock\n  MarketService marketService;\n\n  @Test\n  void should_return_404_when_market_not_found() {\n    given().when().get(\"\u002Fmarkets\u002Funknown\").then().statusCode(404);\n  }\n}\n\n\u002F\u002F [QUARKUS] Unit test (no CDI, no @QuarkusTest)\n@ExtendWith(MockitoExtension.class)\nclass MarketServiceTest {\n  @Mock MarketRepository marketRepository;\n  @InjectMocks MarketService marketService;\n}\n```\n\n**Remember**: Keep code intentional, typed, and observable. Optimize for maintainability over micro-optimizations unless proven necessary.\n",{"name":5,"metadata":44,"description":7},{"origin":45},"ECC","main","74715deacdc69119d739f38916f8ee4f0f979ebf","skills\u002Fstorage\u002Faffaan-m_ECC\u002Fjava-coding-standards",0,"https:\u002F\u002Fgithub.com\u002Fmdnaimul22\u002Fhuman-skills","https:\u002F\u002Fgithub.com\u002Fmdnaimul22","AI Agents Workflows Automation | Specializing in Python, FastAPI, MCP Agents & Custom ERP.","2026-11-11 21:16:57",{"source":8,"skillName":5,"commands":55,"prompt":65,"zipAvailable":66},[56,59,62],{"tool":57,"command":58},"npx","npx skills add mdnaimul22\u002Fhuman-skills --skill java-coding-standards",{"tool":60,"command":61},"bunx","bunx skills add mdnaimul22\u002Fhuman-skills --skill java-coding-standards",{"tool":63,"command":64},"pnpm","pnpm dlx skills add mdnaimul22\u002Fhuman-skills --skill java-coding-standards","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fmdnaimul22\u002Fhuman-skills\u002Fblob\u002Fmain\u002Fskills\u002Fstorage\u002Faffaan-m_ECC\u002Fjava-coding-standards\u002FSKILL.md",true,[],[69,77,106,127,146,161],{"skillNo":70,"name":71,"nameZh":6,"description":72,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":73,"categories":74,"keywords":75,"publishedAt":76},"01M72JT3YP1SQHD0MANGDXQ4RT","higgsfield-websites","Build, edit, and deploy full-stack websites, apps and games via the Higgsfield CLI (`higgsfield website …`). Each is a React 19 + TanStack Start SSR app in one Cloudflare Worker (D1\u002FR2\u002FKV\u002FDO\u002FContainers). THREE product types, picked via `--type` on create: `website` (standalone, no Higgsfield integration — references\u002Fwebsite-flow.md), `app` (Sign in with Higgsfield + fnf SDK, Quanta — references\u002Fapp-flow.md), `game` (realtime multiplayer rooms — references\u002Fgame-flow.md). Routes to the right flow; each carries its own rules and deploy\u002Fpublish gates.\nUse when: \"build me a website\", \"make a landing page\", \"create a web app\", \"build a SaaS dashboard \u002F portfolio\", \"make me a game\", \"deploy this site\", \"publish\". Also owns GAME ART: \"make a spritesheet\", \"tileable texture\", \"animate a 3D character\", game music\u002FSFX — see the game-* references.\nNOT for: single image\u002Fvideo\u002Faudio generation (higgsfield-generate), product photos (higgsfield-product-photoshoot), marketplace cards (higgsfield-marketplace-cards).","https:\u002F\u002Fgithub.com\u002Fmdnaimul22\u002Fhuman-skills\u002Fblob\u002Fmain\u002Fskills\u002Fstorage\u002Fhiggsfield-ai_skills\u002Fhiggsfield-websites\u002FSKILL.md",[],[],"2026-11-10 22:39:42",{"skillNo":78,"name":79,"nameZh":6,"description":80,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":81,"categories":82,"keywords":99,"publishedAt":39},"01M70JPK8HAXXA85P7Q8NKZZYG","writing-skills","Use when creating new skills, editing existing skills, or verifying skills work before deployment","https:\u002F\u002Fgithub.com\u002Fmdnaimul22\u002Fhuman-skills\u002Fblob\u002Fmain\u002Fskills\u002Fstorage\u002Fobra_superpowers\u002Fwriting-skills\u002FSKILL.md",[83,88,93,96],{"categoryNo":84,"categoryName":85,"taxonomyType":86,"taxonomyTypeDesc":87},"01JBSEEDCAT000000000000018","写作与文案","SCENARIO","使用场景",{"categoryNo":89,"categoryName":90,"taxonomyType":91,"taxonomyTypeDesc":92},"01JBSEEDCAT000000000000036","内容创作者","PROFESSION","适用职业",{"categoryNo":94,"categoryName":95,"taxonomyType":86,"taxonomyTypeDesc":87},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":97,"categoryName":98,"taxonomyType":86,"taxonomyTypeDesc":87},"01JBSEEDCAT000000000000008","测试与质量",[25,100,101,102,34,103,104,24,105],"writing skills","editing","deployment","Existing","new","work",{"skillNo":107,"name":108,"nameZh":6,"description":109,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":110,"categories":111,"keywords":117,"publishedAt":39},"01M70JP4PHBH1CQVVDWZ94W159","writing-plans","Use when you have a spec or requirements for a multi-step task, before touching code","https:\u002F\u002Fgithub.com\u002Fmdnaimul22\u002Fhuman-skills\u002Fblob\u002Fmain\u002Fskills\u002Fstorage\u002Fobra_superpowers\u002Fwriting-plans\u002FSKILL.md",[112,113,114],{"categoryNo":84,"categoryName":85,"taxonomyType":86,"taxonomyTypeDesc":87},{"categoryNo":89,"categoryName":90,"taxonomyType":91,"taxonomyTypeDesc":92},{"categoryNo":115,"categoryName":116,"taxonomyType":91,"taxonomyTypeDesc":92},"01JBSEEDCAT000000000000030","开发工程师",[25,118,119,120,24,121,28,34,122,123,124,125,126],"writing plans","plans","you","code","requirements","task","multi","spec","multi-step task",{"skillNo":128,"name":129,"nameZh":6,"description":130,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":131,"categories":132,"keywords":133,"publishedAt":39},"01M70JNTYVGXFZT8PASZ844TH8","verification-before-completion","Use when about to claim work is complete, fixed, or passing, before committing or creating PRs - requires running verification commands and confirming output before making any success claims; evidence before assertions always","https:\u002F\u002Fgithub.com\u002Fmdnaimul22\u002Fhuman-skills\u002Fblob\u002Fmain\u002Fskills\u002Fstorage\u002Fobra_superpowers\u002Fverification-before-completion\u002FSKILL.md",[],[134,135,136,137,138,139,34,140,141,142,24,143,105,144,145],"verification","verification before completion","complete","about","output","assertions","prs","evidence","claim","claims","commands","running",{"skillNo":147,"name":148,"nameZh":6,"description":149,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":150,"categories":151,"keywords":153,"publishedAt":39},"01M70JNGVSQDESWN0Q5BPJ875V","using-superpowers","Use when starting any conversation - establishes how to find and use skills, requiring skill invocation before ANY response including clarifying questions","https:\u002F\u002Fgithub.com\u002Fmdnaimul22\u002Fhuman-skills\u002Fblob\u002Fmain\u002Fskills\u002Fstorage\u002Fobra_superpowers\u002Fusing-superpowers\u002FSKILL.md",[152],{"categoryNo":94,"categoryName":95,"taxonomyType":86,"taxonomyTypeDesc":87},[154,155,156,157,34,24,158,159,160],"using superpowers","superpowers","conversation","how to","how","find","questions",{"skillNo":162,"name":163,"nameZh":6,"description":164,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":165,"categories":166,"keywords":167,"publishedAt":39},"01M70JN57CE588NPYPYTWH1DWG","using-git-worktrees","Use when starting feature work that needs isolation from current workspace or before executing implementation plans - ensures an isolated workspace exists via native tools or git worktree fallback","https:\u002F\u002Fgithub.com\u002Fmdnaimul22\u002Fhuman-skills\u002Fblob\u002Fmain\u002Fskills\u002Fstorage\u002Fobra_superpowers\u002Fusing-git-worktrees\u002FSKILL.md",[],[168,169,170,171,172,173,24,105,174,175,176,177,178,179,180,119,34,181,182],"using git worktrees","Using git","git","worktrees","git worktrees","implementation","git worktree","worktree","native","Tools","isolation","fallback","feature","via","workspace"]