- Toolchain: Gradle build, Java 11 runtime (targets 8 bytecode).
- Build everything:
./gradlew build; prefer Gradle tasks over direct javac. - Unit tests:
./gradlew test; single test with./gradlew test --tests "pkg.Class". - Always add unit tests, and if relevant integration tests for new features and bugfixes.
- Integration tests:
./gradlew integrationTest; filter via--tests "pkg.ITClass". - Formatting:
./gradlew spotlessApply; verify usingspotlessCheck. - No extra linters; rely on compiler + spotless for CI hygiene.
- Source layout: app in
src/main/java, unit tests insrc/test/java, IT insrc/it/java. - Main entry point:
dev.jbang.Main; CLI commands built with picocli. - Keep packages under
dev.jbang; match existing folder hierarchy. - Imports ordered java → javax → org → com → dev.jbang → blank line.
- Drop unused imports; never use wildcard or static-on-demand imports.
- Formatting uses
misc/eclipse_formatting_nowrap.xml; indent 4 spaces, no wrapping. - Naming: UpperCamelCase types, lowerCamelCase members, UPPER_SNAKE constants.
- Types: prefer explicit generics; annotate nullability with
@jspecifywhere applicable. - Avoid raw collections and unchecked casts; keep method signatures explicit.
- Error handling: throw
dev.jbang.cli.ExitExceptionfor controlled exits; let picocli report parameter issues. - Logging/output: use
dev.jbang.util.Utilhelpers (e.g.,infoMsg,verboseMsg). - Commits: use conventional/semantic format —
feat:,fix:,build:,docs:, etc. PR titles follow the same convention. - Startup scripts live in
src/main/scripts/:jbang(bash),jbang.cmd(CMD),jbang.ps1(PowerShell). The CMD script delegates downloads and JDK installs tojbang.ps1. Changes affecting downloads or bootstrap must be applied consistently across all three. Behavior (e.g., retry backoff) must be consistent across tools — watch for tool-specific quirks likecurl --retry-delay 0meaning exponential backoff whilewget --waitretry=0meaning no delay. - Environment variables follow
JBANG_*naming. New env vars must have defaults in each script that actually uses them (e.g.,jbang.cmddelegates downloads tojbang.ps1, so download-related vars only need defaults injbangandjbang.ps1). Document new vars ininstallation.adoc("Startup Script Environment Variables") and ensure consistent behavior across platforms. - Documentation is AsciiDoc under
docs/modules/ROOT/pages/(e.g.,installation.adoc,troubleshooting.adoc). - Test infrastructure:
BaseTestincludes WireMock for HTTP mocking (records/replays requests).BaseITprovidesshell()helpers for running CLI commands. UseassumeTruefor conditionally skipping tests (e.g.,assumeTrue(isCommandAvailable("bash"))orassumeTrue(isCommandAvailable("pwsh"))). - Script tests should run the real scripts from
src/main/scripts/— not synthetic copies or extracted functions. Use env var overrides (e.g.,JBANG_DOWNLOAD_URL) to point real scripts at WireMock.