CLAUDE.mdBuild all: ./gradlew build Build skipping tests: ./gradlew build -x test Run application: ./gradlew bootRun Single test: ./gradlew test --tests "org.projectforge.package.ClassName.methodName" Package tests: ./gradlew test --tests "org.projectforge.package.*" Module tests: ./gradlew :projectforge-business:test
Six commands covering the most common operations. The --tests filter is especially useful — it runs a single test method without executing the entire suite (which takes minutes).
Note: These work because the root build.gradle.kts applies to all subprojects via allprojects { }.
| Rule | Detail | Why |
|---|---|---|
| Kotlin JVM target 17 | Set in convention plugin line 28 | LTS version, Spring Boot 3.x minimum |
| camelCase / PascalCase | Standard Kotlin naming | Consistency across all modules |
| License header | GPLv3 header in every new Kotlin/Java file | Legal requirement for open-source distribution |
| Imports: stdlib first | kotlin.* → domain/project imports | Readable import blocks |
| Non-null by default | Use Type? only when null is semantically valid | Kotlin's null safety — catches bugs at compile time |
| JUnit 5 | @Test, @BeforeEach, descriptive names | Configured in convention plugin line 38 |
| Extension functions | Prefer fun Type.method() over Util.method(type) | Idiomatic Kotlin |
| Spring Bean injection | @Autowired or constructor injection | Standard Spring Boot pattern |
| Kotlin Coroutines | For async operations (not Java threads) | Lightweight concurrency |
| kotlin-logging | private val log = KotlinLogging.logger {} | SLF4J wrapper applied in convention plugin line 60 |
| 4-space indent | Consistent across Kotlin and Java | Project convention |
This file is the translation layer between human-readable conventions and what the build system actually enforces:
| CLAUDE.md says | Enforced by |
|---|---|
| "Kotlin JVM target 17" | Convention plugin line 28: options.release.set(17) |
| "JUnit 5 for tests" | Convention plugin line 38: useJUnitPlatform() |
| "kotlin-logging" | Convention plugin line 60: api("kotlin-logging") |
| "Build all" | Root build.gradle.kts: applies to all subprojects |
CLAUDE.md tells the AI what to do; the build files enforce it.
This file was added specifically for Claude Code — Anthropic's AI coding assistant. It follows the CLAUDE.md convention where the agent auto-reads this file at the start of every session. It was likely added by the same developer who introduced AI-assisted development to the project.
The equivalent for GitHub Copilot would be .github/copilot-instructions.md or inline comments. For Cursor, it would be .cursor/rules.md.
Notably, the file mentions Kotlin Coroutines (line 22) — but the current codebase still uses Thread in several places (e.g. IdpLoginHandler.kt). This means CLAUDE.md describes the desired style more than the current reality.
CLAUDE.mdis an agent instruction file — it is automatically read by Claude Code when the AI interacts with this repository. Think of it as the onboarding document for AI agents.Without this file, Claude would need to discover build commands, code style, and conventions by reading
build.gradle.kts,buildSrc/, and existing source files. With it, the agent immediately knows:./gradlew build) and run (./gradlew bootRun)./gradlew test --tests "...")