Progen
sivaprasadreddy/sivalabs-agent-skills
A skill your agent uses when the user wants to create/generate/scaffold a new Spring Boot project (Maven or Gradle, REST API / Web App / Spring Boot + Angular full stack).
Guides building Grails web applications and REST APIs with GORM, controllers, services, views, plugins and Spock and Geb testing.
$ npx skills add apache/grails-core --skill grails-developer -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install apache/grails-core grails-developer --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/apache/grails-core.git skills-src && mkdir -p .claude/skills && cp -r skills-src/grails-skills/developer/skills/grails-developer .claude/skills/grails-developer && rm -rf skills-srcUse ~/.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/
Install the "grails-developer" agent skill from https://github.com/apache/grails-core/tree/8.0.x/grails-skills/developer/skills/grails-developer into .claude/skills/grails-developer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "grails-developer", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/apache/grails-core/tree/8.0.x/grails-skills/developer/skills/grails-developerType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add apache/grails-core --skill grails-developer -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install apache/grails-core grails-developer --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/apache/grails-core.git skills-src && mkdir -p .agents/skills && cp -r skills-src/grails-skills/developer/skills/grails-developer .agents/skills/grails-developer && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "grails-developer" agent skill from https://github.com/apache/grails-core/tree/8.0.x/grails-skills/developer/skills/grails-developer into .agents/skills/grails-developer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "grails-developer", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add apache/grails-core --skill grails-developer -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install apache/grails-core grails-developer --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/apache/grails-core.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/grails-skills/developer/skills/grails-developer .cursor/skills/grails-developer && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "grails-developer" agent skill from https://github.com/apache/grails-core/tree/8.0.x/grails-skills/developer/skills/grails-developer into .cursor/skills/grails-developer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "grails-developer", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/apache/grails-core.git --path grails-skills/developer/skills/grails-developer--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add apache/grails-core --skill grails-developer -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install apache/grails-core grails-developer --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/apache/grails-core.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/grails-skills/developer/skills/grails-developer .gemini/skills/grails-developer && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "grails-developer" agent skill from https://github.com/apache/grails-core/tree/8.0.x/grails-skills/developer/skills/grails-developer into .gemini/skills/grails-developer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "grails-developer", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install apache/grails-core grails-developerInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add apache/grails-core --skill grails-developer -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/apache/grails-core.git skills-src && mkdir -p .github/skills && cp -r skills-src/grails-skills/developer/skills/grails-developer .github/skills/grails-developer && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "grails-developer" agent skill from https://github.com/apache/grails-core/tree/8.0.x/grails-skills/developer/skills/grails-developer into .github/skills/grails-developer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "grails-developer", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add apache/grails-core --skill grails-developer -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install apache/grails-core grails-developer --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/apache/grails-core.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/grails-skills/developer/skills/grails-developer .opencode/skills/grails-developer && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "grails-developer" agent skill from https://github.com/apache/grails-core/tree/8.0.x/grails-skills/developer/skills/grails-developer into .opencode/skills/grails-developer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "grails-developer", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
grails-developerGuides building Grails web applications and REST APIs with GORM, controllers, services, views, plugins and Spock and Geb testing.
This skill is a practical reference for Grails development. It covers GORM domain classes with constraints, relationships, dynamic finders and transactions, controllers including REST controllers, command objects and content negotiation, and services, along with the views the framework supports: GSP, JSON and Markup. Code samples are in Groovy, and a project structure outline shows the grails-app layout.
Testing is covered with Spock specifications and Geb functional tests, and further topics include plugins, security, caching, database migrations, configuration, internationalization, async programming, performance and deployment to containers or cloud platforms. It lists the stack Grails is built on: Spring Boot 4.1.x, Spring Framework 7.0.x, Groovy 5.1.x, Gradle 9.7 or later, Spock 2.4 and Jakarta EE 10 (migrated from javax), with Micronaut optional through a plugin.
Read from SKILL.md and the folder at commit 4deae57. It shows what the files ask for, not the result of running them.
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.
No scripts in the folder and no shell commands in SKILL.md (its code samples are groovy, html, yaml and bash).
From the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
grails.apache.orggroovy-lang.orgspockframework.orggroovy.apache.orgFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Grails Developer Guide loads about 4.9k tokens when it runs. Until then it costs about 44 tokens; SKILL.md has 379 words of instructions outside code blocks.
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.
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.
The full file from apache/grails-core at commit 4deae57, republished under its Apache-2.0 licence (© apache). 379 words, ~4,947 tokens.
.claude/skills/grails-developer/SKILL.md (or your agent's skills folder).<!--
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.
-->
Activate this skill when developing with Grails, including:
Grails is built on:
grails-micronaut pluginmyapp/
├── grails-app/
│ ├── conf/ # Configuration
│ │ ├── application.yml # Main config
│ │ ├── logback-spring.xml # Logging config
│ │ └── spring/resources.groovy # Spring bean definitions
│ ├── controllers/ # Request handlers
│ ├── domain/ # GORM domain classes
│ ├── i18n/ # Message bundles
│ ├── init/ # Bootstrap classes
│ ├── services/ # Business logic
│ ├── taglib/ # Custom GSP tags
│ ├── utils/ # Utility classes
│ └── views/ # GSP templates
├── src/
│ ├── main/groovy/ # Additional Groovy classes
│ ├── main/java/ # Java classes
│ ├── test/groovy/ # Test specifications
│ └── integration-test/groovy/ # Integration test specifications
├── build.gradle # Build configuration
└── gradle.properties # Project propertiesclass Book {
String title
String author
Date datePublished
Integer pages
static constraints = {
title blank: false, maxSize: 255
author blank: false
datePublished nullable: true
pages min: 1, nullable: true
}
static mapping = {
table 'books'
title column: 'book_title'
datePublished type: 'date'
}
}class Author {
String name
static hasMany = [books: Book]
static mapping = {
books cascade: 'all-delete-orphan'
}
}
class Book {
String title
static belongsTo = [author: Author]
}
// Many-to-Many
class Book {
static hasMany = [categories: Category]
static belongsTo = Category
}
class Category {
String name
static hasMany = [books: Book]
}// Dynamic finders
Book.findByTitle("Grails Guide")
Book.findAllByAuthorLike("%Smith%")
Book.findByTitleAndAuthor("Guide", "Smith")
Book.countByPagesGreaterThan(100)
// Where queries
Book.where {
title =~ "%Grails%" && pages > 100
}.list()
// Criteria queries
Book.withCriteria {
like('title', '%Grails%')
gt('pages', 100)
order('datePublished', 'desc')
maxResults(10)
}
// HQL queries
Book.executeQuery(
"from Book b where b.author.name = :name",
[name: 'Smith']
)
// Detached criteria (reusable)
def criteria = Book.where {
pages > 100
}
criteria.list()
criteria.count()// In services (default transactional)
@Transactional
class BookService {
def saveBook(Book book) {
book.save(failOnError: true)
}
}
// Manual transaction control
Book.withTransaction { status ->
def book = new Book(title: "Test")
book.save()
if (someCondition) {
status.setRollbackOnly()
}
}class BookController {
BookService bookService
static allowedMethods = [save: 'POST', update: 'PUT', delete: 'DELETE']
def index() {
respond Book.list(), model: [bookCount: Book.count()]
}
def show(Long id) {
respond Book.get(id)
}
def create() {
respond new Book(params)
}
def save(Book book) {
if (book.hasErrors()) {
respond book.errors, view: 'create'
return
}
bookService.save(book)
redirect action: 'show', id: book.id
}
def edit(Long id) {
respond Book.get(id)
}
def update(Book book) {
if (book.hasErrors()) {
respond book.errors, view: 'edit'
return
}
bookService.save(book)
redirect action: 'show', id: book.id
}
def delete(Long id) {
bookService.delete(id)
redirect action: 'index'
}
}import grails.rest.RestfulController
class BookController extends RestfulController<Book> {
static responseFormats = ['json', 'xml']
BookController() {
super(Book)
}
// Override to customize
@Override
protected Book queryForResource(Serializable id) {
Book.where { id == id && active == true }.find()
}
}class BookCommand implements Validateable {
String title
String author
Integer pages
static constraints = {
title blank: false
author blank: false
pages min: 1, nullable: true
}
}
class BookController {
def save(BookCommand cmd) {
if (cmd.hasErrors()) {
respond cmd.errors
return
}
// Process valid command
}
}class BookController {
def show(Long id) {
def book = Book.get(id)
respond book // Auto-negotiates based on Accept header
}
}
// Or explicit
def show(Long id) {
def book = Book.get(id)
withFormat {
html { render view: 'show', model: [book: book] }
json { render book as JSON }
xml { render book as XML }
}
}import grails.gorm.transactions.Transactional
@Transactional
class BookService {
def findByTitle(String title) {
Book.findByTitle(title)
}
def save(Book book) {
book.save(failOnError: true)
}
@Transactional(readOnly = true)
def list(Map params) {
Book.list(params)
}
def delete(Long id) {
Book.get(id)?.delete()
}
}import grails.events.annotation.Publisher
import grails.events.annotation.Subscriber
class BookService {
@Publisher
def save(Book book) {
book.save()
// Automatically publishes 'book.saved' event
}
}
class NotificationService {
@Subscriber('book.saved')
def onBookSaved(Book book) {
// Handle event
log.info "Book saved: ${book.title}"
}
}import grails.async.Promise
import static grails.async.Promises.*
class BookService {
Promise<Book> findAsync(Long id) {
task {
Book.get(id)
}
}
def processBooks() {
def p1 = task { Book.findAllByActive(true) }
def p2 = task { Author.list() }
waitAll(p1, p2)
// Both complete
}
}<!-- grails-app/views/book/list.gsp -->
<!DOCTYPE html>
<html>
<head>
<title>Books</title>
<asset:stylesheet src="application.css"/>
</head>
<body>
<h1>Books (${bookCount})</h1>
<g:each in="${bookList}" var="book">
<div class="book">
<h2>${book.title}</h2>
<p>By ${book.author}</p>
<g:link action="show" id="${book.id}">View</g:link>
</div>
</g:each>
<g:if test="${bookList.empty}">
<p>No books found.</p>
</g:if>
<g:paginate total="${bookCount}"/>
<asset:javascript src="application.js"/>
</body>
</html><!-- Links -->
<g:link controller="book" action="show" id="${book.id}">View</g:link>
<g:createLink action="list"/>
<!-- Forms -->
<g:form action="save">
<g:textField name="title" value="${book?.title}"/>
<g:textArea name="description" value="${book?.description}"/>
<g:select name="category" from="${categories}" optionKey="id" optionValue="name"/>
<g:checkBox name="active" value="${book?.active}"/>
<g:submitButton name="submit" value="Save"/>
</g:form>
<!-- Conditionals -->
<g:if test="${condition}">...</g:if>
<g:elseif test="${other}">...</g:elseif>
<g:else>...</g:else>
<!-- Iteration -->
<g:each in="${items}" var="item" status="i">
${i}: ${item.name}
</g:each>
<!-- Rendering -->
<g:render template="bookRow" model="[book: book]"/>
<g:render template="bookRow" collection="${books}" var="book"/>
<!-- Security (with Spring Security plugin) -->
<sec:ifLoggedIn>Welcome, ${sec.username()}</sec:ifLoggedIn>
<sec:ifNotLoggedIn><g:link controller="login">Login</g:link></sec:ifNotLoggedIn>// grails-app/views/book/show.gson
import myapp.Book
model {
Book book
}
json {
id book.id
title book.title
author book.author
datePublished book.datePublished?.format('yyyy-MM-dd')
_links {
self {
href "/books/${book.id}"
}
}
}<!-- grails-app/views/layouts/main.gsp -->
<!DOCTYPE html>
<html>
<head>
<title><g:layoutTitle default="My App"/></title>
<asset:stylesheet src="application.css"/>
<g:layoutHead/>
</head>
<body>
<nav><!-- Navigation --></nav>
<main>
<g:layoutBody/>
</main>
<footer><!-- Footer --></footer>
<asset:javascript src="application.js"/>
</body>
</html>
<!-- Use in views -->
<html>
<head>
<meta name="layout" content="main"/>
<title>Books</title>
</head>
<body>
<!-- Page content -->
</body>
</html>class AuthInterceptor {
AuthInterceptor() {
matchAll()
.excludes(controller: 'login')
.excludes(controller: 'error')
}
boolean before() {
if (!session.user) {
redirect(controller: 'login')
return false
}
true
}
boolean after() {
// After action executes
true
}
void afterView() {
// After view renders
}
}class BookTagLib {
static namespace = 'book'
static defaultEncodeAs = [taglib: 'html']
def formatTitle = { attrs, body ->
def title = attrs.title ?: body()
out << "<span class='book-title'>${title}</span>"
}
def ifHasBooks = { attrs, body ->
if (Book.count() > 0) {
out << body()
}
}
}
// Usage in GSP
<book:formatTitle title="${book.title}"/>
<book:ifHasBooks>
<p>We have books!</p>
</book:ifHasBooks>grails:
profile: web
codegen:
defaultPackage: myapp
gorm:
reactor:
events: false
mime:
types:
json: ['application/json', 'text/json']
xml: ['text/xml', 'application/xml']
environments:
development:
dataSource:
dbCreate: create-drop
url: jdbc:h2:mem:devDb
test:
dataSource:
dbCreate: update
url: jdbc:h2:mem:testDb
production:
dataSource:
dbCreate: none
url: jdbc:postgresql://localhost/myapp
driverClassName: org.postgresql.Driver
dialect: org.hibernate.dialect.PostgreSQLDialect
properties:
jmxEnabled: true
initialSize: 5
maxActive: 50
server:
port: 8080
servlet:
context-path: /myapp// grails-app/controllers/myapp/UrlMappings.groovy
class UrlMappings {
static mappings = {
// Default
"/$controller/$action?/$id?(.$format)?" {
constraints {
// apply constraints here
}
}
// REST resources
"/api/books"(resources: 'book')
// Custom mappings
"/books/$id"(controller: 'book', action: 'show')
"/search"(controller: 'book', action: 'search')
// Named URL mappings
name bookShow: "/books/$id" {
controller = 'book'
action = 'show'
}
// Error pages
"500"(view: '/error')
"404"(view: '/notFound')
}
}import grails.testing.web.controllers.ControllerUnitTest
import spock.lang.Specification
class BookControllerSpec extends Specification
implements ControllerUnitTest<BookController> {
def setup() {
controller.bookService = Mock(BookService)
}
void "index returns list of books"() {
given:
def books = [new Book(title: "Test")]
controller.bookService.list(_) >> books
when:
controller.index()
then:
model.bookList == books
view == '/book/index'
}
void "show returns 404 for missing book"() {
when:
controller.show(999)
then:
response.status == 404
}
}import grails.testing.services.ServiceUnitTest
import spock.lang.Specification
class BookServiceSpec extends Specification
implements ServiceUnitTest<BookService> {
void "save persists book"() {
given:
def book = new Book(title: "Test", author: "Author")
when:
def result = service.save(book)
then:
result.id != null
Book.count() == 1
}
}import grails.testing.gorm.DomainUnitTest
import spock.lang.Specification
class BookSpec extends Specification
implements DomainUnitTest<Book> {
void "title cannot be blank"() {
when:
domain.title = ""
domain.author = "Test"
then:
!domain.validate(['title'])
domain.errors['title'].code == 'blank'
}
void "valid book passes validation"() {
when:
domain.title = "Valid Title"
domain.author = "Author"
then:
domain.validate()
}
}import grails.testing.mixin.integration.Integration
import grails.gorm.transactions.Rollback
import spock.lang.Specification
@Integration
@Rollback
class BookServiceIntegrationSpec extends Specification {
BookService bookService
void "save and retrieve book"() {
given:
def book = new Book(title: "Integration Test", author: "Tester")
when:
bookService.save(book)
def found = Book.findByTitle("Integration Test")
then:
found != null
found.author == "Tester"
}
}import geb.spock.ContainerGebSpec
import grails.testing.mixin.integration.Integration
@Integration
class BookFunctionalSpec extends ContainerGebSpec {
void "can view book list"() {
when:
go '/book/index'
then:
title == 'Book List'
$('h1').text() == 'Books'
}
void "can create new book"() {
when:
go '/book/create'
$('form').title = 'New Book'
$('form').author = 'Test Author'
$('input[type=submit]').click()
then:
$('h1').text().contains('New Book')
}
}// build.gradle
// Spring Security
implementation 'org.apache.grails.plugins:grails-spring-security-core:7.0.1'
// Database Migration (Liquibase)
implementation 'org.apache.grails.plugins:grails-database-migration:5.0.1'
// Caching
implementation 'org.apache.grails.plugins:grails-cache:7.0.0'
// Async support
implementation 'org.apache.grails.plugins:grails-async:7.0.0'
// Fields plugin for form rendering
implementation 'org.apache.grails.plugins:grails-fields:7.0.0'
// Asset Pipeline
runtimeOnly 'cloud.wondrify:asset-pipeline-grails'// grails-app/conf/application.groovy
grails.plugin.springsecurity.userLookup.userDomainClassName = 'myapp.User'
grails.plugin.springsecurity.userLookup.authorityJoinClassName = 'myapp.UserRole'
grails.plugin.springsecurity.authority.className = 'myapp.Role'
grails.plugin.springsecurity.controllerAnnotations.staticRules = [
[pattern: '/', access: ['permitAll']],
[pattern: '/error', access: ['permitAll']],
[pattern: '/index', access: ['permitAll']],
[pattern: '/admin/**', access: ['ROLE_ADMIN']],
[pattern: '/api/**', access: ['isAuthenticated()']],
]# Run application
./gradlew bootRun
# Run tests
./gradlew test # All tests
./gradlew test --tests "BookServiceSpec" # Single spec
./gradlew test --tests "*Spec.save*" # Pattern match
./gradlew integrationTest # Integration tests
# Build
./gradlew build # Build with tests
./gradlew bootJar # Executable JAR
./gradlew bootWar # WAR file
# Code quality
./gradlew check # Run all verification tasks
# Clean
./gradlew clean@GrailsCompileStatic on controllers, services, and domain classes.<g:form useToken="true">.ControllerUnitTest.@GrailsCompileStatic or @CompileStatic for type safety and performance.© 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
Just SKILL.md in grails-skills/developer/skills/grails-developer of apache/grails-core.
Open the folder on GitHubat commit 4deae57
Grails Developer Guide 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.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Grails Developer Guide this skillapache/grails-core | 2.9k | — | ~4.9k | Automated safety check: Pass | Apache-2.0 | |
| Progensivaprasadreddy/sivalabs-agent-skills | 188 | — | ~2.7k | Automated safety check: Notes | MIT | |
| Java ArchitectJeffallan/claude-skills | 12k | — | ~1.5k | Automated safety check: Pass | MIT | |
| Spring Boot EngineerJeffallan/claude-skills | 12k | — | ~1.9k | Automated safety check: Pass | MIT | |
| Senior Javabenchflow-ai/skillsbench | 1.8k | — | ~5k | Automated safety check: Pass | MIT | |
| Java Patternssoftspark/ai-toolkit | 179 | — | ~3.4k | Automated safety check: Pass | Apache-2.0 |
sivaprasadreddy/sivalabs-agent-skills
A skill your agent uses when the user wants to create/generate/scaffold a new Spring Boot project (Maven or Gradle, REST API / Web App / Spring Boot + Angular full stack).
Jeffallan/claude-skills
Builds Spring Boot 3.x services on Java 21 with domain-driven design, WebFlux, JPA tuning and Spring Security using OAuth2 and JWT, verified by Maven or Gradle builds.
Jeffallan/claude-skills
Builds Spring Boot 3.x services with REST controllers, Spring Data JPA, Spring Security 6, WebFlux and Spring Cloud, verified by tests and Actuator health checks.
benchflow-ai/skillsbench
World-class Java and Spring Boot development skill for enterprise applications, microservices, and cloud-native systems.
softspark/ai-toolkit
Java: Spring Boot, CompletableFuture, records, sealed types, JPA/Hibernate, virtual threads.
softspark/ai-toolkit
Java coding rules: style, patterns, security, testing. An agent skill from softspark/ai-toolkit.
apache/grails-core
Guidance for Groovy 5 work in Grails projects: syntax, closures, traits, DSLs, metaprogramming, Spock tests, static compilation and Java 21 integration.
apache/grails-core
Guides changes to the grails-data-hibernate7 module, covering domain binding, Hibernate 5 to 7 migration work, generators and integration specs.
apache/grails-core
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.
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.
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.
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.
Works with
Categories
Guides building Grails web applications and REST APIs with GORM, controllers, services, views, plugins and Spock and Geb testing. This skill is a practical reference for Grails development. It covers GORM domain classes with constraints, relationships, dynamic finders and transactions, controllers including REST controllers, command objects and content negotiation, and services, along with the views the framework supports: GSP, JSON and Markup.
Grails Developer Guide fits situations like: building a CRUD or REST application with Grails; modeling data with GORM domain classes and relationships; writing Spock specifications or Geb functional tests; configuring Grails plugins, security or caching.
Run `npx skills add apache/grails-core --skill grails-developer -a claude-code`. Or copy the skill folder (grails-skills/developer/skills/grails-developer in apache/grails-core) into .claude/skills/grails-developer in your project. Claude Code loads it when a task matches its description.
Run `npx skills add apache/grails-core --skill grails-developer -a codex`. Or copy the skill folder (grails-skills/developer/skills/grails-developer in apache/grails-core) into .agents/skills/grails-developer in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add apache/grails-core --skill grails-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/grails-developer, .gemini/skills/grails-developer, .github/skills/grails-developer and .opencode/skills/grails-developer in your project.
SKILL.md names no scripts, command-line tools or credentials: Grails Developer Guide is instructions for the agent only. Our summary lists: A Grails project built with Gradle.
SKILL.md names 4 domains. As links in the text: grails.apache.org, groovy-lang.org, spockframework.org and groovy.apache.org. This is read from the text; nothing was executed.
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.
Grails Developer Guide 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.
About 4.9k tokens (SKILL.md is roughly 20k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Grails Developer Guide: Progen (sivaprasadreddy/sivalabs-agent-skills, 188 stars), Java Architect (Jeffallan/claude-skills, 12k stars), Spring Boot Engineer (Jeffallan/claude-skills, 12k stars) and Senior Java (benchflow-ai/skillsbench, 1.8k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
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 8, 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.