CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl-labs/springboot-project-structure

Spring Boot project structure — package-by-feature, record DTOs, Flyway migrations, multi-profile config, actuator, proper test structure

84

4.04x
Quality

76%

Does it follow best practices?

Impact

97%

4.04x

Average score across 5 eval scenarios

SecuritybySnyk

Passed

No known issues

Overview
Quality
Evals
Security
Files

springboot-package-by-feature.jsonverifiers/

{
  "instruction": "Organize Spring Boot packages by feature domain, not by technical layer",
  "relevant_when": "Agent creates a Spring Boot application with multiple domain concepts (e.g., orders, products, users)",
  "context": "Package-by-feature groups each domain concept (order/, product/, user/) into its own package containing controller, service, repository, entity, and DTOs together. This is preferred over package-by-layer (controller/, service/, repository/ at the top level) because it keeps related code together, enables package-private visibility for encapsulation, and makes navigation intuitive. Shared cross-cutting concerns live in config/, shared/, or infrastructure/ packages.",
  "sources": [
    {
      "type": "file",
      "filename": "skills/springboot-project-structure/SKILL.md",
      "tile": "tessl-labs/springboot-project-structure@0.2.0"
    }
  ],
  "checklist": [
    {
      "name": "feature-packages-exist",
      "rule": "Domain concepts are organized into feature packages (e.g., order/, product/) rather than layer packages (e.g., controller/, service/, repository/ at the top level). Each feature package contains its own controller, service, and repository.",
      "relevant_when": "Agent creates a Spring Boot application with two or more domain concepts"
    },
    {
      "name": "shared-config-separate",
      "rule": "Cross-cutting configuration classes are in a dedicated config/ package, not scattered across feature packages",
      "relevant_when": "Agent creates @Configuration classes in a Spring Boot application"
    }
  ]
}

tile.json