Agent skill

Grails Gradle Developer

by apache in apache/grails-core

Guides Gradle 9 build changes in apache/grails-core on the 8.0.x line, favoring the repo's convention plugins, BOM platforms and patterns over generic Gradle advice.

Apache-2.0Auto-check passedDevelopment

Install Grails Gradle Developer

skills CLI
$ npx skills add apache/grails-core --skill gradle-developer -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install apache/grails-core gradle-developer --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/apache/grails-core.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/gradle-developer .claude/skills/gradle-developer && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
gradle-developer
GitHub stars
2.9k
Token cost
~11k tokens
SKILL.md length
4,200 words
Files
1
Skills in repo
9
Repo updated
First seen
Licence
Apache-2.0

At a glance

Guides Gradle 9 build changes in apache/grails-core on the 8.0.x line, favoring the repo's convention plugins, BOM platforms and patterns over generic Gradle advice.

  • Works in 5 steps: Match neighboring modules. Before… → Prefer existing convention plugins over… → Gradle docs are secondary. Official… → …
  • Editing build.gradle, settings.gradle or anything under build-logic
  • SKILL.md covers What I Do, When to Use Me, Prime Directive: This Repo Wins and Topology (Know Where You Are), plus 9 more sections
  • Calls gradle; reaches develocity.apache.org

What it does

The skill tells the agent to write and change Gradle build scripts the way this repository already does on the 8.0.x line, which uses Gradle 9.8.x. Its prime directive is that the repo wins over generic best practice: copy neighboring modules' build.gradle files, reuse existing convention plugins instead of inline configuration, and treat the official Gradle docs as secondary, because the monorepo deliberately differs, for example by leaving the configuration cache off and using a custom BOM validator.

Coverage includes the composite builds (build-logic, grails-gradle, grails-forge, end-to-end), convention plugins, BOM and platform() dependency management, test wiring, publishing hooks and Gradle 9 task-configuration traps learned from recent PRs. Loading it is mandatory before editing build.gradle, settings.gradle, gradle.properties or dependencies.gradle, adding or renaming a module, bumping a dependency or the wrapper, changing test, publish, SBOM, code-style or JaCoCo wiring, or diagnosing configuration-cache and task-graph failures. Other skills handle static-analysis violations, failing tests, plugin-repo merges and Grails 8 upgrades.

When your agent uses it

  • Editing build.gradle, settings.gradle or anything under build-logic
  • Adding or renaming a module in the Grails monorepo
  • Bumping a dependency version or the Gradle wrapper
  • Diagnosing configuration-cache, dependency-resolution or task-graph failures

Example prompts

  • “Add a new subproject to grails-core and wire it up like its neighbors.”
  • “Bump the Gradle wrapper and fix whatever breaks in build-logic.”
  • “A build fails inside afterEvaluate on the 8.0.x branch. Find the cause.”

Requirements

  • A checkout of apache/grails-core on the 8.0.x line

Workflow steps

5 steps, taken from the first numbered list in SKILL.md.

  1. Match neighboring modules. Before inventing structure, open 2-3 similar build.gradle files and copy their plugin block, dependency style…
  2. Prefer existing convention plugins over inline configuration. If CompilePlugin already sets encoding, release, jars, and reproducibility…
  3. Gradle docs are secondary. Official Gradle 9 docs are useful for APIs and deprecations, but this monorepo intentionally diverges…
  4. Do not use io.spring.dependency-management / Spring Dependency Management plugin in core modules or applications. The intentional…
  5. Scope Gradle invocations to the touched subproject (:module:test, not root test) unless the change is cross-cutting.

What it can do on your machine

Read from SKILL.md and the folder at commit 3d6db18. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • gradle

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Hosts in commands or code, which the agent is likely to contact:

    • develocity.apache.org

    Also links to:

    • docs.gradle.org

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Grails Gradle Developer loads about 11k tokens when it runs. Until then it costs about 64 tokens; SKILL.md has 4,200 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~64
When it runs · the whole SKILL.md, loaded when a task matches
~11k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from apache/grails-core at commit 3d6db18, republished under its Apache-2.0 licence (© apache). 4,200 words, ~11,143 tokens.

Download SKILL.mdSave it as .claude/skills/gradle-developer/SKILL.md (or your agent's skills folder).
name
gradle-developer
description
Expert guide for Gradle 9 builds in apache/grails-core on the 8.0.x line - multi-project topology, convention plugins, BOM platforms, dependency rules, task configuration hygiene, and repo-specific patterns that override generic Gradle docs
license
Apache-2.0
<!--
SPDX-License-Identifier: Apache-2.0

Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements; and to You under the Apache License, Version 2.0.
-->

What I Do

  • Write and change Gradle build scripts the way this repository already does them on 8.0.x (Gradle 9.8.x).
  • Keep agents off generic Gradle "best practice" when it conflicts with established monorepo patterns.
  • Cover composite builds (build-logic, grails-gradle, grails-forge, end-to-end), convention plugins, BOM/platform() dependency management, test wiring, publishing hooks, and Gradle 9 task-configuration traps learned from recent PRs.
  • Make Gradle changes boring, copy-paste consistent, and correct on the first try.

When to Use Me

MANDATORY before any of the following:

  • Editing build.gradle, settings.gradle, gradle.properties, dependencies.gradle, or anything under gradle/, build-logic/, grails-gradle/
  • Adding or renaming a module / subproject
  • Bumping a dependency version or the Gradle wrapper
  • Changing test, publish, SBOM, code-style, or JaCoCo Gradle wiring
  • Touching Grails Gradle plugins used by apps (org.apache.grails.gradle.*)
  • Diagnosing configuration-cache, resolution, afterEvaluate, or task-graph failures

Also load when a change looks like application code but requires build script updates (new module, new published artifact, CLI companion jar, functional test app).

Related skills (do not substitute this one):

NeedSkill
CodeNarc / Checkstyle / PMD / SpotBugs reportsviolation-fixer
Failing tests / aggregate reportstest-fixer
Merging an external plugin repo into the monorepomono-repo-integration
App-facing Grails 8 upgrade guidancegrails-8-upgrade

Prime Directive: This Repo Wins

  1. Match neighboring modules. Before inventing structure, open 2-3 similar build.gradle files and copy their plugin block, dependency style, and apply { from ... } scripts.
  2. Prefer existing convention plugins over inline configuration. If CompilePlugin already sets encoding, release, jars, and reproducibility, do not re-declare those in the module script.
  3. Gradle docs are secondary. Official Gradle 9 docs are useful for APIs and deprecations, but this monorepo intentionally diverges (configuration cache off, no Spring DM plugin, heavy projectDir remapping, presence-based -P flags, custom BOM validator). When docs and this repo disagree, follow this repo unless you are deliberately fixing a known issue with a tracked reason.
  4. Do not use io.spring.dependency-management / Spring Dependency Management plugin in core modules or applications. The intentional regression fixture at grails-test-examples/spring-dependency-management is the only exception. Grails 8 otherwise uses native platform() / enforcedPlatform() plus org.apache.grails.gradle.bom-property-overrides (see PR #15467).
  5. Scope Gradle invocations to the touched subproject (:module:test, not root test) unless the change is cross-cutting.
Change workflow
  1. Inspect 2-3 sibling modules and the relevant convention plugin or shared script.
  2. Confirm the Gradle project path in settings.gradle, including any projectDir mapping.
  3. Edit the smallest appropriate build file or convention plugin.
  4. Run scoped compile, test, and validateDependencyVersions tasks for the changed project.
  5. For grails-gradle changes, run the relevant plugin TestKit tests from grails-gradle/ with its wrapper.

Topology (Know Where You Are)

This git repo is several independent Gradle builds, not one flat multiproject:

BuildPathRoleHow to run
Root frameworkrepo root60+ published modules, BOMs, test-examples, profiles, docs./gradlew … from root
build-logicbuild-logic/Shared convention plugins via includeBuildcd build-logic && ./gradlew … (or root pluginManagement includeBuild)
grails-gradlegrails-gradle/Published Grails Gradle plugins for appscd grails-gradle && ./gradlew …
grails-forgegrails-forge/App generator (own wrapper, own deps)cd grails-forge && ./gradlew …
end-to-endend-to-end/Tests against published artifacts in build/local-mavenFull 3-step flow below (see end-to-end/README.md)
gradle-bootstrapgradle-bootstrap/Regenerates shared wrappers from .sdkmanrcgradle -p gradle-bootstrap (see wrapper section)

end-to-end is not a composite consumer of the root build. It resolves real published coordinates from <repo>/build/local-maven (the TestCaseMavenRepo), not ~/.m2 and not via publishAllToMavenLocal. Do not add includeBuild('..') substitution - that defeats validating consumer metadata, CLI companions, and POM/BOM shape.

Full local run (three steps, in order):

bash
# 1) Publish grails-gradle + root into build/local-maven (both required)
(cd grails-gradle && ./gradlew publishAllPublicationsToTestCaseMavenRepoRepository)
./gradlew publishAllPublicationsToTestCaseMavenRepoRepository

# 2) Build the standalone Grails 7 fixture jar (JDK 17 / Gradle 8.x via its .sdkmanrc)
cd end-to-end/legacy-g7-command-plugin
sdk env
./gradlew jar
cd ../..

# 3) Run the suite on the root JDK 21 environment
sdk env   # from repository root (.sdkmanrc)
cd end-to-end
./gradlew check

Leave legacy-g7-command-plugin's wrapper on its pinned Grails 7 Gradle version when bumping the main line.

Root settings.gradle wires:

groovy
pluginManagement {
    includeBuild('./grails-gradle') { name = 'grails-gradle' }
    includeBuild('./build-logic') { name = 'build-logic-root' }
    // ...
}

build-logic exists because composite builds do not share buildSrc plugins. Internal conventions live there so root, grails-gradle, and forge can consume them.

Project path != directory name

Root settings heavily remaps projectDir (100+ entries). Examples:

Gradle pathDirectory
:grails-bomgrails-bom/default
:grails-base-bomgrails-bom/base
:grails-hibernate7-bomgrails-bom/hibernate7
:grails-controllersgrails-controllers (often 1:1)
:grails-data-hibernate7-coregrails-data-hibernate7/core
:grails-test-examples-app1grails-test-examples/app1

Always use the Gradle project path in task names (./gradlew :grails-data-hibernate7-core:test). Confirm with settings.gradle include + projectDir when unsure. Do not invent paths from folder names alone.

Micronaut "island"

grails-micronaut*, micronaut BOMs, and related test-examples are gated in settings.gradle:

  • Auto-excluded on JDK < 25 (Micronaut 5 targets JVM 25 bytecode)
  • Auto-included on JDK 25+
  • -PskipMicronautProjects forces exclude (used by groovy-joint CI)
  • -PincludeMicronautProjects forces include on older JDKs (still may not compile)

Presence-based flags (property present, value optional) match skipFunctionalTests / skipCodeStyle style elsewhere.


Gradle Version Sync (Hard Rule)

Current line: Gradle 9.8.0 (distributionUrl + gradleToolingApiVersion=9.8.0). Upstream may already ship a newer 9.8.x patch - this repo rides close to latest only after a deliberate multi-location bump PR. Do not "helpfully" jump one wrapper ahead of the rest.

Two Groovy stacks: Gradle itself embeds Groovy 4 for build logic. Application/runtime code on 8.0.x is Groovy 5. That is why dependencies.gradle keeps separate maps:

  • gradleBomDependencyVersions / gradle-groovy.version / gradle-spock.version → build tooling (Groovy 4 / Spock groovy-4)
  • bomDependencyVersions / groovy.version / spock.version → apps and framework modules (Groovy 5 / Spock groovy-5.0)

Never unify those casually.

Preferred bump workflow
  1. Set the new Gradle version in .sdkmanrc (gradle=…).

  2. Run the bootstrap project (uses a system gradle to regenerate shared wrappers from .sdkmanrc):

    bash
    gradle -p gradle-bootstrap

    Bootstrap generates the wrapper under gradle-bootstrap/, copies it to grails-forge, grails-gradle, and end-to-end, then moves the generated wrapper into the repository root. It also runs legacyG7Wrapper so end-to-end/legacy-g7-command-plugin stays on its pinned Grails 7 Gradle version (currently 8.x - do not force it to 9). Root is therefore bootstrap-covered; do not re-list it as a manual step.

  3. Manually refresh the locations bootstrap does not cover. For each tree, keep the full wrapper set in sync (gradle-wrapper.properties, gradle-wrapper.jar, gradlew, gradlew.bat) - not properties alone:

    • build-logic/ - run its wrapper task or copy the complete set from root after bootstrap
    • grails-profiles/base/skeleton/ and grails-profiles/profile/skeleton/
    • grails-shell-cli/src/test/resources/gradle-sample/ (and bin/test copy if present)
    • Forge generated-app wrapper assets (all of these - properties alone is not enough):
      • grails-forge/grails-forge-core/.../gradleWrapperProperties.rocker.raw (properties template)
      • grails-forge/grails-forge-core/src/main/resources/gradle/gradlew
      • grails-forge/grails-forge-core/src/main/resources/gradle/gradlew.bat
      • grails-forge/grails-forge-core/src/main/resources/gradle/wrapper/gradle-wrapper.jar
    • gradle.properties → gradleToolingApiVersion (must match the new Gradle version)
  4. Verify every main-line tree matches on properties and scripts/jars. The only intentional holdout is end-to-end/legacy-g7-command-plugin (Gradle 8.x).

Also keep gradlew.bat LF line endings on this line (PR #15709). Comment at top of root gradle-wrapper.properties remains a human checklist.


Root gradle.properties Flags (Do Not "Fix" Blindly)

PropertyValue / note
org.gradle.cachingtrue
org.gradle.paralleltrue
org.gradle.daemontrue
org.gradle.configuration-cachefalse until #15497 resolved - do not enable casually
org.gradle.configureondemandcommented off - Gradle issue #9489
org.gradle.jvmargs-Xmx3G (daemon only; groovydoc and the guide run in their own JVMs)
javaVersion21 (CompilePlugin reads this for --release)
projectVersionframework version
slf4jPreventExclusiontrue - Grails Gradle plugin POM behavior

CI vs local behavior is branched on System.getenv('CI') and SOURCE_DATE_EPOCH (reproducible builds disable remote cache).

groovydocMaxHeapSize and guideMaxHeapSize are not keys in gradle.properties - do not add them. Each documentation JVM carries its own default (1g per groovydoc task, raised to 3g/2g by the two aggregates; 1500m for the guide), and these exist only as -P overrides that beat the build script when a documentation run will not fit.


Standard Published Library Module

Canonical pattern (see grails-core/build.gradle, grails-controllers/build.gradle, grails-services/build.gradle):

groovy
/*
 *  Licensed to the Apache Software Foundation (ASF) under one
 *  ... Apache header ...
 */

plugins {
    id 'groovy'
    id 'java-library'
    id 'project-report'                                      // optional but common
    id 'org.apache.grails.buildsrc.properties'
    id 'org.apache.grails.buildsrc.dependency-validator'
    id 'org.apache.grails.buildsrc.compile'
    id 'org.apache.grails.buildsrc.publish'
    id 'org.apache.grails.buildsrc.sbom'
    id 'org.apache.grails.buildsrc.vulnerability-scan'      // when appropriate
    id 'org.apache.grails.gradle.grails-code-style'
    id 'org.apache.grails.gradle.grails-jacoco'
}

version = projectVersion
group = 'org.apache.grails'   // or org.apache.grails.web / .data / etc. - match siblings

dependencies {
    implementation platform(project(':grails-bom'))   // or :grails-hibernate7-bom, etc.

    api project(':grails-core')
    api 'org.apache.groovy:groovy'
    // versions come from the platform - do NOT hardcode versions here

    compileOnly 'jakarta.servlet:jakarta.servlet-api'

    testImplementation 'org.spockframework:spock-core'
    testImplementation 'org.apache.groovy:groovy-test-junit5'
    testImplementation 'org.junit.jupiter:junit-jupiter-api'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'
    // junit-platform-launcher is added by gradle/test-config.gradle
}

apply {
    from rootProject.layout.projectDirectory.file('gradle/docs-config.gradle')
    from rootProject.layout.projectDirectory.file('gradle/test-config.gradle')
}
Rules for module scripts
  • Apache license header on every new .gradle / .gradle.kts file.
  • Prefer Groovy DSL (this repo is almost entirely .gradle, not .kts).
  • version = projectVersion and explicit group - do not invent version schemes per module.
  • Use rootProject.layout.projectDirectory.file('gradle/…') for shared scripts (lazy layout API), not brittle rootProject.file string soup in new code.
  • Prefer tasks.named('x') / tasks.withType(T).configureEach over eager task x << or bare tasks.x { } mutation when touching existing modernized code.
  • Configuration avoidance: do not call .get() on providers during configuration unless required; do not resolve configurations at configuration time.
  • api vs implementation vs compileOnly vs runtimeOnly vs testImplementation - follow Java Library plugin semantics; public types in your API surface → api.
  • Project deps: project(':grails-foo') using the settings path.
  • External deps: coordinate without version when the BOM manages them.
CLI companion modules

Command-bearing modules may apply org.apache.grails.gradle.grails-plugin-cli and declare cliApi / cliImplementation configurations (PR #15948). Framework modules that wire CLI with project deps set ext.grailsCliAutoProvision = false (root build.gradle does this for non-test-example projects). Do not dump CLI-only deps back onto the main runtime classpath.


Functional / Test-Example Apps

See grails-test-examples/app1/build.gradle:

  • Apply Grails app plugins: org.apache.grails.gradle.grails-web, often org.apache.grails.gradle.grails-gsp, and cloud.wondrify.asset-pipeline
  • Still use implementation platform(project(':grails-bom'))
  • Depend on published coordinates (org.apache.grails:grails-dependencies-starter-web) - root applies dependency substitution via gradle/functional-test-config.gradle so local projects replace Maven coordinates
  • Apply gradle/functional-test-config.gradle (and datastore-specific scripts like hibernate7-test-config.gradle when needed)
  • Do not disable substitution without understanding multi-project resolution

Dependency Management (BOM Is Law)

Single source of versions
FileWhat it owns
Root dependencies.gradleApplication/runtime BOM versions (bomDependencyVersions, bomDependencies, bomPlatformDependencies) and gradle-tooling maps (gradleBomDependencyVersions, etc.). grails-gradle applies this same file via ../dependencies.gradle - there is no separate grails-gradle/dependencies.gradle on this line
gradle.propertiesNon-BOM pins (tool versions, javaVersion, gradleToolingApiVersion, checkstyle/codenarc/pmd/jacoco versions)

No gradle/libs.versions.toml. This monorepo does not use Gradle version catalogs. Do not introduce a catalog "because Gradle docs recommend it." Dependabot and the published BOM pipeline are built around the root dependencies.gradle maps (see comment at top of that file).

Map naming contract

For POM property generation, map key must be the dependency name prefix:

groovy
bomDependencyVersions = [
    'groovy.version': '5.1.3',
]
bomDependencies = [
    'groovy': "org.apache.groovy:groovy:${bomDependencyVersions['groovy.version']}",
]

Break this and published BOM properties / docs extraction break.

Platform usage in modules
groovy
// Default
implementation platform(project(':grails-bom'))

// Hibernate 7 stack
implementation platform(project(':grails-hibernate7-bom'))

// Micronaut variants use enforcedPlatform in app-facing plugin logic

grails-bom/base (:grails-base-bom) is a java-platform that:

  • Imports Spring Boot BOM via api platform(...) (with deliberate excludes for groovy/spock/hibernate/liquibase where Grails owns the line)
  • Adds constraints from dependencies.gradle maps
  • Adds constraints for published subprojects
  • Applies gradle/cli-companion-bom-constraints.gradle for CLI companion versions under enforcedPlatform
validateDependencyVersions (AGENTS.md rule 14 / dependency-validator plugin)

Applied via org.apache.grails.buildsrc.dependency-validator.

Implementation detail (GrailsDependencyValidatorPlugin): for each resolved coordinate that the BOM also manages, it fails when bomVersion != resolvedVersion - any mismatch, not only "resolved is newer."

How to fix by direction:

SituationFix
Transitive resolved newer than BOMBump the pin in dependencies.gradle so the BOM is >= the winner (usual case; AGENTS.md rule 14)
Resolved older / forced / strict conflictFind the force, strict constraint, or second platform pulling the other version; remove the force, align platforms, or document a deliberate override
Intentional divergence that must stayext.allowedBomOverrides = ['group:name', …] with a commented reason - last resort
Whole project cannot validatePrefer ext.skipDependencyValidation = true in the build script. CLI: -PskipDependencyValidation is presence-based and skips validation; -PskipDependencyValidation=true is also valid. Use the documented form that best communicates intent.

Also:

  • Prefer inheriting Spring Boot managed versions over re-pinning duplicates (PR #15730). Only pin when diverging (security override, missing from Boot BOM, lockstep companion like graphql-java-extended-scalars).
  • Same coordinate managed in multiple BOM maps must use the same version everywhere or enforcedPlatform resolution explodes.
  • Do not silence validation with exclusions as a shortcut to avoid a BOM bump.
validateBomProperties (parent BOM property rules)

Registered by its own plugin, org.apache.grails.buildsrc.bom-property-validator, which every BOM applies (on java-platform projects only). Like validateDependencyVersions it is not attached to check or build; CI runs it by name in its own Validate BOM Properties job (root BOMs and grails-gradle-bom). It has its own opt-out, skipBomPropertyValidation, which works like skipDependencyValidation (-PskipBomPropertyValidation, -PskipBomPropertyValidation=true, or ext.skipBomPropertyValidation = true); each property skips only its own task. It reads the POM a BOM publishes (generatePomFileForMavenPublication). Every version property the BOM owns (ext.bomVersionProperties: gradleBomDependencyVersions for grails-gradle-bom, bomDependencyVersions for grails-base-bom, customBomVersions for each variant) must be used by some published entry. It also compares the POM with the parent BOMs named by ext.parentBoms (spring-boot-dependencies, set in dependencies.gradle), including the BOMs they import, and for every module both manage it fails when:

RuleExample failureFix
(any owned property) No published entry uses the version keyliquibase-hibernate5.version = 4.27.0Delete the key, or add the dependency that should use it
The pin uses a different property than the parent controls the module with${jackson3.version} should be ${jackson-bom.version}Rename the version key, and the dependency keys that prefix it (map naming contract)
The pin overrides a version the parent writes literally (all of Spring Boot's own org.springframework.boot:* entries)${foo.version}, where only ${spring-boot.version} moves the parent's versionDrop the pin, or add a documented exemption - renaming it to the parent's import property would only repeat the parent's version
The pin repeats the parent's versiongraphql-java.version = 25.0Drop the pin and inherit the parent's version

A module the parent manages through an imported BOM belongs to the property the parent imports that BOM with (jackson-bom.version for all of tools.jackson:jackson-bom), because that is the property a consumer sets to move the family. Coordinates and versions are resolved from each parent POM's properties, its own parents' and the Maven built-ins (${project.groupId}, as the Kotlin and Brave BOMs write their group, ${project.version}, ${project.parent.version}); an entry that cannot be resolved fails the task with Cannot resolve <entry>, managed by <bom> instead of going unchecked, so teach PomVersions.properties the missing built-in. Deliberate exceptions go in bomUnusedVersionExemptions / bomPropertyNameExemptions / bomRedundantVersionExemptions in dependencies.gradle, each with its reason.

Adding or bumping a dependency
  1. Decide if Spring Boot already manages it - if same version, omit pin; if a different version, name the version key after Spring Boot's property (validateBomProperties enforces both).
  2. If Grails must manage it, add/bump in the correct map in dependencies.gradle.
  3. Use the unversioned coordinate in module dependencies {}.
  4. Run ./gradlew :that-module:validateDependencyVersions (and affected consumers).
  5. Security overrides: comment with CVE and previous Boot version (see existing httpcore5/jackson/logback pins).
Exclusions

Use sparingly, always with a reason. Common pattern for Hibernate:

groovy
api 'org.hibernate.orm:hibernate-core', {
    exclude group: 'commons-logging', module: 'commons-logging'
    // ...
}

Do not exclude your way out of a BOM version fight. Prefer the direction-aware fixes in the validator table above (usually bump the BOM when a transitive is newer; otherwise align forces/platforms).


Convention Plugins (build-logic)

Plugin IDs (implementation under build-logic/plugins/…/buildsrc/):

Plugin IDPurpose
org.apache.grails.buildsrc.propertiesLoad root/local.properties into ext
org.apache.grails.buildsrc.compileJava 21 --release, UTF-8, fork memory, parameters, sources/javadoc jars, reproducible archives, Groovy config script, isolated build, per-project base.dir
org.apache.grails.buildsrc.dependency-validatorvalidateDependencyVersions
org.apache.grails.buildsrc.bom-property-validatorvalidateBomProperties (BOM projects only)
org.apache.grails.buildsrc.publishPublishing conventions (grails-publish integration)
org.apache.grails.buildsrc.sbomCycloneDX / SBOM reproducibility
org.apache.grails.buildsrc.vulnerability-scanOSS Index style scanning hooks
org.apache.grails.buildsrc.groovydocGroovydoc
org.apache.grails.buildsrc.groovydoc-enhancerGroovydoc enhancer
org.apache.grails.buildsrc.repoSettings plugin: Apache snapshot/staging repo content filters
org.apache.grails.buildsrc.agent-skillsPackages skills/<skill>/ into the jar at META-INF/skills/apache/grails-core/<skill>/ (SkillsJars layout); validates each skill's frontmatter name
org.apache.grails.gradle.grails-code-styleCheckstyle + CodeNarc
org.apache.grails.gradle.grails-code-analysisPMD + SpotBugs (opt-in props)
org.apache.grails.gradle.grails-jacocoJaCoCo per project
org.apache.grails.gradle.grails-violation-aggregationRoot only - aggregateViolations
org.apache.grails.gradle.grails-ij-formatterIntelliJ formatter wiring
CompilePlugin behaviors you must not fight
  • JavaCompile.options.release from javaVersion (21) - not outdated sourceCompatibility/targetCompatibility pairs in new code
  • UTF-8 everywhere
  • -parameters for reflection/IDE
  • Forked compilation with -Dgrails.isolated.build=true and a per-project BaseDirArgumentProvider supplying -Dbase.dir=<projectDir>. It is marked @Internal, not @InputDirectory, because projectDir contains build outputs. Do not remove it: it prevents grails.factories leaking between compiler daemons (#15799 / CompilePlugin comments).
  • The compile-time base.dir provider is required, but absolute base.dir values are forbidden in Test.systemProperties: they make cache keys machine-specific. Never "simplify" by removing the compiler provider or adding an absolute test property.
  • Jar.duplicatesStrategy = FAIL - duplicate entries are configuration bugs
  • Reproducible archives: no timestamps, fixed order, unix 0644/0755
  • Groovy configurationScript → gradle/groovy-compile-configscript.groovy (annotation member order / GROOVY-12146 workaround, PR #15963)
Published Grails Gradle plugins (grails-gradle)

Use the fully qualified plugin IDs in plugins { id '…' } blocks. Most are registered in grails-gradle/plugins/build.gradle. org.apache.grails.gradle.grails-publish is supplied by the external grails-publish-plugin implementation dependency (not listed in that file's gradlePlugin {} block) but is still the correct ID for publishing.

Plugin ID
org.apache.grails.gradle.grails-app
org.apache.grails.gradle.grails-web
org.apache.grails.gradle.grails-plugin
org.apache.grails.gradle.grails-gsp
org.apache.grails.gradle.grails-gson
org.apache.grails.gradle.grails-markup
org.apache.grails.gradle.grails-profile
org.apache.grails.gradle.grails-publish-profile
org.apache.grails.gradle.grails-cli
org.apache.grails.gradle.grails-plugin-cli
org.apache.grails.gradle.grails-cli-library
org.apache.grails.gradle.grails-exploded
org.apache.grails.gradle.grails-integration-test
org.apache.grails.gradle.grails-test-phases
org.apache.grails.gradle.bom-property-overrides
org.apache.grails.gradle.grails-publish (via grails-publish-plugin dependency)

Never paste bare suffixes like grails-web into a plugins block - resolution will fail.

When changing these plugins:

  • Prefer lazy task configuration; never resolve configurations inside configureEach at configuration time (PR #16076 - Gradle 9.5+ markAsObserved failures).
  • Be careful with nested afterEvaluate ordering (PR #16009 - BOM apply vs CLI detect race).
  • Declare Copy/processResources filter values as task inputs (PR #16006 - ReplaceTokens up-to-date bug).
  • Functional tests live under grails-gradle/plugins/src/test with TestKit projects - update them with behavior changes.
  • Build/test from grails-gradle/ directory with its wrapper.

Show full SKILL.md (1,656 more words)Show less

Shared Scripts Under gradle/

Apply with:

groovy
apply {
    from rootProject.layout.projectDirectory.file('gradle/test-config.gradle')
}
ScriptUse
test-config.gradleJUnit Platform, parallel forks, heap, cache policy, skip flags, launcher deps
functional-test-config.gradleDependency substitution for test-examples
docs-config.gradle / docs-dependencies.gradleGroovydoc / docs classpaths
publish-root-config.gradleRoot publishing orchestration
rat-root-config.gradleApache RAT
cli-companion-bom-constraints.gradleCLI artifact constraints on BOMs
hibernate5-test-config.gradle / hibernate7-test-config.gradleDatastore test stacks
spring-security-test-config.gradleSpring Security functional and integration tests
grails-data-tck-config.gradleGORM data TCK wiring and test filters
grails-extension-gradle-config.gradleGradle extension module conventions
test-webjar-asset-config.gradleWebJar asset test setup
mongodb-forked-test-config.gradleForked MongoDB test configuration
mongodb-*-test-config.gradle / redis-test-config.gradleExternal service tests
plugin-repositories.gradleShared plugin repo config for settings
groovy-compile-configscript.groovyGroovy compiler config script (not applied via apply from in modules - referenced by CompilePlugin)
Test flags (test-config.gradle)

Presence of project properties skips/selects suites, e.g.:

skipTests, skipCoreTests, onlyFunctionalTests, onlyHibernate5Tests, onlyHibernate7Tests, onlyMongodbTests, onlyRedisTests, onlySpringSecurityTests

Parallelism: configuredTestParallel from -PmaxTestParallel or CI default 3 / local availableProcessors * 3/4.

Env:

  • DO_NOT_CACHE_TESTS=1 - force test re-run without full --rerun-tasks
  • debug.tests system prop - attach debugger args
  • SUPPRESS_DEPRECATION_WARNINGS=true - strip some -Xlint noise

CI disables build cache for GroovyCompile and Test so AST transforms and tests stay honest.


Configuration Hygiene (Gradle 9.x Landmines)

These bit this repo in production PRs. Treat as hard rules when writing plugin or build code:

  1. No configuration-time classpath resolution in task configureEach callbacks. Defer probes to execution (doFirst / task actions) or use proper providers (PR #16076).
  2. No nested afterEvaluate that mutates configurations after another plugin may have resolved a related configuration (PR #16009). Prefer withPlugin / plugins.withId / lazy configurations.configureEach before observation.
  3. Task inputs must include filter/token maps and any other non-file data that affects outputs (PR #16006).
  4. All custom task types must declare caching intent (@DisableCachingByDefault or correct cacheable annotations) - required since Gradle 9 upgrade (PR #15365).
  5. Prefer JavaPluginExtension over deprecated JavaPluginConvention; destinationFile over outputFile on WriteProperties; avoid ConfigureUtil / old convention APIs.
  6. Tests need junit-platform-launcher on testRuntimeOnly (shared script adds it) - Gradle 9 requirement.
  7. Do not enable configuration cache or configure-on-demand in this repo without an issue-linked plan.
  8. evaluationDependsOn appears in BOM/docs scripts for a reason - do not cargo-cult it into random modules; it couples configuration order and slows builds.
Build Cacheability

The local build cache is enabled. Treat cacheability as a correctness constraint, not a later optimization.

RuleWhy / practice
Do not put absolute machine paths, especially base.dir, in Test.systemPropertiesThey poison cache keys across machines (#15483). The compiler's @Internal BaseDirArgumentProvider is the separate, required compile-time case.
Avoid doFirst and custom actions on cacheable tasksThey can make a task ineligible for the build cache. Prefer a dedicated task with declared inputs and outputs or model the I/O properly. Some tradeoffs are intentional: GroovyDoc compatibility with configuration cache and selected GroovyCompile doFirst actions in GrailsGradlePlugin.
Give compiler configuration and reports task-specific pathsOverlapping outputs disable caching. Use names such as grailsGroovyCompilerConfig-{taskName}.groovy and separate Checkstyle / CodeNarc report paths (#15532).
Do not use outputs.upToDateWhen to bypass work when it also prevents cache loadingModel inputs and outputs instead. Keep GSP outputs separate, for example gsp-classes/main versus webapp (#15537).
Normalize generated unstable files packed into jars or classpathsSbomPlugin uses normalization.runtimeClasspath.ignore("META-INF/sbom.json"). Add comparable normalization so unstable generated contents do not cascade cache misses.

Use Develocity experiments to prove a change: populate the cache, then delete task outputs (or clean) and rebuild - cacheable tasks should report FROM-CACHE. A plain second build with outputs still present usually reports UP-TO-DATE, which does not prove remote/local cache loading.


Adding a New Subproject (Checklist)

  1. Choose directory layout consistent with family (grails-foo/… or nested under existing tree).
  2. include 'grails-foo' (or nested name) in root settings.gradle.
  3. If path != default, set project(':grails-foo').projectDir = file('…').
  4. Copy a sibling build.gradle plugin/dependency skeleton; set group/ext.pom* as needed.
  5. Wire platform(project(':grails-bom')) or the correct variant BOM.
  6. If published: ensure publish plugin + BOM constraint inclusion (base BOM auto-discovers published projects with grails-publish plugins).
  7. If it has commands: plan CLI companion artifact (grails-plugin-cli), not runtime leakage.
  8. If test-example: use functional-test-config + external coordinates + substitution.
  9. Register in any root aggregators if required (docs, publish-root-config, CI matrices).
  10. Run:
    bash
    ./gradlew :grails-foo:compileGroovy :grails-foo:test :grails-foo:validateDependencyVersions

For importing an entire external plugin repository, use mono-repo-integration skill instead of this checklist alone.


Commands Cheatsheet

bash
# Always from the owning build root (usually repo root)
./gradlew :grails-core:compileGroovy
./gradlew :grails-core:test
./gradlew :grails-core:test --tests 'org.example.SomeSpec'
./gradlew :grails-core:validateDependencyVersions

# Build without tests
./gradlew build -PskipTests

# Style / analysis (see violation-fixer)
./gradlew :grails-core:codeStyle
./gradlew aggregateViolations

# Publish to ~/.m2 (maintainers / forge local cascade) - NOT what end-to-end uses
./gradlew publishAllToMavenLocal   # grails-gradle → root → forge

# Publish to build/local-maven for end-to-end (and forge TestCaseMavenRepo consumers)
(cd grails-gradle && ./gradlew publishAllPublicationsToTestCaseMavenRepoRepository)
./gradlew publishAllPublicationsToTestCaseMavenRepoRepository

# Force re-run tests
./gradlew :module:test --rerun-tasks
# or
DO_NOT_CACHE_TESTS=1 ./gradlew :module:test

# Parallelism override / flake bisect
./gradlew :module:test -PmaxTestParallel=1
./gradlew :module:test -PtestBisect

# Memory - org.gradle.jvmargs sizes the daemon, so a bare -Xmx here is ignored
export GRADLE_OPTS='-Dorg.gradle.jvmargs=-Xmx4G'

Work in grails-gradle or grails-forge only with that directory's ./gradlew.

Develocity: https://develocity.apache.org - build scans publish when authenticated; remote cache push is CI-only.


Anti-Patterns (Reject These)

Do notDo instead
Apply Spring Dependency Management pluginplatform / enforcedPlatform + bom-property-overrides
Apply Spring Dependency Management outside grails-test-examples/spring-dependency-managementNative platforms + bom-property-overrides
Hardcode versions in module dependencies {}BOM maps in root dependencies.gradle
Introduce libs.versions.toml catalogsKeep dependencies.gradle maps
Silence validateDependencyVersions without commentFix the mismatch (usually bump BOM if transitive is newer; else remove force / align platforms / document override)
Root ./gradlew test after a one-module edit./gradlew :module:test
Enable configuration cache "because Gradle says so"Leave off until #15497
Resolve configuration.files in configureEachDefer to execution / providers
Add an absolute machine path to Test.systemPropertiesUse portable task inputs; keep compiler-only base.dir in its @Internal argument provider
Give multiple tasks the same compiler config or report output pathMake every output path task-specific
Use outputs.upToDateWhen in a way that prevents cache loadingDeclare inputs and outputs or use a dedicated task
Pack unstable generated files without classpath normalizationAdd an explicit normalization ignore when appropriate
Duplicate CompilePlugin settings in module scriptsTrust convention plugins
Invent new plugin IDs without build-logic registrationAdd descriptor + tests in build-logic
Bump one wrapper onlySync all wrapper locations
Put CLI-only deps on runtime classpathCLI companion artifact / cli* configurations
buildscript { classpath … } for plugins already on pluginManagementplugins { id '…' }
Kotlin DSL for a one-off module in a Groovy DSL repoGroovy DSL build.gradle
Wildcard imports in buildsrc GroovyExplicit imports (same as app code style)
Add repositories {} in a subprojectRoot/settings repo management (FAIL_ON_PROJECT_REPOS)
includeBuild the root into end-to-endPublish to build/local-maven via publishAllPublicationsToTestCaseMavenRepoRepository
Use publishAllToMavenLocal to feed end-to-endThat fills ~/.m2; end-to-end reads <repo>/build/local-maven
Bump legacy-g7-command-plugin wrapper to Gradle 9Leave it on the Grails 7-pinned Gradle 8.x
Mix Gradle-embedded Groovy 4 pins into app Groovy 5 BOMKeep gradleBom* vs bom* maps separate

Gradle 9 Doc Notes (Useful, Not Absolute)

Use official docs for API signatures and deprecations (pin URLs to the version you are bumping toward):

Docs say X - we do Y
Gradle docs leanThis repo
Turn on configuration cacheOff (#15497)
Version catalogs (libs.versions.toml)dependencies.gradle maps + published BOM
enforcedPlatform is dangerous for librariesUsed deliberately for Micronaut-variant BOMs + validator
Prefer toolchains everywhereoptions.release from javaVersion=21 via CompilePlugin (toolchains optional elsewhere)
JVM Test Suite plugin for extra suitesExisting test / integrationTest + shared gradle/*-test-config.gradle
Avoid afterEvaluateStill present in plugins - change carefully; prefer plugins.withId for new code
Configure on demandExplicitly disabled (Gradle #9489)

Removed/deprecated APIs AI still emits - reject on sight in new code: jcenter(), Project.exec / Project.javaexec (use injected ExecOperations), JavaPluginConvention, ConfigureUtil, old convention APIs, WriteProperties.outputFile (use destinationFile), bare tasks.create / eager getByName when register/named suffice.

Repositories

GrailsRepoSettingsPlugin configures settings-level repos and RepositoriesMode.FAIL_ON_PROJECT_REPOS. Adding repositories { mavenCentral() } inside a random subproject will fail the build. Fix repo needs in settings / the repo settings plugin, not per-module.


Lessons From Recent 8.0.x Gradle PRs

PRTakeaway
#15467Spring DM removed; platforms + bom-property-overrides
#15483Cacheable tasks need portable inputs; avoid absolute test properties and normalize packed unstable SBOM metadata
#15365Gradle 9.4 API cleanup; caching annotations; junit launcher
#15532Overlapping task outputs disable caching; use per-task compiler and report paths
#15537Bad outputs.upToDateWhen predicates block cache loads; keep GSP output directories distinct
#15672 / #15763Wrapper multi-location sync discipline
#15730Prefer Boot BOM inheritance over duplicate pins
#15686 / #15687code-style / analysis / jacoco / violation aggregation plugins
#15948CLI split from runtime; companion artifacts
#15963Groovy compile config script / annotation order
#16006processResources tokens must be task inputs
#16009afterEvaluate ordering vs configuration observation
#16076No compile classpath probes at GroovyCompile configuration time
#16069Dependency substitution for functional tests is hot-path config work - keep it cheap and cached
#16078Keep CLI/test-tier deps off the production runtime classpath; do not ship unfixed native tooling (Jansi)

When fixing a new Gradle failure, search merged PR titles for the exception text before inventing a workaround.


Agent Quality Bar

Strong 8.0.x Gradle PRs are small, sibling-consistent, and evidence-backed:

  • State the Problem, Fix, Why, and Verification in the PR or handoff.
  • Match the closest existing module, script, or convention plugin before adding a new pattern.
  • Avoid drive-by reformatting, dependency churn, or unrelated modernization.
  • Verify with the narrowest commands that cover the changed project: compile, targeted tests, and dependency validation as applicable.
  • For grails-gradle, include the relevant TestKit coverage.
  • Use dual review when available, especially for build, dependency, and publishing changes.
  • Report exact commands and results. Evidence beats confidence.

Files to Read First (By Task)

TaskRead
New library moduleSibling build.gradle, settings.gradle include section, CompilePlugin.groovy
Version bumpdependencies.gradle, maybe Spring Boot BOM notes in PR #15730
Wrapper bumpgradle/wrapper/gradle-wrapper.properties comment checklist
Test wiringgradle/test-config.gradle, gradle/functional-test-config.gradle
BOM / platformgrails-bom/base/build.gradle, GrailsDependencyValidatorPlugin.groovy
App plugin behaviorgrails-gradle/plugins/.../GrailsGradlePlugin.groovy
Convention plugin changebuild-logic/plugins/... + its Spock tests
PublishingPublishPlugin.groovy, gradle/publish-root-config.gradle
Style gatesviolation-fixer skill + code-style plugins

Definition of Done (Gradle Change)

  • Matches sibling module patterns (plugins, group, platform, apply scripts)
  • No hardcoded versions that belong in dependencies.gradle
  • validateDependencyVersions clean for touched modules (or documented override)
  • Scoped Gradle verify command green (:module:compileGroovy, :module:test, plugin TestKit as applicable)
  • Wrapper/version sync complete if Gradle version changed
  • No configuration-time resolution / nested afterEvaluate hazards introduced
  • No absolute machine paths in Test.systemProperties; compiler base.dir remains isolated in BaseDirArgumentProvider
  • No overlapping task outputs; classpath normalization considered for packed generated files
  • Apache headers on new files
  • User-facing behavior documented if it affects app builds (grails-doc)
  • For commit-ready work, use violation-fixer to run the AGENTS.md gate: ./gradlew clean aggregateViolations :grails-test-report:check --continue. This is not required merely to read this skill.

If you only remember three things: copy siblings, BOM owns versions, never resolve configurations while configuring tasks.

© apache, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .agents/skills/gradle-developer of apache/grails-core.

Open the folder on GitHubat commit 3d6db18

Compare with similar skills

Grails Gradle Developer next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Grails Gradle Developer compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Grails Gradle Developer this skillapache/grails-core2.9k—~11kAutomated safety check: PassApache-2.0
Linea Dependency MaintenanceConsensys-Incorporated/linea-attestation-registry1771 repos~3.7kAutomated safety check: WarnMIT
Pnpm Engineteambit/bit18k—~1.9kAutomated safety check: PassCustom licence
Dependabot Alerts Updatelivesession/xyd114—~2kAutomated safety check: PassMIT
Monorepo Tooling and Dependenciespierrecomputer/pierre6.2k—~1.1kAutomated safety check: PassApache-2.0
Dependency Updateschampionswimmer/TwoFac129—~1kAutomated safety check: PassNone

Similar skills

  • Linea Dependency Maintenance

    Consensys-Incorporated/linea-attestation-registry

    Safely plan and execute dependency maintenance for JavaScript/TypeScript (npm, pnpm) and GitHub Actions, including npm lockfiles, pnpm workspaces, catalogs, overrides, SHA-pinned action versions…

    177 GitHub starsUsed in 1 repo~3.7k tokens
    DevelopmentAuto-check: warnings
  • Pnpm Engine

    teambit/bit

    Work on the pnpm Rust engine (@pnpm/napi, the pacquet crates) that bit install runs through.

    18k GitHub stars~1.9k tokensUpdated today
    DevelopmentAuto-check passed
  • Automatically fetch and fix Dependabot security alerts by querying GitHub REST API for open alerts, identifying vulnerable packages, researching secure versions, and updating package.json files…

    114 GitHub stars~2k tokensUpdated 15 days ago
    DevelopmentAuto-check passed
  • Sets one monorepo's rules for toolchain pins, pnpm package operations, the shared dependency catalog and moon tasks, so the agent adds versions and scripts the right way.

    6.2k GitHub stars~1.1k tokensUpdated yesterday
    DevelopmentAuto-check passed
  • Dependency Updates

    championswimmer/TwoFac

    Audit repo dependencies by default and only apply library upgrades when explicitly requested.

    129 GitHub stars~1k tokensUpdated 4 mo ago
    DevelopmentAuto-check passed
  • Dependabot PR Review

    kernitus/BukkitOldCombatMechanics

    A skill your agent uses for Dependabot PRs, dependency bumps, Gradle or Maven dependency updates, GitHub Actions updates, dependency changelog/licence/release-note review, JVM/classfile checks, and…

    223 GitHub stars~882 tokensUpdated 3 days ago
    DevelopmentAuto-check passed

More from apache/grails-core

All 9 skills in this repo
  • Grails Developer Guide

    apache/grails-core

    Guides building Grails web applications and REST APIs with GORM, controllers, services, views, plugins and Spock and Geb testing.

    2.9k GitHub stars~4.9k tokensUpdated today
    Auto-check passed
  • Groovy 5 Developer Guide

    apache/grails-core

    Guidance for Groovy 5 work in Grails projects: syntax, closures, traits, DSLs, metaprogramming, Spock tests, static compilation and Java 21 integration.

    2.9k GitHub stars~3k tokensUpdated today
    Auto-check passed
  • Guides changes to the grails-data-hibernate7 module, covering domain binding, Hibernate 5 to 7 migration work, generators and integration specs.

    2.9k GitHub stars~1.8k tokensUpdated today
    Auto-check passed
  • Guide for writing modern Java 21 in a Grails and Groovy codebase: records, sealed classes, pattern matching, text blocks and how Java works alongside Groovy.

    2.9k GitHub stars~1.9k tokensUpdated today
    Auto-check passed
  • Grails Test Fixer

    apache/grails-core

    Guides running, reviewing and fixing test failures across grails-core modules with Gradle, including targeted runs and the aggregate HTML and Markdown reports.

    2.9k GitHub stars~1.1k tokensUpdated today
    Auto-check passed
  • Grails Violation Fixer

    apache/grails-core

    Guide to running, reading and fixing code style and analysis violations in grails-core with CodeNarc, Checkstyle, PMD, SpotBugs, Spotless and JaCoCo through Gradle.

    2.9k GitHub stars~3.9k tokensUpdated today
    Auto-check passed

Works with

Questions about Grails Gradle Developer

What does Grails Gradle Developer do?

Guides Gradle 9 build changes in apache/grails-core on the 8.0.x line, favoring the repo's convention plugins, BOM platforms and patterns over generic Gradle advice. x.gradle files, reuse existing convention plugins instead of inline configuration, and treat the official Gradle docs as secondary, because the monorepo deliberately differs, for example by leaving the configuration cache off and using a custom BOM validator.

When should I use Grails Gradle Developer?

Grails Gradle Developer fits situations like: editing build.gradle, settings.gradle or anything under build-logic; adding or renaming a module in the Grails monorepo; bumping a dependency version or the Gradle wrapper; diagnosing configuration-cache, dependency-resolution or task-graph failures.

How do I install Grails Gradle Developer in Claude Code?

Run `npx skills add apache/grails-core --skill gradle-developer -a claude-code`. Or copy the skill folder (.agents/skills/gradle-developer in apache/grails-core) into .claude/skills/gradle-developer in your project. Claude Code loads it when a task matches its description.

How do I install Grails Gradle Developer in Codex?

Run `npx skills add apache/grails-core --skill gradle-developer -a codex`. Or copy the skill folder (.agents/skills/gradle-developer in apache/grails-core) into .agents/skills/gradle-developer in your project. Codex loads it when a task matches its description.

Can I use Grails Gradle Developer in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add apache/grails-core --skill gradle-developer -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/gradle-developer, .gemini/skills/gradle-developer, .github/skills/gradle-developer and .opencode/skills/gradle-developer in your project.

What does Grails Gradle Developer need to run?

Going by SKILL.md and its folder, Grails Gradle Developer needs the command-line tools its instructions call (gradle). Our summary lists: A checkout of apache/grails-core on the 8.0.x line.

Does Grails Gradle Developer access the network?

SKILL.md names 2 domains. In commands or code: develocity.apache.org; the agent is likely to contact it when it follows the instructions. As links in the text: docs.gradle.org. This is read from the text; nothing was executed.

Is Grails Gradle Developer safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Grails Gradle Developer use?

Grails Gradle Developer is published under the Apache-2.0 licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Grails Gradle Developer use?

About 11k tokens (SKILL.md is roughly 45k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Grails Gradle Developer?

Skills that share tags, products or a category with Grails Gradle Developer: Linea Dependency Maintenance (Consensys-Incorporated/linea-attestation-registry, 177 stars), Pnpm Engine (teambit/bit, 18k stars), Dependabot Alerts Update (livesession/xyd, 114 stars) and Monorepo Tooling and Dependencies (pierrecomputer/pierre, 6.2k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Grails Gradle Developer?

apache (a GitHub organization) maintains it in apache/grails-core, which has 2,934 GitHub stars. The repository holds 9 skills in this directory. The repository was last updated on October 7, 2026.

Source: apache/grails-core on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.